Redis常见问题 | 青训营

132 阅读3分钟

一、大Key

1.大Key的定义

value字节数大于10kb的string类型或元素数量超过5000/value大于10mb的Hash/Set/Zset/list等复杂数据结构类型 。

2.大Key的危害

读取成本高、容易导致慢查询(过期、删除)、主从复制异常,服务堵塞,无法正常响应请求

3.解决方法

1.拆分

2.压缩

通常情况下一个压缩算法压缩率高,则解压耗时长。如果储存的是JSON字符串,可以考虑使用MessagePack进行序列化

3.集合类结构hash、list、set

(1)拆分:可以用hash取余、位掩码的方式决定放在哪个key中。
(2)区分冷热:如榜单列表场景使用zset,只缓存前10页数据,后续数据走db

二、热Key

1.热Key的定义

用户访问一个Key的QPS特别高,导致服务实例出现CPU负载突增货不均。热Key没有明确标准,QPS超过500就可能被识别为热Key

2.解决方法

1.设置Localcache

在访问Redis前,在业务服务侧设置Local擦车,降低访问Redis的QPS.Lacalcache中缓存过期或未命中,则从Redis中将数据更新到Localcache。

2.拆分

将一个热key复制写入多份,访问时访问多个key,但是同一个value,以此分散qps,降低负载。但更新时会更新多个key,存在数据短暂不一致的风险。

三、导致redis慢查询的操作

1.批量操作一次性传入过多的key/value,如mset/hmset/asdd/zadd等O(n)操作。建议单批次不要超过100,超过后性能明显下降。
2.zset大部分命令都是O(log(n)),当大小超过5k以上,简单的zadd/zrem也可能导致慢查询。
3.操作的单个value过大,超过10kb,即使用大Key。
4.对大Key的delete/expire操作也可能导致慢查询。

四、缓存穿透、数据雪崩

1.定义

缓存穿透:热点数据查询绕过缓存,直接查询数据库。
缓存雪崩:大量缓存同时过期。

2.危害

缓存穿透的危害: 查询一个不存在的数据,通常不会缓存不存在的数据,这类查询请求都会直接打到db,如果有系统bug或人为攻击,容易导致db响应慢甚至宕机。
数据雪崩的危害:缓存过期时,在高并发场景下,一个热key如果过期,会有大量请求同时击穿至db,容易影响db性能和稳定;同时有大量key集中过期时,也会导致大量请求落到db上,导致查询变慢,甚至出现db无法响应新的查询。

3.解决方法

如何减少缓存穿透

1)缓存空值

如一个不存在的userID。这个id在缓存和数据库中不存在,则可以缓存一个空值,下次再查缓存直接反空值

2)布隆过滤器

通过bloom filter算法来存储合法key,得益于该算法超高的压缩率,只需要占用极小的空间就能存储大量key

如何避免缓存雪崩

1)缓存空值

将缓存失效时间分散开,对于热点数据,过期时间尽量设置长一些,冷门数据可以相对设置过期时间短一些

2)使用缓存集群,避免单机宕机造成的缓存雪崩