一、缓存特点
1.什么是缓存(cache)
定义:就是计算机内存中的一段数据
2.内存中数据的特点
- 读写快
- 断点立即丢失
3.redis缓存解决了什么问题
- 提高了网站吞吐量,提高网站运行效率。
- 核心解决问题:缓存的存在时用来减轻后端数据库的访问压力
4.既然缓存能提高效率,那项目中所有数据加入缓存岂不是更好?
注意:使用缓存时一定是数据库中极少发生修改,更多用于查询这种情况的,否则会引起频繁数据库和redis的更新,导致性能更差。
5.本地缓存和分布式缓存的区别?
- 本地缓存:存在应用服务器内存中的数据为本地缓存(local cache)
- 分布式缓存:存储在当前应用服务器内存之外的数据为分布式缓存(distribute cache)
集群:将同一种服务的多个节点放在一起共同对系统提供服务过程称之为集群。
分布式:有多个不同服务集群共同对系统系统提供服务这个系统称之为分布式系统(distribute system),即分布式是建立在集群之上的。
二、缓存优化策略
1.对放入redis中的可以进行优化:key的长度不能太长
尽可能将key设计的简洁一些,如果key太长可以考虑将key设计成md5码保存。
三、如何解决Redis的缓存穿透、缓存雪崩和缓存击穿
redis的缓存穿透
缓存穿透,是指查询一个数据库不存在的数据。
例如数据库中没有id=-1的数据,这时如果外界疯狂查id=-1这个数据,先查询redis没有这个数据,再查询数据库也不存在这个数据即返回空,因此一直重复这个步骤,导致数据库压力过大,而出现宕机。
解决方案:
- 对不存在的数据缓存到redis中,设置key,value值为null(不管是数据未null还是系统bug问题),并设置一个短期过期时间段,避免过期时间过长影响正常用户使用。
- 拉黑该IP地址
- 布隆过滤器 将所有可能存在的数据哈希到一个足够大的bitmap(位图)中,一个一定不存在的数据会被 这个bitmap拦截掉,从而避免了对底层存储系统的查询压力。
redis的缓存击穿
某一个热点key,在不停地扛着高并发,当这个热点key在失效的一瞬间,持续的高并发访问就击破缓存直接访问数据库,导致数据库宕机。
解决方案:
- 设置热点数据"永不过期"
- 加上互斥锁:上面的现象是多个线程同时去查询数据库的这条数据,那么我们可以在第一个查询数据的请求上使用一个互斥锁来锁住它,其他的线程走到这一步拿不到锁就等着,等第一个线程查询到了数据,然后将数据放到redis缓存起来。后面的线程进来发现已经有缓存了,就直接走缓存
redis的雪崩
在高并发下,大量缓存key在同一时间失效,大量请求直接落在数据库上,导致数据库宕机。
解决方案:
- 这种情况,我们一般是采取不同分类商品,缓存不同周期,在同一分类中的商品,加上一个随机因子,这样尽可能分散缓存过期时间,而且,热门类目的商品缓存时间长一些,冷门类目的商品缓存时间短一些,也能节省缓存服务的资源。
- 缓存永久存储(不推荐)。
- 若是集群部署,可将热点数据均匀分布在不同的Redis库中也能够避免key全部失效问题。
————————————————
版权声明:本文为CSDN博主「豆豆不是逗逗」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_18290431/article/details/115266804