redis(1)

redis
缓存穿透
1.什么是缓存穿透呢?

当客户端访问数据库一个不存在的数据时,数据库查询不到也不会添加在缓存中,所以客户端的每次访问都会去查数据库,这有可能会导致数据库垮掉。

2.解决方案

1.缓存空数据,即便查询的结果为空,任然将这个空的结果存放在缓存中。优点是简单方便,缺点是消耗内存,可能存在不一致问题。

2.布隆过滤器,主要是用于检索一个元素是否存在于一个集合中。它的原理是,首先初始化一个数组,数组中存放的是二进制0、1,最开始存放的都是0,当一个数值来时,该值进行三次hash计算,模与长度取余获取到三个数组下标,并将对应的数组0修改为1,这样三个数组下标就可以标明一个数值。虽然占用内容少了,但会存在一定的误判,但好在我们可以设置误判率,让它保持在5%以内。归根到底,误判是必然存在的,想要降低误判,需要加长数组的长度。这样其实已经很划算了,5%的误判率一般项目也可以接受,不至于高并发下压倒数据库。

什么是缓存击穿

对于设置过期时间的key,在一段时间后过期,恰好在这个时间点对于该key有大量的请求访问,这些请求发现key过期后会从数据库加载并同步到缓存,但大量的请求会瞬间压垮数据库。

解决方案

1.互斥锁

当缓存失效时,先不去数据库加载,先使用如redis的setnx设置一个互斥锁,当操作成功返回时加载数据库,同时同步缓存,否则重试get缓存的方法。

2.逻辑过期

在设置key的时候同时设置一个过期时间字段一起放在缓存中,不给当前key设置过期时间,当查询时,从redis取出key并判断该key是否过期,若过期了,则开通一个新的线程去同步缓存,当前线程正常返回数据,不过这个数据不是最新的

3.总结

两种方法各有千秋,若是考虑数据的强一致性,可以考虑分布式锁,用锁了,当然性能就没那么高了,需要时间去等待,也有可能会造成死锁的状况。若是考虑性能,可以考虑逻辑过期,具有高可用性,不过数据同步这一块做不到强一致性。

相关推荐
虹科网络安全3 小时前
RDI 多数据源管道:把分散的数据汇入统一 Redis 数据层
经验分享·redis·艾体宝·艾体宝it·艾体宝redis
衡石科技4 小时前
兼顾查询速度与数据时效:衡石的缓存和分析加速
缓存·数据缓存·数据时效
我不会起名字3225 小时前
Redis 从 0 到 1(三十七·收官):36 篇浓缩成 1 张知识地图 + 50 项生产 Checklist
redis·go·知识体系·checklist·收官
Zan6 小时前
SQLite + SQLx 实战:为什么已经发布的数据库迁移文件,绝对不能再修改?
数据库·后端·面试
2601_967987376 小时前
安装 Redis 或 Redis Stack
linux·windows·redis·macos·安装
这个DBA有点耶7 小时前
数据同步的三个工程底线:DDL同步、断点续传、一致性校验——开源CDC的边界与KFS的路径
数据库·dba·代码规范
小番茄程序猿8 小时前
Redis 编码压测 59 轮:HSET 快 23 倍是假象,SMEMBERS 慢 30 倍是真的
redis·后端
SelectDB8 小时前
列式存储为什么适合分析类负载?原理、限制与日志场景应用
数据库
数据库小学妹9 小时前
MySQL大字段治理:行溢出机制、覆盖索引与拆表
数据库·mysql·性能优化