redis的缓存穿透,缓存雪崩,持久化方式

假装没事ソ 提交于 2021-02-01 11:14:09

Redis

redis是一个可进行持久化的内存数据库,可以支持string,list,hsh,set,zet这五种数据类型。

redis的性能很高(redis的读取速度可以达到11万次每秒,写的速度达到8万次每秒)

redis【缓存穿透】

     缓存穿透是指去查询一个一定不存在的数据,比如说我一共有100个商品,然后你偏偏去查询第101,102个这些不存在的商品,这个时候我们通常情况下就先回去redis里面去查询,但是redis里面就存在,所以就会去数据库中查询,如果大量的这种请求过来,那么就都落在了数据库上面,而数据库也不存在这样的数据,那么缓存就如同虚设,增加了数据库的压力。

解决方法:

      为了解决这个问题,我们可以缓存空值,也就是说即便数据库中查询出来的数据不存在,也会缓存空值在reids的缓存中,这样下一次就可以走我们的缓存而不是数据库啦,但是太多的空值会占用我们的缓存的内存空间,导致内存的浪费,我们就通过给它设置一个过期时间比如3分钟,这样过了3分钟后存入的空值就会清空,释放空间,但是这样又出现另外一个问题,就是说如果有人在三分钟内加了一条数据,这个时候就有了第101条数据啦,但是当我们用户去查的时候,走的缓存而缓存中却还是空值,导致缓存中的数据和数据库中的数据不一致,为了解决这个问题我们可以在后台增加数据的时候,同时主动更新缓存中存在的数据,或者去删除缓存中的数据,但这条数据还需再次去数据库中查询。

 

redis【缓存雪崩】

    大量的缓存穿透,或者缓存在一段时间内同时失效,发生大量的缓存穿透,所有的查询都落在数据库上,造成了缓存雪崩。

解决方法:

1.为不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀

2.做双缓存策略。

A1为原始缓存,A2为拷贝缓存,A1失效时,可以访问A2,

A1缓存失效时间设置为短期,A2设置为长期。

 

【redis持久化】

 

有AOF和RDB两种方式,我们一般使用默认的RDB方式。

因为它的效率会更高,

RDB持久化是在指定的时间间隔内将内存中的数据集快照写入磁盘,

实际操作过程是fork[分]一个子进程,

先将数据集写入临时文件,

写入成功后,再替换之前的文件,用二进制压缩存储,这样可以有效防止写入失败到账先前的数据也丢失。

 

具体是在redis.conf中配置的,找到save关键字,

指定每隔多长时间有多少个key发生变化,

就将其持久化。

 

save 900 1

#在900秒(15分钟)之后,如果至少有1个key发生变化,则dump内存快照。

save 300 10

#在300秒(5分钟)之后,如果至少有10个key发生变化,则dump内存快照。

save 60 10000

 

 

 

 

 

 

 

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!