Redis
热数据:经常访问的数据
AOF:存命令 RDB:存数据
使用场景:
连续签到:字符串,k-v,expire at 23.59.59
计数:例如论讨用户关注数、被关注数、文章被点赞数等,用hash存储
排行榜:zset
分布式锁
解决大key问题:
1.拆分
2.压缩
3.数据结构
()没懂
解决热key
1、在服务端设置localcache。localcache未命中或过期,再从redis更新数据至localcache
golang的Bigcache、gocache等就是这个功能
2.拆分
将key-value复制为key1-value,key2-value等,即key不同,value相同。
代价是:更新时需要更新多个key,存在数据短暂不一致风险
容易导致慢查询的操作:
(1)批量操作一次性传入过多的key/value,如mset/hmset/sadd/zadd等O(n)操作建议单批次不要超过100,超过100之后性能下降明显,
(2)zset大部分命令都是O(log(n)),当大小超过5k以上时,简单的zadd/zrem也可能导致慢查询
(3)操作的单个value过大,超过10KB。也即,避免使用大Key
(4)对大key的delete/expire操作也可能导致慢査询,Redis4.0之前不支持异步删除unlink,大key删除会阻塞Redis
缓存穿透:
热数据查询绕过缓存,直接查询数据库
危害:1、缓存的热点数据都是确实存在的数据。如果绕过缓存直接查询数据库则一定是查询的不存在的数据。如果有bug或网络攻击,容易引起数据库宕机
2、高并发场景下,热key过期会导致大量请求发送至db,影响db性能
避免方案:
缓存空值:如一个在缓存和数据都不存在的id,查询后可以在缓存中存一个空值,下次直接返回空值
布隆过滤器:用极小的空间可以存储大量的key
缓存雪崩:
大量缓存同时过期
危害:同一时间,大量key过期也会导致请求落到db上,影响db性能
避免方案:
1、采取不同过期方案:
将缓存失效时间分散开,比如在原有的失效时间基础上增加一个随机值,例如不同Key过期时间,可以设置为 10分1秒过期,10分23秒过期,10分8秒过期。单位秒部分就是随机时间,这样过期时间就分散了。
对于热点数据,过期时间尽量设置得长一些,冷门的数据可以相对设置过期时间短一些。
2、使用缓存集群