day06Redis缓存篇

哪些数据适合放入缓存?
即时性、数据一致性要求不高的
访问量大且更新频率不高的数据(读多,写少


一、Redis 数据类型
1.String 
2.hash 哈希表
3.set 无序集合
4.zset 有序集合
5.list 列表
6.GEO 地理空间
7.HpperLoglog redis 基数统计
8.bitmap redis 位图
9.bitfield redis 位域
10stream  redis流
二、keys命令问题
1.redis有一亿个 key,使用 keys 命令是否会影响线上服务?
答:keys 命令时间复杂度是 O(n),n 即总的 key 数量,n 如果很大,性能非常低
因为redis执行命令是单线程执行,一个命令执行太慢会阻塞其它命令,阻塞时间长甚至会让 redis 发生故障切换

三、过期 key 的删除策略
1.惰性删除
:在执行读写数据库的命令时,执行命令前会检查 key 是否过期,如果已过期,则删除 key

2.定期删除:

redis 有一个定时任务处理器 serverCron,负责周期性任务处理,默认 100 ms 执行一次(hz 参数控制)包括:
① 处理过期 key、

② hash 表 rehash、

③ 更新统计结果、

④ 持久化、

⑤ 清理过期客户端
  
3.对于处理过期 key 会:依次遍历库,在规定时间内运行如下操作
:    
① 从每个库的 expires 过期字典中随机选择 20 个 key 检查,如果过期则删除
    
② 如果删除达到 5 个,重复 ① 步骤,没有达到,遍历至下一个库
    
③ 规定时间没有做完,等待下一轮 serverCron 运行

四、单机redis存在的四大问题

一、数据丢失问题-->通过开启RDB和AOF策略实现Redis持久化解决
RDB:把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后,从磁盘读取快照文件,恢复数据;

AOF:基于命令持久化备份。


Redis数据备份的执行时机:

1.执行save命令2.执行bgsave命令3.Redis停机时4.触发RDB条件时

二、并发能力问题-->通过搭建主从集群,实现读写分离解决
单节点Redis的并发能力是有上限的,要进一步提高Redis的并发能力,就需要搭建主从集群,实现读写分离,主节点可读可写 从节点只可读,实现读写分离,解决高并发的问题。
存在问题:主节点一旦宕机,服务就不可用

三、故障恢复问题-->通过利用Redis哨兵,实现健康检测自动恢复
Redis提供了哨兵(Sentinel)机制来实现主从集群的自动故障恢复。
Sentinel基于心跳机制监测服务状态,每隔1秒向集群的每个实例发送ping命令:

四、存储能力问题-->通过搭建分片集群,利用插槽机制实现扩容解决
主从和哨兵可以解决高可用、高并发读的问题。
但是依然有两个问题没有解决:
1.海量数据存储问题

2.高并发写的问

小结:Sentinel的三个作用是什么?

1.监控
2.故障转移
3.通知
相当与nocas类似的注册中心。
Sentinel如何判断一个redis实例是否健康?每隔1秒发送一次ping命令,如果超过一定时间没有响应则认为是主观下线,如果大多数sentinel都认为实例主观下线,则判定服务下线。

什么时候触发RDB和AOF机制?
1.执行save命令
 
2.执行bgsave命令

3.Redis停机时

4.触发RDB条件时


五、缓存失效的问题

1.缓存穿透-->查询一个不存在的数据
缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中,将去查询数据库,但是数据库也无此记录,我们没有将这次查询的 null 写入缓存,这将导致这个不存在的数据每次
请求都要到存储层去查询,失去了缓存的意义。在流量大时,可能 DB 就挂掉了,要是有人利用不存在的 key 频繁攻击我们的应用,这就是
漏洞。
解决:
缓存空结果null值、并且设置短的过期时间。
2.缓存雪崩
缓存雪崩是指在我们设置缓存时采用了相同的过期时间,导致缓存在某一时刻同时失
效,请求全部转发到 DB,DB 瞬时压力过重雪崩。
解决:
原有的失效时间基础上增加一个随机值,比如 1-5 分钟随机,这样每一个缓存的过期时间的
重复率就会降低,就很难引发集体失效的事件。
3.缓存击穿
对于一些设置了过期时间的 key,如果这些 key 可能会在某些时间点被超高并发地访问,
是一种非常“热点”的数据。
 这个时候,需要考虑一个问题:如果这个 key 在大量请求同时进来前正好失效,那么所
有对这个 key 的数据查询都落到 db,我们称为缓存击穿。
 解决:加锁
六、Redis分布式锁
分布式锁
分布式锁的实现两大核心就是加锁和解锁,
并且都需要保证原子性,如果不保证原子性,会导致一组数据多次加锁,
出现数据问题。加锁(占位+过期时间)、解锁(判断+删除)


2.基于Redisson完成分布式锁
七、如何保证缓存数据的一致性
1.先删除缓存,再更新数据库
2.先更新数据库,再删除缓存

猜你喜欢

转载自blog.csdn.net/weixin_71921932/article/details/129992234