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

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

相关推荐
꧁薄暮꧂1 小时前
kafka如何知道哪个消费者消费哪个分区?
数据库·分布式·kafka
꧁薄暮꧂1 小时前
kafka消费者组和分区数之间的关系是怎样的?
数据库·分布式·kafka
年薪丰厚1 小时前
etcd、kube-apiserver、kube-controller-manager和kube-scheduler有什么区别
数据库·kubernetes·k8s·etcd
ZHOUPUYU3 小时前
最新SQL Server 2022保姆级安装教程【附安装包】
java·数据库·python·sql·sqlserver·php·sqlserver2022
矩阵科学3 小时前
生产Redis批量删除数据
redis·批量删除·生产删除redis·批量删除key·删除key
阑梦清川3 小时前
JavaEE进阶-----mybatis操作数据库(新手教程)
数据库·java-ee·mybatis
NLP的小Y3 小时前
Neo4j图形数据库-Cypher中常用指令
数据库·neo4j
Mar_mxs3 小时前
Linux环境下配置neo4j图数据库
linux·数据库·neo4j
小狮子安度因3 小时前
Qt数据库操作-QSqlQueryModel 的使用
数据库·qt·oracle
ABILI .4 小时前
Oracle对比表与表之间的结构
数据库·oracle