1、如何保证redis双写一致性
先删除缓存,然后在更新数据库,为什么要这样做呢,因为如果先更新数据库在删除缓存,如果更新成功,删除失败,那么就会导致,如果这个时候有线程来访问,他会先去缓存中查找,此时缓存中是旧数据而数据库是新数据,所以这样不行
2、redis数据类型
string、list、set、zset、hash
3、缓存击穿,缓存穿透,缓存雪崩
缓存雪崩:大量redisKey过期,导致大量访问数据库,从而导致数据库崩溃;
解决方案:事前:redis高可用 主从复制+高可用
事中:hystrix降级
事后:redis持久化,快速恢复数据
缓存击穿:某个热点key过期,导致一瞬间数据库被击穿
解决方案:给热点key设置永不过期
缓存穿透:大量key未命中,一般是恶意攻击
解决方案:只要db未查到,就返回一个null值存入缓存,并设置过期时间
4、redis持久化
RDB快照:把内存的数据IO到磁盘中
优缺点:1、redis只需要fork一个子进程来完成io,对redis读写并无影响
2、因为rdb是5分支执行一次,假设出现故障则会丢失大量数据
3、恢复速度相比aof要快
AOF:把每条命令写入日志
优缺点:1、因为每个1s就会执行该命令,所以丢失数据少
2、生成的文件要比rdb大
5、redis删除策略
定期删除:每隔10s,从已设置过期时间的key中挑选20个,删除其中已经过期的,如果删除的超过1/4,则再次执行该步骤
定时删除:一到时间就马上删除
惰性删除:到时间不做任何操作,等下一次访问该key时,如果过期了就删除
6、redis淘汰策略
allkeys-lru:从所有key中删除最近最少使用的
allkeys-random:从所有key中随机删除
volitile-lru:从已设置过期时间的key中删除最近最少使用的
volitile-ttl:从已设置过期时间的key中删除马上要过期的
volitile-random:从已设置过期时间的key中随机删除
noervition:内存不足时直接报错