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.总结

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

相关推荐
haixingtianxinghai19 小时前
Redis的定期删除和惰性删除
数据库·redis·缓存
资深web全栈开发19 小时前
PostgreSQL Schema 最佳实践:架构师的命名与组织艺术
数据库·postgresql
麦聪聊数据20 小时前
利用实时数据管道与 SQL2API 重构企业自动化审计架构
数据库·sql·低代码
麦聪聊数据20 小时前
重构开放生态:利用 QuickAPI 跨越遗留系统与敏捷交付的工程实践
数据库·sql·低代码·restful
百结2141 天前
Mysql数据库操作
数据库·mysql·oracle
keep one's resolveY1 天前
时区问题解决
数据库
Leinwin1 天前
OpenClaw 多 Agent 协作框架的并发限制与企业化规避方案痛点直击
java·运维·数据库
qq_417695051 天前
机器学习与人工智能
jvm·数据库·python
漫随流水1 天前
旅游推荐系统(view.py)
前端·数据库·python·旅游
ego.iblacat1 天前
MySQL 服务基础
数据库·mysql