1.redis支持哪些数据类型
string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合)
2.过期策略
(1)定期删除:
Redis 默认每个 100ms 检查,有过期 Key 则删除。需要说明的是,Redis 不是每个 100ms 将所有的 Key 检查一次,而是随机抽取进行检查,因为如果redis中有数量很大的key(例如几十万key),那么每隔100ms检查一次,redis很可能就死掉了,因为数据太多,检查太频繁,cpu负载太高了。如果只采用定期删除策略,会导致很多 Key 到时间没有删除。于是,惰性删除派上用场。
(2)惰性删除:
当你在获取某个 key 的时候,redis 会检查这个 key是否设置了过期时间,如果设置了过期时间,检查key是否过期,如果过期了此时就会删除,返回空值。
3.淘汰机制
noeviction: 当内存不足以容纳新写入数据时,新写入操作会报错(使用较少)。
allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的 key(这个是最常用的)。
allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个 key(使用较少)。
volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的 key(使用较少)。
volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个 key(使用较少)。
volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的 key 优先移除(使用较少)。
4.什么是缓存雪崩
(1)对于“对缓存数据设置相同的过期时间,导致某段时间内缓存失效,请求全部走数据库。
(2)Redis挂掉了,请求全部走数据库。
5.怎么解决缓存雪崩
对于“对缓存数据设置相同的过期时间,导致某段时间内缓存失效,请求全部走数据库。”这种情况
- 在缓存的时候给过期时间加上一个随机值,这样就会大幅度的减少缓存在同一时间过期。
对于“Redis挂掉了,请求全部走数据库”这种情况,我们可以有以下的思路:
- 事发前:实现Redis的高可用(主从架构+Sentinel 或者Redis Cluster),尽量避免Redis挂掉这种情况发生。
- 事发中:万一Redis真的挂了,我们可以设置本地缓存(ehcache)+限流(hystrix),尽量避免我们的数据库被干掉(起码能保证我们的服务还是能正常工作的)
- 事发后:redis持久化,重启后自动从磁盘上加载数据,快速恢复缓存数据
6.什么是缓存击穿
缓存穿透是指查询一个一定不存在的数据。由于缓存不命中,并且出于容错考虑,如果从数据库查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,失去了缓存的意义。
比如:每次请求的ID都是负数。这会导致我的缓存就没用了,请求全部都找数据库去了,但数据库也没有这个值啊,所以每次都返回空出去。
7.如何解决缓存击穿
- 由于请求的参数是不合法的(每次都请求不存在的参数),于是我们可以使用布隆过滤器(BloomFilter)或者压缩filter提前拦截,不合法就不让这个请求到数据库层!
-当我们从数据库找不到的时候,我们也将这个空对象设置到缓存里边去。下次再请求的时候,就可以从缓存里边获取了。这种情况我们一般会将空对象设置一个较短的过期时间。