一、数据结构
1. int:incr/decr,可用于计数缓存
(1) set/get/del
(2) incr/decr
(3) mset/mget
2. string:
(1) set/get/del
(2) mset/mget
(3) append
3. list:内部使用双向链表实现。微博消息列表、点赞列表、朋友圈等。
(1) lpush/lpop
(2) rpush/rpop
(3) lrange
(4) ltrim
(5) brpop
4. set:无序集合,元素不重复
(1) sadd/srem
(2) sismember
(3) 统计元素个数:scard
(4) sdiff key1 key2
(5) sdiffstore destkey key1 key2
(6) 计算交集:sinter key1 key2
(7) sinterstore destkey key1 key2
(8) smove sourcekey destkey member
(9) spop key
(10) srandmember key [ count ]
(11) srem key member1 [member2]
(12) 计算并集:sunion key1 key2
(13) sunionstore destkey key1 key2
(14) sscan key cursor [ match pattern] [count count]
5. zset/sorted set
(1) 添加元素:zadd key score member [[score member] [score member] ......]
(2) 获取成员的分值:zscore key member
(3) 查看成员当前的排名:zrank/zrevrank
zrevrank key member
(4) 按名次查看排行榜:zrange/zrevrange
zrevrange key 0 -1 withscores
(5) 增加成员分数:zincrby key store member
(6) 移除成员:zrem key member
(7) 删除排行榜:zdel key
6. map/hash
(1) hset/hget/hsetnx
(2) hmset/hmget
(3) hgetall
(4) hexists
(5) hincrby/hincrbyfloat
(6) hlen
(7) hdel
(8) hkeys/hvals
7. redis stream
(1) xadd
(2) xrange/xrevrange
(3) xtrim
(4) xdel
(5) xread
(6) xlen
(7) xgroupadd
(8) xreadgroup group
(9) 确认消费:xack
(10) xgroup setid
(11) xgroup delconsumer
(12) xgroup destroy
(13) xpending
(14) xclaim
(15) xinfo
(16) xinfo groups
(17) xinfo stream

8. hyperloglog
9. bitmap
10. redis-search
二、业务场景
1. 计数统计
2. 缓存
3. topN-排行榜:zset自动根据score进行排序
4. 标签系统/社交关系:set交集
5. 布隆过滤器
6. 分布式锁:setnx
7. geo位置:位置匹配,距离计算
8. 电商/购物车
9. 分布式ID
10. 分布式会话
11. 任务队列/消息队列
12. 限流
三、核心原理
1. 基于内存存储
2. 单线程,避免线程切换开销
3. IO多路复用
四、客户端类库
1. spring-data-redis:jedis/lettuce
2. redisson
| 特性 | Jedis | Lettuce | Redisson |
|---|---|---|---|
| 线程安全 | × | √ | √ |
| 支持集群 | √ | √ | √ |
| 支持哨兵 | √ | √ | √ |
| 支持发布/订阅 | √ | √ | √ |
| 支持管道 | √ | √ | √ |
| 支持异步操作 | × | √ | √ |
| 支持响应式编程 | × | √ | √ |
| API直观性 | √ | × | × |
| 社区支持 | √ | √ | √ |
| 性能 | 性能较低(同步阻塞) | 高性能(异步非阻塞) | 高性能(异步非阻塞) |
| 资源消耗 | 较高(频繁创建连接) | 较低(连接复用) | 较低(连接复用) |
| 高级功能支持 | × | × | √(如分布式锁、布隆过滤器等) |
| 易用性 | 高(简单易用) | 中等(需要更多配置) | 高(封装良好,功能丰富) |
| 学习曲线 | 低 | 中等 | 陡峭(功能丰富,学习成本高) |
| 文档完善度 | √ | √ | √ |
| 客户端实例创建 | 简单 | 复杂(需要配置) | 复杂(需要配置) |
| 连接池支持 | 需要外部支持(如Apache Commons Pool) | 内置连接池 | 内置连接池 |
| 跨语言支持 | × | × | × |
| 商业支持 | × | × | √(提供专业版) |
五、最佳实践
1. key最佳实践:
(1) key的格式建议 “业务名称:数据名称:id”,如:xx:xxx:xxxx;
(2) key的长度不超过44字节,这样可以采用embstr存储,节省内存占用;
(3) key中不包含特殊字符;
2. value最佳实践:拒绝big key
(1) string类型:value值建议不超过10k;
(2) list/set/hash/zset类型:元素数量控制在1万以下;
3. 选择合适的数据类型

(1) string/set:尽可能存储int类型;
(2) list/hash/zset:尽可能控制元素数量在阈值范围内,使用ziplist存储,节约内存;
4. 把redis当缓存使用,而不是数据库
(1) 数据存储在内存中,是redis快的主要原因,但内存资源是有限且昂贵的。所以缓存中的元素要设置合理的过期时间,让缓存中保留"热数据",淘汰掉"冷数据"。
(2) redis实例设置maxmemory + 淘汰策略;
4. 批处理优化:
(1) mget/mset/hmset/hmget
(2) pipeline
5. 开启lazy-free
6. 避免集中过期KEY
7. 使用长连接,合理配置连接池
8. 使用物理机部署redis,而不是虚拟机。
redis在做数据持久化时,采用创建子进程的方式,而创建子进程会调用操作系统的fork系统调用,虚拟机中fork调用会比物理机慢很多。
9. 尽量不开启数据持久化,如果需要开启需要谨慎合理配置。
758

被折叠的 条评论
为什么被折叠?



