怎样搭建一个个人网站,wordpress文章图片显示错误,宿州最新的信息网,asp网站相册八股学习 Redis 使用场景常见问题问题1、2示例场景缓存穿透解决方案一解决方案二 问题3示例场景缓存击穿解决方案 问题4示例场景缓存雪崩解决方案 问题5示例场景双写一致性强一致方案允许延时一致方案 问题6RDB方式AOF方式两种方式对比 问题7示例场景惰性删除定期删除 使用场景… 八股学习 Redis 使用场景常见问题问题1、2示例场景缓存穿透解决方案一解决方案二 问题3示例场景缓存击穿解决方案 问题4示例场景缓存雪崩解决方案 问题5示例场景双写一致性强一致方案允许延时一致方案 问题6RDB方式AOF方式两种方式对比 问题7示例场景惰性删除定期删除 使用场景
缓存穿透、击穿、雪崩、双写一致、持久化、数据淘汰、淘汰策略 分布式锁setnx、redisson 计数器、保存token、消息队列、延迟队列数据类型 常见问题 什么是缓存穿透怎么解决 什么是布隆过滤器 什么是缓存击穿怎么解决 什么是缓存雪崩怎么解决 Redis双写问题? Redis作为缓存如何实现持久化 Redis的数据过期策略有哪些? Redis的数据淘汰策略有哪些? Redis分布式锁如何实现? Redis实现分布式锁如何合理的控制锁的有效时长? Redis集群有哪些方案? 什么是 Redis 主从同步? 使用的Redis是单点还是集群?哪种集群Redis分片集群中数据是怎么存储和读取的 Redis集群脑裂 怎么保证Redis的高并发高可用 用过Redis的事务吗?事务的命令有哪些 Redis是单线程的但是为什么还那么快? … 问题1、2
缓存穿透、布隆过滤器
示例场景 缓存穿透
查询一个不存在的数据mysql查不到因此不会直接写入导致频繁查询数据库
解决方案一
缓存空数据,即使查询返回数据为空也仍把空结果缓存 优点简单 缺点内存消耗可能导致不一致问题
解决方案二
布隆过滤器 作用检索一个元素是否在集合中
优点内存占用少没有多余key 缺点实现相对复杂存在误判 问题3
缓存击穿
示例场景 缓存击穿
给某一个key设置了过期时间当key过期的时候恰好这时间点对这个key有大量的并发请求过来这些并发的请求可能会瞬间把DB压垮
解决方案 互斥锁 优点强一致 缺点性能差 逻辑过期 优点高可用性能优 缺点不能保证数据绝对一致 问题4
缓存雪崩
示例场景 缓存雪崩
指在同一时间段大量的缓存key同时失效或者Redis宕机导致大量请求到达数据库带来巨大的查询压力
解决方案
给不同的key的TTL添加随机值利用Redis集群提高服务可用性哨兵模式、集群模式给缓存业务添加降级限流策略ngxin或spring cloud gateway给业务添加多级缓存:Guava或者Caffeine 问题5
示例场景
双写一致性
双写一致性
当修改了数据库的数据也要同时更新缓存的数据缓存数据于数据库数据要保持一致
强一致方案
Redisson提供的读写锁 共享锁读锁readLock加锁后其他线程可以共享读操作 排它锁独占锁writeLock加锁后阻塞其他线程读写操作
允许延时一致方案
MQ中间件:更新数据后通知缓存删除
canal中间件:监听binlog数据更新缓存不需要修改业务代码 问题6
Redis持久化
RDB方式
bgsave开始时会fork主进程得到子进程子进程 不是子线程 会共享主进程的内存数据完成fork后读取内存数据并写入RDB文件 fork采用的是copy-on-write技术
当主进程执行读操作时访问共享内存当主进程执行写操作时则会拷贝一份数据执行写操作
AOF方式
AOF全称为Append Only File(追加文件)Redis处理的每一个读写命令都会记录在AOF文件中可以看作是命令日志文件 需要注意的是AOF默认是关闭的需要修改redis.conf配置文件来开启AOF AOF命令的记录频率也可以通过redis.conf文件来配置 因为是记录命令AOF文件会比RDB文件大的多。而且AOF会记录对同一个key的多次写操作但只有最后一次写操作才有意义。通过执行bgrewriteaof命令可以让AOF文件执行重写功能用最少的命令达到相同效果 Redis也会在触发阈值时自动去重写AOF文件阈值也可以在redis.conf中进行配置
两种方式对比
RDB和AOF各有优缺点如果对数据安全性要求较高在实际开发中往往结合两者来使用 问题7
Redis数据过期策略
示例场景
Redis对数据设置数据的有效时间数据过期以后就需要将数据从内存中删除掉。可以按照不同的规则进行删除这种删除规则就被称之为数据的删除策略(数据过期策略)。
惰性删除
设置该key过期时间后我们不去管它当需要该key时我们在检查其是否过期如果过期我们就删掉它反之返回该key 优点:对CPU友好只会在使用该key时才会进行过期检查对于很多用不到的key不用浪费时间进行过期检查 缺点:对内存不友好如果一个key已经过期但是一直没有使用那么该key就会一直存在内存中内存永远不会释放
定期删除
每隔一段时间我们就对一些key进行检查删除里面过期的key(从一定数量的数据库中取出一定数量的随机key进行检查并删除其中的过期key)。 定期清理有两种模式:
SLOW模式定时任务执行频率默认为10hz每次不超过25ms以通过修改配置文件redis.conf的hz 选项来调整这个次数FAST模式频率不固定但两次间隔不低于2ms每次耗时不超过1ms
优点:可以通过限制删除操作执行的时长和频率来减少删除操作对 CPU 的影响。另外定期删除也能有效释放过期键占用的内存。 缺点:难以确定删除操作执行的时长和频率。
Redis的过期删除策略:惰性删除定期删除两种策略进行配合使用