这是我参与「第五届青训营 」伴学笔记创作活动的第 15 天
课程目录
- 什么是Redis
- Redis应用案例
- Redis使用注意事项
Redis
随着数据压力的不断增大,从分库分表,传统的单机数据库衍生出了集群化的设置,来解决读写压力问题。
对于数据本身而言,一般会有一些访问次数很多的数据,称为热数据,这一部分数据的数据量可能很小,却要承担例如80%的读写压力,这时候将热数据存储至内存中,冷数据存储至磁盘中,很好地利用计算机中多级存储的特点。
Redis是一种kv数据库,数据从内存中读写,通过AOF增量保存,RDB方式全量保存,单线程处理所有操作指令的特点,优点是相比于传统的关系型数据库,读写速度快,很适合热数据。
Redis应用案例
从案例分析Redis的应用数据结构
String数据结构,sds,可以存储字符串/数字和二进制数据。
List数据结构可以作为消息队列,常见的快表,由异构双向链表和异构listpack组成
Hash结构可实现计数,数据结构由dict构成,rehash方式为渐进式rehash,将整个迁移过程平坦到请求过程,减少业务感知缓慢时间
zset数据结构,结合dict,可实现通过key操作跳表的功能。
redis还可以实现限流与分布式锁,对key条用incr,超过限制禁止访问,使用setnx实现分布式锁
使用注意事项
大key
string类型,value的字节数大于10kb;其他数据类型元素个数大于5000个或总value字节数大于10mb;
大key的危害有读取成本高,容易导致慢查询,主从复制异常,服务阻塞,无法正常相应请求,在业务侧常常表现为请求Redis超时报错,
解决方法有拆分,将大key分为小key,或者使用压缩算法,json数据尝试用messagepack进行序列化; 对于集合类数据,可以使用Hash取余决定放置在哪个key上,对于榜单数据,只缓存前10页数据,后续数据走db
热key
用户访问一个key的qps特别高,导致server实例出现cpu负载突增或不均的情况,一般情况下qps超过500可以认为是热key。
解决方法有,在业务侧设置localcache,降低访问redis的qps。localcache中缓存过期或未命中,则从redis中将数据更新到localcache。Java中guava和go的bigcache实现了;还可以将热key复制写入多份,分散到不同实例上,但会导致更新不一致问题
缓存穿透和雪崩
缓存穿透指热点数据查询绕过缓存,直接查询数据库,雪崩指大量缓存同时过期。
解决缓存穿透,可以缓存空值,或者用布隆过滤器来存储合法key 解决缓存雪崩,设置不同的随机过期时间