Redis-大厂程序员是怎么用的 | 青训营笔记

30 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 15 天

课程目录

  1. 什么是Redis
  2. Redis应用案例
  3. Redis使用注意事项

Redis

随着数据压力的不断增大,从分库分表,传统的单机数据库衍生出了集群化的设置,来解决读写压力问题。

对于数据本身而言,一般会有一些访问次数很多的数据,称为热数据,这一部分数据的数据量可能很小,却要承担例如80%的读写压力,这时候将热数据存储至内存中,冷数据存储至磁盘中,很好地利用计算机中多级存储的特点。

Redis是一种kv数据库,数据从内存中读写,通过AOF增量保存,RDB方式全量保存,单线程处理所有操作指令的特点,优点是相比于传统的关系型数据库,读写速度快,很适合热数据。

Redis应用案例

从案例分析Redis的应用数据结构

String数据结构,sds,可以存储字符串/数字和二进制数据。

image.png List数据结构可以作为消息队列,常见的快表,由异构双向链表和异构listpack组成

image.png Hash结构可实现计数,数据结构由dict构成,rehash方式为渐进式rehash,将整个迁移过程平坦到请求过程,减少业务感知缓慢时间

image.png 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 解决缓存雪崩,设置不同的随机过期时间