Redis作为高性能的内存数据库,在缓存查询中非常实用。核心技巧包括使用KEYS命令快速查找键、使用SCAN渐进式扫描避免阻塞、使用HASH存储对象数据、LIST实现队列、SET集合去重、SORTED SET排序分页,以及PIPELINE批量查询减少网络开销。示例代码:redis-cli中执行KEYS "user:*"快速列出所有用户键;使用HGETALL user:1获取用户完整信息;LPUSH queue:item 入队,RPOP出队;SADD tags:java "spring"添加标签;ZADD rank 100 user1 排序;PIPELINE exec批量发送命令。
来源1
在Redis中,查询技巧的第一条就是善用KEYS和SCAN。KEYS * 会返回所有键,但在大key量时会阻塞服务器,所以推荐SCAN,它是增量迭代的,不会阻塞。比如scan 0 match user:* count 100,每次返回游标和部分结果,直到游标为0。
来源2
缓存查询时,HASH类型超级好用。把对象拆成field-value存入一个hash,比如用户id作为key,name、age等作为field。查询时HGET user:123 name,速度飞快,比存JSON字符串快多了。HMSET user:123 name "张三" age 25。
来源3
LIST适合队列场景,RPUSH mylist item1 item2 右推入,LPOP左弹出,实现任务队列。BRPOPLPUSH source dest 0 阻塞弹出并推到另一个list,原子性强,查询时LLEN检查长度,LRANGE 0 -1获取全部。
来源4
SET集合用于唯一性,比如用户标签SADD user:123 tag1 tag2,SISMEMBER检查是否存在,SUNION合并多个set。查询技巧:用SCARD统计成员数,SMEMBERS全取,但大数据用SSCAN迭代。
来源5
SORTED SET是排行榜神器,ZADD score:board 100 "user1" 95 "user2",ZREVRANGE 0 9 WITHSCORES 取前10名带分数。ZRANGEBYSCORE score:* 80 +inf LIMIT 0 20 分页查询高分用户。
来源6
PIPELINE是批量查询利器,正常单命令有网络RTT,pipeline把多命令打包一次发,redis-py中pipe = r.pipeline(); pipe.set('a',1); pipe.get('a'); pipe.execute(),查询效率提升10倍。
来源7
用MGET批量取多个key值,MSET批量设置,避免循环单get。PUBLISH/SUBSCRIBE实时查询变化,PSUBSCRIBE news:* 模式订阅。
FAQ
Q: KEYS命令在大规模Redis中为什么不推荐?
A: 因为它会阻塞服务器,遍历所有键,推荐用SCAN渐进式。
Q: 如何用Redis实现分页查询?
A: 用LIST的LRANGE 0 10,或SORTED SET的ZRANGE 0 10 LIMIT offset count。
Q: PIPELINE和MULTI事务区别?
A: PIPELINE是批量执行不保证原子,MULTI是事务保证原子但稍慢。
Q: 怎么避免缓存穿透?
A: 查询空结果也缓存,设置短TTL,或用布隆过滤器。