目录
1、什么是缓存预热?
2、什么是缓存热备?
3、什么是缓存雪崩?
4、如何解决缓存雪崩?
5、什么是缓存穿透?
6、如何解决缓存穿透?
7、什么是缓存击穿?
8、如何解决缓存击穿?
9、什么是缓存抖动?
10、如何解决缓存抖动?
11、什么是缓存无底洞?
12、如何解决缓存无底洞?
13、如何解决Redis和数据库双写一致性问题?
14、Redis有哪些危险命令?如何防范?
1、什么是缓存预热?
缓存预热就是新的缓存系统没有任何缓存数据序在缓存重建数据的过程中,系统性能和数据库负载都不太好,所以最好是在系统上线之前就把要缓存的热点数据加载到缓存中,这种缓存预加载手段就是缓存预热。
2、什么是缓存热备?
缓存热备即当一台缓存服务器不可用时能实时切换到备用缓存服务器,不影响缓存使用。
集群模式下,每个主节点都会有一个或多个从节点来当备用,一旦主节点挂了,从节点立即充当主节点使用。
3、什么是缓存雪崩?
缓存雪崩就是指由于缓存的原因,导致大量请求到达后端数据库,从而导致数据库崩溃,整个系统崩溃,发生灾难。
4、如何解决缓存雪崩?
缓存雪崩解决方案:
给缓存的失效时间,加上一个随机值,避免集体失效。
1)双缓存,我们有两个缓存,缓存A和缓存B。
缓存A的失效时间为20分钟,缓存B不设失效时间。自己做缓存预热操作。然后细分以下几个小点:从缓存A读数据,有则直接返回;
A没有数据;a直接从B读数据,直接返回,并且异步启动一个更新线程,更新线程同时更新缓存A和缓存B。
2)LRU与LFU切换
3)超热数据使用永久key
4)定期维护(自动+人工)
对即将过期数据做访问量分析,确认是否延时,配合访问量统计,做热点数据的延时
5)加锁(慎用)
5、什么是缓存穿透?
缓存穿透指在高并发场景下,如果某个key被高并发访问,没有被命中,出于对容错性考虑,会尝试去从后端数据库中获取,从而导致了大量请求达到数据库,而当该key对应的数据本身就是空的情况下,这就导致数据库中并发的去执行了很多不必要的查询操作,从而导致巨大冲击和压力。
简单总结:
缓存击穿:热点数据,数据库压力大
缓存穿透:本来就是空数据,redis没有该数据,数据库没有该数据
6、如何解决缓存穿透?
缓存穿透解决方案: .
1.缓存空对象
对查询结果为空的对象也进行缓存,如果是集合,可以缓存一个空的集合(非nul) ,如果是缓存单个对象,可以通过字段标识来区分。这样避免请求穿透到后端数据库。
同时,也需要保证缓存数据的时效性。这种方式实现起来成本较低,比较适合命中不高,但可能被频繁更新的数据。
2.单独过滤处理
对所有可能对应数据为空的key进行统一的存放,并在请求前做拦截这样避免请求穿透到后端数据库。这种方式实现起来相对复杂,比较适合命中不高,但是更新不频繁的数据。
7、什么是缓存击穿?
缓存击穿:实际上是缓存雪崩的一个特例,大家使用过微博的应该都知道,微博有一个热门话题的功能,用户对于热门话题的搜索量往往在一些时刻会大大的高于其他话题,这种我们称为系统的“热点”。
由于系统中对这些热点的数据缓存也存在失效时间,在热点的缓存到达失效时间时,此时可能依然会有大量的请求到达系统,没有了缓存层的保护,这些请求同样的会到达从而可能引起故障。
击穿与雪崩的区别即在于击穿是对于特定的热点数据来说,而雪崩是全部数据。
8、如何解决缓存击穿?
解决方案:
1)对于热点数据进行二级缓存:
2)对于不同级别的缓存设定不同的失效时间
9、什么是缓存抖动?
缓存抖动可以看做是一种比”缓存雪崩”更轻微的缓存故障,一般是由于缓存节点故障导致,但是也会在一段时间内对系统造成冲击和性能影响。
10、如何解决缓存抖动?
一般是由于缓存节点故障导致,业内推荐的做法是通过一致性Hash算法来解决。
11、什么是缓存无底洞?
该问题由facebook的工作人员提出的facebook在2010 年左右,memcached 节点就已经达3000个示缓存数千G内容。
他们发现了一个问题: memcached连接频率,导致效率下降了,于是加memcached节点,添加了后,发现因为连接频率导致的问题,仍然存在,并没有好转,称之为”无底洞现象”。
目前主流的数据库、缓存、NoSQL、 搜索中间件等都支持分片技术,来满足高性能、高并发、高可用、可扩展等要求,每一次操作都可能需要和不同节点进行网络通信来完成,实例节点越多,则开销会越大,对性能影响就越大。
缓存无底洞现象并不常见,在绝大多数的公司里可能根本不会遇到。
12、如何解决缓存无底洞?
可以从如下几个方面避免和优化:
1.不同的数据分布方式
有些业务数据可能适合Hash分布,而有些业务适合采用范围分布,这样能够从一定程度避免网络IO的开销。
2. I0优化
可以充分利用连接池,NIO等技术来尽可能降低连接开销,增强并发连接能力。
3.一次性获取大的数据集
一次性获取大的数据集,会比分多次去获取小数据集的网络IO开销更小。
13、如何解决Redis和数据库双写一致性问题?
当数据时效性要求很高时,需要保证缓存中的数据与数据库中的保持一致,而且需要保证缓存节点和副本中的数据也保持一致, 不能出现差异现象,这就比较依赖缓存的过期和更新策略。
一般会在数据发生更改的时,主动更新缓存中的数据或者移除对应的缓存。
1)采取正确更新策略,先更新数据库,再删缓存。
2)可能存在删除缓存失败的问题,提供一个消息队列作补偿措施。
14、Redis有哪些危险命令?如何防范?
Redis有哪些危险命令?
Redis的危险命令主要有以下几个:
●keys
客户端可查询出所有存在的键。.
●flushdb
删除Redis中当前所在数据库中的所有记录,并且此命令从不会执行失败。
●flushall
删除Redis中所有数据库中的所有记录,不只是当前所在数据库,并且此命令从不会执行失败。
●config
客户端可修改Redis配置。
怎么禁用或重命名危险命令?
看下redis.conf
默认配置文件,找到SECURITY区域,如以下所示。
看说明,添加rename- command配置即可达到安全目的。
1)禁用命令
2)重命名命令
上面的x可以定义新命令名称或者用随机字符代替。
经过以上的设置之后,危险命令就不会被客户端执行了。