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:内存不足时直接报错