Web开发-缓存穿透 缓存并发 缓存雪崩等一系列开发常见的缓存常识

来源:互联网 发布:反欺诈 社交网络模型 编辑:程序博客网 时间:2024/06/05 15:19

作为WEB开发人员,缓存是最基本也是最常用的知识了,开发中在实现业务的时候总会通过缓存来实现功能,但是如果你用了缓存,你就得注意缓存带来的一系列隐藏的问题。常用的缓存一般是查到又缓存就读取缓存,没有缓存就读取数据库,所以就有可能遇到缓存穿透、缓存雪崩、缓存并发、缓存一致性等问题,下面我介绍一下开发中对这些问题我的解决方法。

缓存穿透:
这个问题应该最常见的问题了,缓存穿透是啥意思呢?就是大量的请求没有走缓存,直接落地数据库,导致数据库压力很大,甚至宕机。举个例子吧,比如说,立即购买的时候你得传递商品编码到服务端,正常情况下都是从缓存里查询商品详情的信息然后生成提交订单的页面,但是如果此时这个商品id是不存在的,那么缓存里面是没有这个商品的信息的,然后就会落地数据库,只要量大起来,数据库压力就高了,这里可以采用一个简单粗暴的方法。
首先,当数据库查不到该商品的信息的时候,设置一个表示空的标识(比如说:NULL_EMPTY)到缓存里,如果以后再请求到这个商品的信息,读到缓存里的值是NULL_EMPTY,那么就认为没有这个商品的信息。这样就会避免大量不存在的商品信息请求访问数据库。

缓存并发:
当缓存过期后会去查询数据库,并发量一起来就会造成数据库压力大,不仅如此,如果此时会做更改数据库的操作的时候,会造成数据一致性的问题,那么,该如何解决这个问题呢,我们应该在当缓存过期的时候第一次查询数据库的时候加锁,当数据处理完放入缓存后再释放该锁,同一时间其他的请求就等待这次处理完成直接读缓存就可以了。

缓存失效:
一般在开发的时候,我们总喜欢给缓存设置一个有效期,但是,当大量的缓存在同一时间失效会造成下一次访问这些的数据都去同时读取数据库,这样其实也是不合理的,应该是给这些相同类型的缓存设置一个有效期区间,通过一致性Hash算法甚至简单的随机数来把有效期均匀分布在这个时间段内。这样能避免大量缓存在同一时间失效引起的数据库压力。

0 0
原创粉丝点击