本文主要是介绍Web开发来一发(七)缓存,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、缓存概念
1、缓存雪崩
可能是因为数据未加载到缓存中,或者缓存同一时间大面积的失效,从而导致所有请求都去查数据库,导致数据库CPU和内存负载过高,甚至宕机。
解决思路:
1)加锁计数(即限制并发的数量,可以用semphore)或者起一定数量的队列来避免缓存失效时大量请求并发到数据库。但这种方式会降低吞吐量。
2)分析用户行为,然后失效时间均匀分布。或者在失效时间的基础上再加1~5分钟的随机数。
3)如果是某台缓存服务器宕机,则考虑做主备。
2、缓存穿透
指用户查询数据,在数据库没有,自然在缓存中也不会有。这样就导致用户查询的时候,在缓存中找不到,每次都要去数据库中查询。
解决思路:
1)如果查询数据库也为空,直接设置一个默认值存放到缓存,这样第二次到缓冲中获取就有值了,而不会继续访问数据库。设置一个过期时间或者当有值的时候将缓存中的值替换掉即可。
2)可以给key设置一些格式规则,然后查询之前先过滤掉不符合规则的Key。
3、缓存并发
如果网站并发访问高,一个缓存如果失效,可能出现多个进程同时查询DB,同时设置缓存的情况,如果并发确实很大,这也可能造成DB压力过大,还有缓存频繁更新的问题。解决思路:
对缓存查询加锁,如果KEY不存在,就加锁,然后查DB入缓存,然后解锁;其他进程如果发现有锁就等待,然后等解锁后返回数据或者进入DB查询。
4、缓存预热
目的就是在系统上线前,将数据加载到缓存中。
解决思路:
1)数据量不大的话,在系统启动的时候直接加载。
2)自己写个简单的缓存预热程序。
二、常见缓存
1、Redis
https://blog.csdn.net/ss1300460973/article/details/90289504
2、Memcached
Memcached是一个高性能的分布式内存对象缓存系统。
Memcached只支持简单的key/value数据结构,不像Redis可以支持丰富的数据类型。
Memcached无法进行持久化,数据不能备份,只能用于缓存使用,且重启后数据全部丢失。
Memcached可以利用多核优势,单实例吞吐量极高,可以达到几十万QPS。
3、MongoDB
MongoDB是一个介于关系数据库和非关系数据库之间的NoSQL数据库,是非关系数据库当中功能最丰富,最像关系数据库的产品。MongoDB支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。
MongoDB支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
MongoDB适合大数据量的存储,依赖操作系统VM做内存管理,很占内存。
MongoDB不支持事务。
4、应用场景
Redis适用于对读写效率要求都很高,数据处理业务复杂和对安全性要求较高的系统。
MongoDB主要解决海量数据的访问效率问题。
Memcached用于在动态系统中减少数据库负载,适合多读少写的场景。
参考资料:
https://www.cnblogs.com/boazy/p/Redis.html
https://blog.csdn.net/qq_36520235/article/details/84557035
这篇关于Web开发来一发(七)缓存的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!