当Redis应用内存不足时,再有新的数据新增到Redis时,需要删除一部分已有内存数据,才能新增的数据
noeviction: 返回错误
allkeys-random: 所有数据中删除数据
volatile-random: 有过期时间的数据库中随机删除数据
volatile-ttl: 删除剩余有效时间最少的数据
allkeys-lru: 所有数据中删除上次使用时间最久的数据
volatile-lru: 有过期时间的数据中删除上次使用时间最久的数据
allkeys-lfu: 所有数据中删除使用频率最少的
volatile-lfu: 有过期时间的数据中删除使用频率最少的
缓存穿透当一个查询查到redis,redis中没有,那么逻辑上就要查询数据库,数据查询慢,消耗资源,但是数据库中也没有,下次再有这个查询,还会穿过redis,查到数据库,还是消耗资源
如果有恶意的行为,不断反复的查询你数据库中没有的东西,就会导致系统的缓慢甚至宕机
在实际开发中,流行的做法是在Redis中在保存一个布隆过滤器
解决办法 : 查询Redis中信息不存在时,先查询布隆过滤器 如果布隆过滤器显示数据库中没有和这个数据,直接给出响应,就不会到数据库查询了
缓存击穿一个数据本来在Redis保存着(这个数据来自数据库)
正常情况下,一个请求查询到这个数据会直接从Redis中获得然后返回 不会查询数据库
但是Redis的数据一搬都会设置过期时间的
在过期的一瞬间,Redis是没有这个缓存数据的, 如果多个请求凑巧请求这个数据,就会访问数据库,带来压力
这个现在并不是不允许的,数据过期也是正常现象,一个请求之后Redis中会重新更新获得这个数
缓存雪崩如果短时间内大量出现缓存过期,就是缓存雪崩
其实就是并发了很多缓存击穿,数据库会不堪重负
分析缓存雪崩的原因,一般都是因为大量缓存数据同时添加到Redis并且设置了相同的有效期
解决和缓解办法是在设置有效期时,添加一个随机数,这样他们就不会同时失效了
Redis持久化Redis信息保存在内存
一旦断电,所有信息会丢失,在开机重启,需要将所有数据重新从数据源中获取
给数据源(指mysql)带来压力
我们如果能够在Redis运行的同时,将Redis内存的数据保存在当前服务器硬盘上,即使断电,在重启的过程中,我们可以从本机的硬盘恢复数据,无需访问数据源
Redis的持久化有两种ROB:
数据快照(内存中所有数据以二进制的方式保存在硬盘上),生成一个dump.rdb的文件
我们可以在redis安装程序的配置文件中找到conf文件
在空白位置编写如下面的内容
save 60 5
60表示60秒即一分钟
5表示key被修改的次数
整体含义,一分钟内有五次以上的key的修改,就会启动rdb数据库快照
优点: 因为是二进制格式,整体恢复数据
缺点: 突然断电的情况下,会丢失上次生成rdb文件和断电时间之间的数据
生成rdb文件是一个磁盘写操作,效率低
AOF
记录所有对redis的命令日志
conf配置文件:
appendonly yes
特点:不保存数据,只保存命令
这种情况下,理论上,所有redis运行过的指令都会保存下来,任何情况下断电都不会丢数据
但是实际情况下,Redis非常繁忙的情况下,在保存所有运行的指令,会影响运行速度
为了减少对运行速度的影响,默认情况下会将每一秒运行的所有指令整体的发送到日志中,减少id操作次数
但是缺点就是仍然 会丢失断电时,每秒间隔之间的数据
如果希望Redis仅作为纯内存的缓存来用, 亦可禁用RDB和AOF 可以在同一实例中同时使用AOF和RDB 这种情况下, 当Redis 重新启动时,AOF文件将用于重建原始数据集,因为他可以保证是最完整的
Redis集群当今互联网程序集群非常常见
简单来说就是请求较多时,一台服务器无法完成时,由多台服务器共同完成
Redis作为为了提高服务器请求并发量的重要组件,承担着非常重要的职责
Redis服务器一台忙不过来 也是可以形成集群的
Redis集群有两种目标
一种是高性能集群(分区分片)
一种是高可用集群(Redis镜像服务器)
当一个Redis服务器保存了很多信息 如果它宕机就会导致整个系统瘫痪 为了尽量的减少这种情况发生 可能套搭建一个镜像服务器,提高高可用



