redis笔记

一、缓存

redis是基于内存的,最常用于当做缓存,来减少mysql的压力。因为mysql的压力基本来自于大量重复的查询请求,每次查询都需要去磁盘搜索太耗时间。

对于同一个数据的查询,第一次从数据库中查询出来之后,将数据放到redis中,后续再来请求相同的数据,请求到达内存之后,直接拿缓存中的结果进行返回,可以节省大量时间。

但这样又会出现别的问题,比如缓存穿透,缓存雪崩,缓存击穿,数据一致性等问题。

二、缓存穿透

缓存穿透是指 大量的请求不存在的数据,因为数据不存在,缓存中肯定也没有,就需要去查数据库,给数据造成压力,而数据库中也自然没有相对用的数据,也就不能在redis中进行缓存,那么下次相同的请求进来之后,还是会去数据库中查询,如此反复给数据库增加压力。

解决方法:如果请求的数据不存在,就在redis中将该请求的value设置为null,并设置较短的存活时间,这样下次再进来相同的请求可以直接用缓存中的null值进行返回。

三、 缓存雪崩

缓存雪崩是指 我们会将一些热点数据缓存在redis中,但如果这些热点数据的存活时间都一样的话,就会在某一时间同时失效,如果恰好在失效的时候,突然进来大量请求,数据库就很容易承受不住压力导致崩溃。

解决方法:设置存活时间的时候,添加一个随机值,让数据不会同时失效。

四、缓存击穿

缓存穿透是指 某一个热点数据恰好因为存活时间到期而失效的时候,恰好进来大量请求,就会导致这些请求都去查询数据库。

解决方法:导致数据库压力过大的原因是缓存中没有数据,所以大量请求同时去查询数据库。那么当缓存中没有需要的数据时,可以通过加锁的方式,不让所有的请求都去查询数据库,而是让第一个请求去查询数据库,然后将数据放到缓存中,其他的请求就可以在缓存中获取数据了。

如果缓存中没有数据,正常情况下需要去查询数据库,这时候可以通过redis做分布式锁,让请求去竞争锁,拿到锁的请求去查询数据库,并把数据放到缓存中,其他的请求没有竞争到锁,就去再查缓存。这样当拿到锁的请求执行完成后,缓存中也就存在了数据。

redis原生分布式锁:通过redis的set NX、EX功能,在加锁的同时设置锁的有效时间,并在finally中设置释放锁。释放锁时需要通过lua脚本。

上面的方法比较麻烦,可以使用配置好的redisson进行加锁和手动解锁,如果没设置存活时间的话,还可以自动续期。

五、缓存的一致性

可以使用双写或者删除缓存的方式。因为缓存都设置了存活时间,所以只要有足够的时间,最后都会保证数据一致性。

如果需要强一致性,可以通过阿里巴巴的canal订阅数据库的binlog,canal中间件会把自己伪装成mysql的从服务器,执行更新操作之后,mysql就会写二进制日志,canal发现binlog有数据更改后就会自动更新缓存。这样的好处是在操作的时候可以直接查库,不需要而外操作,cancl在后台会帮我们自动操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值