官方文档 - 原文

redis-github

redis-office

1. Redis是什么?为什么?怎么用?

Redis是数据结构存储,键值数据库

2. Redis的数据存储方式,操作方法,读写操作在底层是如何实现的?

3. Redis的原子操作是什么?CAP定理是什么?

4. 什么是Redis持久化?Redis有哪几种持久化方式?优缺点是什么?

1、默认快照(snapshots)RDB文件存储 2、提供AOF文件存储可选 3、虚拟内存方式

5. Redis的通讯协议(RESP)是什么?有什么特点?

6. Redis的缓存失效策略和主键失效机制是什么?

7. Redis有哪些架构模式?各自有什么特点?

1、单机版本;2、主重复制;3、哨兵;4、集群(proxy代理);5、集群(直连型)

8. 什么是一致性哈希算法?

参考1 参考2

9. Redis分布式锁,它是怎么实现的?WATCH命令和基于CAS的乐观锁?

10. Redis做异步队列,怎么用?什么缺点?

消息队列rpush生产消息,lpop消费消息。如果消费者下线,消息会消失,需要使用专业的队列如rabbitmq

11. 什么是缓存穿透?如何避免?什么是缓存雪崩?如何避免?

缓存穿透:一般的缓存系统,都是按照key去缓存查询,如果不存在对应的value,就应该去后端系统查找(比如DB)。一些恶意的请求会故意查询不存在的key,请求量很大,就会对后端系统造成很大的压力。这就叫做缓存穿透。 如何避免缓存穿透?1:对查询结果为空的情况也进行缓存,缓存时间设置短一点,或者该key对应的数据insert了之后清理缓存。2:对一定不存在的key进行过滤。可以把所有的可能存在的key放到一个大的Bitmap中,查询时通过该bitmap过滤。 缓存雪崩: 当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,会给后端系统带来很大压力。导致系统崩溃。 如何避免缓存雪崩?1:在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。2:做二级缓存,A1为原始缓存,A2为拷贝缓存,A1失效时,可以访问A2,A1缓存失效时间设置为短期,A2设置为长期 3:不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀。

12. mySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据