Redis-面试问题
1、什么是 Redis? 简述它的优缺点?
Redis 的全称是:Remote Dictionary.Server,本质上是一个 Key-Value 类型的类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据 flush 到硬盘上进行保存。
因为是纯内存操作,Redis 的性能非常出色,每秒可以处理超过 10 万次读写操作,是已知性能最快的 Key-Value DB。
2、Redis 与 memcached 相比有哪些优势?
(1)、memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型。
(2)、redis 的速度比 memcached 快很多 redis 的速度比 memcached 快很多
(3)、Redis 支持哪几种数据类型? String、List、Set、Sorted Set、hashes
3、Redis 过期策略都有哪些? LRU算法知道吗? 写一下 java代码实现?
1、过期策略:
定时过期(key--定时器),惰性过期:只有使用 key 时才判断 key 是否已过期,过期则清除。定期过期:设定时间过期。
4、缓存穿透、缓存击穿、缓存雪崩解决方案?
(1)、缓存穿透:
指查询一个一定不存在得数据,如果从存储层查不到数据则不写入缓存,这将导致不存在得数据每次请求都要到DB去查询,可能导致 DB 挂掉。
解决方案:1、查询返回得数据为空,仍把这个空结果进行缓存,但过期时间会比较短;2、布隆过滤器:将所有存在的数据哈希到一个足够大的 bitmap 中,一个一定不存在的数据会被这个 bitmap 拦截掉,从而避免了对 DB的查询。
(2)、缓存击穿:
对于设置了过期时间的 key,缓存在某个时间点过期的时候,恰好这时间点对这个 key 有大量的并发请求过来,这些请求发现缓存过期一般都会从后端 DB 加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把 DB 压垮。
解决方法:1、使用互斥锁:当缓存失效时,不立即去 load db,先使用 Redis 的 setnx 去设置一个互斥锁,当操作成功返回时再进行 load db 的操作并回设缓存,否则重试 get 缓存的方法。2、永远不过期:物联不过期,但逻辑工期(后台异步线程刷新)
(3)、缓存雪崩:
设置缓存时采用了相同的过期时间,导致缓存某一时刻同时失效,请求全部转发到DB,DB瞬时压力过重雪崩。与缓存击穿的区别:雪崩是很多 key ,击穿是某一个 key 缓存。
解决方法:将缓存失效时间分散开,比如可以在原有的失效时间基础上增加一个随机值,比如1-5分钟随机,这样每一个缓存的过期时间重复率就会降低,就很难引发集体失效的事情。
