Redis基础

51 阅读2分钟

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、使用缓存集群