为什么使用Redis
因为Redis数据类型丰富且数据内存存储,可以加快程序访问速度,减轻数据库压力
Redis数据类型
String(字符串),Hash(哈希,类似Map),List(列表),Set(集合,存储多个不重复元素),Sorted Set(有序集合),Bitmaps(位图,二进制数据),Stream流,Geo,Bitfield位域,Hyperloglog(基数统计)
怎么保证Reids和Mysql数据一致性
一般采用先更新数据库在删除Redis策略,这会导致redis读取到旧数据,可采用延迟双删,mysql更新前删除缓存然后更新数据之后在删除一次缓存,如果并发大的情况可能导致缓存击穿,造成数据库压力增大,这时候可采用setnx乐观锁的方式实现并发控制。第一个请求加锁,然后查询数据库,其他请求使用回旋锁循环等待,等锁释放则查询Redis
什么是缓存雪崩、缓存击穿、缓存穿透?
缓存雪崩:大量的热KEY同时过期,导致查询请求直接到Mysql造成数据库压力大
应对方案:
1. 热点的key可以设置永不过期的key或随机值,避免大规模缓存过期
2. 增加熔断措施,在请求量超过阈值的情况直接返回系统拥挤,可保证部分用户正常访问,其他用户多刷新几次也可访问,不会造成系宕机等故障
3. 提高数据库的容灾能力,可以使用分库分表,读写分离的策略。
4. 为了防止Redis宕机导致缓存雪崩的问题,可以搭建Redis集群,提高Redis的容灾性。
缓存击穿:某个热KEY过期导致
应对方案:
1. 热点的key可以设置永不过期的key
2. 使用SETNX等乐观锁机制
缓存穿透:大量查询并存在的key,redis不存在-》mysql查
应对方案:
1. 无效KEY缓存空值
2. 使用布隆过滤器,请求先查询布隆过滤器,如果不存在则直接返回,如果存在则查询Redis-》Mysql
Redis内存过期策略和淘汰策略
过期策略:
1.定期删除
2.惰性删除
所谓惰性策略就是在客户端访问这个key的时候,redis对key的过期时间进行检查,如果过期了就立即删除,不会给你返回任何东西。
淘汰策略:
- noeviction:当内存使用超过配置的时候会返回错误,不会驱逐任何键
- allkeys-lru:加入键的时候,如果过限,首先通过LRU算法驱逐最久没有使用的键
- volatile-lru:加入键的时候如果过限,首先从设置了过期时间的键集合中驱逐最久没有使用的键
- allkeys-random:加入键的时候如果过限,从所有key随机删除
- volatile-random:加入键的时候如果过限,从过期键的集合中随机驱逐
- volatile-ttl:从配置了过期时间的键中驱逐马上就要过期的键
- volatile-lfu:从所有配置了过期时间的键中驱逐使用频率最少的键
- allkeys-lfu:从所有键中驱逐使用频率最少的键