【redis-7】redis高级知识点

一: 性能监控指标

使用info命令可以查看redis状态

connected_clients:68 # 连接的客户端数量
used_memory_rss_human:847.62M # 系统给 redis 分配的内存
used_memory_peak_human:794.42M # 内存使用的峰值大小
total_connections_received:619104 # 服务器已接受的连接请求数量
instantaneous_ops_per_sec:1159 # 服务器每秒钟执行的命令数量 qps
instantaneous_input_kbps:55.85 #redis 网络入口 kps
instantaneous_output_kbps:3553.89 #redis 网络出口 kps
rejected_connections:0 # 因为最大客户端数量限制而被拒绝的连接请求数量
expired_keys:0 # 因为过期而被自动删除的数据库键数量
evicted_keys:0 # 因为最大内存容量限制而被驱逐( evict )的键数量
keyspace_hits:0 # 查找数据库键成功的次数
keyspace_misses:0 # 查找数据库键失败的次数

二:缓存问题

1、缓存穿透

缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,比如暴力攻击,查询一个不存在的id。

解决办法:

缓存空对象: 当第一次查询db后,就往redis存空对象。  后来的请求就不会访问db了。

这种情况需要将过期时间设置短一点,但是也不能避免该时段内,出现数据不一致情况。。另外,缓存大量的空对象,也对redis造成浪费。

使用布隆过滤器(Bloom Filter):

在db和redis插入数据时,可以将redis的key存入bloom。 这样在查询前先校验bloom是否存在key,有才查redis和db

直观的说,bloom算法类似一个hash set,用来判断某个元素(key)是否在某个集合中。
和一般的hash set不同的是,这个算法无需存储key的值,对于每个key,只需要k个比特位,每个存储一个标志,用来判断key是否在集合中。

算法:
1. 首先需要k个hash函数,每个函数可以把key散列成为1个整数
2. 初始化时,需要一个长度为n比特的数组,每个比特位初始化为0
3. 某个key加入集合时,用k个hash函数计算出k个散列值,并把数组中对应的比特位置为1
4. 判断某个key是否在集合时,用k个hash函数计算出k个散列值,并查询数组中对应的比特位,如果所有的比特位都是1,认为在集合中。

优点:不需要存储key,节省空间,查询效率很高。 

缺点:
1. 算法判断key在集合中时,有一定的概率key其实不在集合中
2. 无法删除。所以校验key有的时候,实际数据可能已经不存在了。

2、缓存击穿

缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),如果是热点数据,可能并发很大,会造成db压力过大。

解决办法:

加锁。  当redis不存在需要从db查时,加锁,获取锁后,再从redis查一次,如果有,释放。如果没有从db查出来,存入redis。

【redis-7】redis高级知识点

3、缓存雪崩

某一时间大量key失效(比如key同时失效或重启redis),造成db压力过大。

解决办法:

1、做高可用,将数据分散到不通的实例

2、不同的key设置不通的缓存过期时间

3、可以再设置二集缓存