核心数据结构与应用场景
string
分布式session<br>
token
后端接口缓存
分布式递增编号生成
文章阅读数或网页浏览数统计
分布式锁
list
用于做消息中间件(一般不用,使用专业mq)<br>
模拟消息推送
Redis Lua脚本<br>
Redis 2.6版本加入对lua脚本支持<br>
减少网络开销
院子操作
替代redis事务功能
Cluster集群架构<br>
多个主从节点群组成的分布式服务器集群<br>
复制、高可用和分片特性
数据被分配到16384个槽位之中<br>
槽位定位算法
使用crc16hash算法散列之后取模16384<br>
跳转重定位
如果客户端请求的槽位不在本服务器上,将请求重定位到正确的节点<br>
集群节点间的使用gossip协议通讯<br>
gossip协议的多种消息<br>
ping
频繁发送ping消息互相通讯,交换元数据<br>
等等
redis节点数推荐为奇数,并大于3个master节点
从节省机器资源的角度出发
redis集群对于批量操作命令的支持
只支持落在同一个slot下的操作
redis分布式锁
需考虑问题<br>
使用setnx命令作为锁
设置锁存活时间<br>避免服务宕机导致无法释放锁
为服务器分配id为锁的值避免其他服务器释放锁<br>
锁时长过期业务未执行完成的问题<br>
使用定时任务进行锁续命
使用Redission框架<br>
提供了分布式锁的完善实现
大量请求操作热点key<br>
使用分段锁来提高性能
redis缓存设计<br>
缓存穿透
原因
自身业务代码或数据问题
被恶意攻击、爬虫造成大量命中
缓存击穿
大量缓存同时失效
同一批缓存失效时间设置为同一时间段内的不同时间点<br>
缓存雪崩
缓存层崩溃引发蝴蝶效应导致系统崩溃
解决
保证缓存层高可用性
Redis sentinel<br>
Redis Cluster<br>
依赖隔离组件限流熔断并降级<br>
Sentine
Hystrix
热点缓存key重建优化
热点key失效瞬间大量线程重建缓存导致后端压力过大
开发规范与性能优化
键值设计
key名设计
可读性和管理性
简洁性
不要包含特殊字符
value设计
bigkey的危害
导致redis阻塞
导致网络拥塞
过期删除问题
bigkey的删除
使用hscan,sscan,zscan渐进式删除
避免bigkey过期自动使用del删除
如何优化bigkey
拆
选择合适的数据类型
控制key的生命周期
命令使用
使用数据集操作的使用需要明确N的值
禁用keys、flushall、flushdb等命令<br>
合理使用select
使用批量操作提升效率
原生命令:mget,mset
非原生命令:可以使用pipeline提升效率<br>
Redis事务功能较弱,使用lua替代
客户端的使用
避免多个应用使用同一个redis实例
使用带连接池的数据库框架