目录
1 含义
2 redis的过期策略-数据到期时,对到期数据的处理
3数据淘汰策略-数据放不下时,淘汰其他数据的策略
4redis的持久化机制
5 缓存穿透 雪崩 击穿
是一个基于内存的又可以持久化的key-value类型的数据库,与mysql不同的是,它存储在内存之中,读取速度非常快,
设置过期时间命令:
Expire time key time time是以秒为单位的
Setex (String key,int seconds ,String value ) 这是字符串类型独有的设置方式
备注:如果不设置,则默认是永不过期的,如果设置了用persist key 来改变为永不过期
过期策略
1 定时删除
当key到达设置的过期时间之后,redis就会把对应的key和value删除;
优点是节省内存可以快速的把过期数据删除
缺点是 cpu资源占有太高,当key设置的很多的时候,资源分配的就很多。
2惰性删除
数据过期不立刻删除,而是在获取key的时候判断key是否过期,过去在删除
优点是节省cpu资源
2定期删除
通过定时任务,随机删除,这个任务是通过时间来进行资源分配,如一秒抽出0.1秒执行删除任务,删除任务就是随机获取一定数量的设置了过期时间的key,判断是否过期,过期就删除。
redis现在采用的过期策略是:
惰性删除和定期删除两种结合的方式
maxmemory-policy 使用这个命令配置淘汰策略
config get maxmemeory-policy
config set maxmemory-policy xxx
涉及的算法
lru算法
最近最少使用,思想就是最近被访问过,将来被访问的记录高
lfu算法
最不经常使用,根据最近的访问频率判断,多次被访问表示将来被访问的几率也很高
fifo
先进先出
内存中数据淘汰测
volatile-lru 设置了过期时间的采用lru算法淘汰
allkeys-lru 所有key使用lru算法淘汰
volatiel-lfu 设置了过期时间的采用lfu算法淘汰
allkeys-lfu 所有key采用lfu算法进行淘汰
volatile-random 设置了过期时间的随机进行淘汰
allkeys-random 所有key采用随机的方式进行淘汰
volatile-ttl 设置了过期时间的key采用先进先出的方式淘汰,最早到期的现淘汰
no-eviction 当内存到达峰值的试试,所有申请内存的操作都会报错(set push),只有get可以正常使用,--redis默认的就是这个策略
rdb和aof
rdb 是指在在一定时间内通过快照的方式把内存中的数据写到磁盘之中,快照文件命名为dump.rdb,当服务重启的是会从改文件中加数据放到缓存之中,会以一定时间内有一定的数据修改触发写入操作( 触发策略是可以写在配置文件中的),也可以手动触发用save或者bgsave(异步)的方式触发
vim $REDIS_HOME/bin/redis.conf 查看配置文件
save 900 1 意思是900秒内有一次修改就触发快照操作
配置触发策略命令 save
优点:
缺点:
aof
每一次请求的写命令都会被追加到aof的缓冲区之中,
aof缓冲区根据aof的持久化策略(always、everysec、no)同步到磁盘的aof文件之中
当aof的文件大小超过重写策略或者手动重写时,会对aof文件进行rewrite重写,压缩aof文件大小
当服务重启的时候会重新加载aof文件中的写操作命令。
重写指的是:文件重写指的是把redis进行内的数据转化为写命令同步到aof文件的过程
相关命令:
#开启AOF持久化
appendonly yes
#AOF文件名
appendfilename "appendonly.aof"
#AOF文件存储路径 与RDB是同一个参数
dir "/opt/app/redis6/data"
#AOF策略,一般都是选择第一种[always:每个命令都记录],[everysec:每秒记录一次],[no:看机器的心情高兴了就记录]
appendfsync always
#appendfsync everysec
# appendfsync no
#aof文件大小比起上次重写时的大小,增长100%(配置可以大于100%)时,触发重写。[假如上次重写后大小为10MB,当AOF文件达到20MB时也会再次触发重写,以此类推]
auto-aof-rewrite-percentage 100
缓存穿透
是指客户端请求的数据在缓存和数据库中都不存在,这种缓存永不生效,请求直接到数据库,当
不断发送请求的时候,很容易将数据库打崩。
发生情况:
业务员误操作,导致缓存和数据库数据都被删除
黑客的恶意攻击
解决办法:
1 对空值进行缓存 如果查询一个结果返回为空null,不管是否存在,对这值进行null值缓存或者一个默认值,注意要把过期时间设置的很短
2 布隆过滤器,查询布隆过滤器判断key是否存在(返回存在不一定存在,返回不存在一定不存在)
3设置可以访问的白名单, 限制一些非法请求的访问
缓存击穿:
是指一客户端请求的数据在缓存中没有但是在数据库中有,热点key在某个时间段内过期,而这个是有有大量的对这个key的并发请求过来,大量数据直接查询到数据库导致数据库崩溃。
解决办法:
1预先设置热点数据,提前存入缓存,加大热点数据的过期时间或者设置为永不过去
2 采用分布式锁
缓存雪崩
是指缓存中的key同一时间大量过期或者请求在缓存充处理不了(redis服务器挂掉),导致大量数据请求直接操作到数据库
发生情况:
1缓存中大量key同时过期,到时缓存中处理不了,直接到数据库导致数据库崩溃,
2 redis服务器重启挂机了,到时请求在缓存中处理不了
解决办法
1 差异化设置过期时间,尽量不让key在同一时间大量过期
2服务降级,允许核心业务直接访问数据库操作,非核心业务返回一个设定的返回值信息
3 服务熔断,暂定对数据的访问,直接返回错误
请求限流,避免大量的数据有可能直接请求到数据库,只允许小部分到数据库访问,其他数据在访问入口直接拒绝