常见Redis面试题
1. 单线程的redis为毛这么快?
-
纯内存操作
-
单线程操作避免了频繁上下文切换
-
采用非阻塞的多路复用机制,redis-client在操作的时候,产生不同类型的事件的socket,服务端的IO多路复用程序,将其放入队列,事件派发器会去队列中取,转发到不同的事件处理器中处理。
2. redis数据类型有哪些?
- String 常见的get/set操作
- hash value可以存放一些结构化的对象信息
- list 可以作为简单的队列使用,利用lrange做分页查询
- set 存放不重复的集合
- sorted set 带有score权重的set集合,可以做排行榜需求
3. redis的过期策略有哪些?
- 定时删除:在设置key的过期时间的同时,为该key创建一个定时器,让定时器在key的过期时间来临时,对key进行删除,一般不采用
- 惰性删除:key过期的时候不删除,每次从数据库获取key的时候去检查是否过期,若过期,则删除,返回null
- 定期删除:每隔一段时间执行一次删除过期key操作
redis采用的是定期删除+惰性删除
4. redis回收策略
在redis内存达到maxmemory
得时候会触发回收策略,设置redis回收策略
5. redis缓存穿透、雪崩、击穿怎么解决?
穿透
查询一个数据库/缓存中一定不存在的数据
- 布隆过滤器进行拦截
- 设置默认值
- 制定key的规则,比如数据id大于10000直接拒绝
雪崩:
在某一个时间段,缓存集中过期失效
- 失效事件随机,避免集体失效
- 互斥锁,存在性能问题
- 多级缓存
击穿
一个key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库
- 互斥锁
- 设置超时时间:
- 设置热点数据永远不过期
- 异步更新:维护value的失效时间,异步线程进行更新
6. redis并发key竞争如何解决?
一般的采用redis的事务机制,但是在集群环境下数据已经分片就很难搞,redis的事务就显得鸡肋。
分情况讨论:
- 对顺序没有要求,采用分布式锁进行排队,属于悲观锁方式
- 对顺序有要求,采用时间戳方式,在set之前比对时间戳,属于乐观锁方式
7.redis同步机制
部分重同步
- 从 Redis 2.8 开始
- 若master run id 不一致,则执行完整重同步操作
完整重同步
8. Redis Java客户端的选择
官方推荐的有三种:Jedis、Redisson和lettuce
- Jedis:A blazingly small and sane redis java client(一个非常小和正常的redis java客户端)
- Redisson:distributed and scalable Java data structures on top of Redis server(分布式和可伸缩的Java数据结构在Redis服务器上)
- lettuce:Advanced Redis client for thread-safe sync, async, and reactive usage. Supports Cluster, Sentinel, Pipelining, and codecs.(高级Redis客户端线程安全的同步,异步,和反应使用。支持集群、标记、流水线和编解码器。)