文章目录
- 一、Redis缓存的介绍
- 二、Redis缓存问题
- 三、缓存数据管理
-
- [3.1 数据过期策略](#3.1 数据过期策略)
- [3.2 数据淘汰策略](#3.2 数据淘汰策略)
一、Redis缓存的介绍
我们在日常的代码编写中比较少使用到Redis,但是如果涉及到了比较大型的项目,常常避不开Redis这一项技术,那么在什么样的场景需要使用Redis呢。首先我们得明白Redis是一个高性能得键值数据库,我们使用它得原因很简单,就是因为快。这个问题在大并发,高负载的网站中必须考虑。redis数据库中的所有数据都存储在内存中。由于内存的读写速度远快于硬盘,因此Redis的的的在性能上对比其他基于硬盘存储的数据库有非常明显的优势。并且除了性能方面的优势,Redis作为数据库的缓冲,可以很好的解决并发问题,避免了数据库因为过多的并发请求而崩溃。所以其实在项目较大,需要多次请求的场景下,我们都可以考虑使用Redis。本文是根据黑马教程学习中所编写的引用了黑马程序员视频中的课件图片。
二、Redis缓存问题
在Redis缓存正常运行的情况下,它的运行流程如:
2.1 缓存穿透
在缓存这正常流程中,我们可能会遇到缓存穿透问题,也就是我们去申请查询一个不存在 的数据
那么由于我们无法在Redis中命中,我们就会直接到数据库去申请,那么每次查询不存在的数据都会直接向数据库发出请求,这就会对数据库造成很大的压力。
为了解决缓存穿透问题,常见的有几种方案:
- 解决方案1:将空数据缓存,这种方式简单,但会消耗内存,并且有可能造成不一致的问题
- 解决方案2:使用布隆过滤器。
那么布隆过滤器是如何实现帮助我们过滤的呢?
布隆过滤器中有一个bitmap也就是以bit为单位的数组,每个单元的值只能为0或者1,然后我们需要明白布隆过滤器也是需要初始化的,也就是上图中缓存预热时,预热布隆过滤器。那么存储时,我们会对数据的主键进行多个hash函数计算,将计算出来的值对应的bitmap中的单元值改为1,查询数据判断主键经过多个hash函数计算后的单位位是否位1,如果是则数据库中含有该元素。
但是需要明白的是由于有多个hash函数,一个主键如id1对应的可能是好几个bitmap单元位,必须全部为1的情况下才说明含有该元素。也有可能会出现误判的情况,如:
在这种情况下,bitmap数组越大,误判的概率就越低。
2.2 缓存击穿
缓存击穿问题其实是当某一个时刻key过期,并且在这个时刻发送过来了大量的并发请求,这些请求就有可能把DB击垮。
解决的方案有两种:互斥锁和逻辑过期
互斥锁解决方案具有强一致,性能差的特点
逻辑过期则是高可用,性能优,但是可能会出现线程1这样的返回旧数据的情况,可以根据是否需要保证数据的强一致性来选择解决方案。
2.3 缓存雪崩
缓存雪崩就是在一段时间内大量缓存key失效或者Redis宕机,导致大量请求抵达数据库造成压力。
给不同Key添加随机值不用说,Spring cloud gateway也就是网关,我们可以通过在后端的SSM配置中的网关来限流,nginx的限流配置也十分简单,这两个方案就不多讲了。其中限流策略实用性较高
重点需要讲的是Redis集群中的哨兵模式和集群模式:
Redis提供了哨兵(Sentinel)机制来实现主从集群的自动恢复,监测方式如下:
在知道了基本的监测方式后,Redis集群还可能出现脑裂问题:
当网络恢复后,该master就会变成后半部分集群的slave,会清空数据后与后半集群的master数据同步,那么刚刚写入的数据就丢失了,为了解决这个问题,我们需要设置,当你想要写入数据,master必须含有一个slave节点,这样就可以避免脑裂问题。
2.4 双写一致性
这个问题需要考虑的是自己的业务背景是一致性要求高 还是允许延迟一致
其中强一致性中的两个锁的方式如下:
2.5 缓存持久化
在Redis中提供了两种持久化方式:1、RDB 2、AOF
RDB
RDB也就是Redis Database Backup file(Redis数据备份文件),也就是Redis数据快照,把内存中的所有数据记录到磁盘之中,当Redis实例故障重启之后,从磁盘读取快照文件,恢复数据。
RDB的实现原理也就是基于页表实现内存的的读取,如果不明白什么是页表,可以参考我之前发的文章操作系统基础。
AOF
AOF全称也就是Append Only File(追加文件),AOF文件可以看做是命令日志文件。,我们可以学习一下AOF如何开启和配置:
Redis中的AOF还具有重写功能,具体的使用配置可以参照下图:
两者区别:
三、缓存数据管理
3.1 数据过期策略
而这种策略可以分为
- 惰性删除:设置key过期时间过后,不去管它,如果当需要该key时再检查,若过期就删除,反之返回key。这种方式的优点是对CPU比较友好,不会浪费资源检查。
缺点:对内存不友好,如果没使用就永远不会释放 - 定期删除:每隔一段时间定期检查删除过期的key
3.2 数据淘汰策略
数据淘汰的情况发生再当内存不够用时,我们需要决定淘汰那些数据来存放新数据,其中有几种不同的删除策略如下图:
在了解了数据淘汰策略之后,我们肯定就需要了解使用这些策略的场景。