专业编程基础技术教程

网站首页 > 基础教程 正文

编程中非常小又容易犯的错误(六)

ccvgpt 2024-08-08 13:07:29 基础教程 11 ℃

通常为了提高访问速度,我们会对一些热门数据进行缓存,比如数据库里我们有这样的信息。

三种商品信息,这种频繁使用的商品信息,如果我们每次都走DB取数据的话,连接读取的开销是非常大的。所以我们一般会把这些商品数据加载到Redis里。当我们商品信息非常多的时候,我们还要将数据设置过期时间来释放它所占用的内存空间。

编程中非常小又容易犯的错误(六)

那么伪代码可以像这样写redis.setex(goods_key,7*24*3600,json_encode(goods_info))。设置7天过期时间。取数据的时候只需要redis.get(goods_key)即可获取数据。如果取不出来数据,我们直接从DB中再次reload一次。

伪代码如下(不包含任何语法规范,仅表达逻辑思路,请勿直接copy使用)

到这里,看着逻辑上是没有问题了。但是当我们传入的goods_id 如果是一个不存在的id会怎么样呢?

这里面的数据会读完redis读DB,然后返回给接口。假如有并发的话,这就是一个不停的从DB要数据的过程,不仅不能降低DB的压力,还会增加redis的负担。这种现象就是我们说的缓存穿透。那么如何避免呢?

实际上,我们在第一次取DB的时候,碰到没有的数据,我们写入一个特殊标记,防止代码以为是缓存过期,每次从DB中reload数据。改良后的伪代码可以是这样。

上面会写入一个特殊的商品不存在信息,这样我们在取到信息的时候,做一层判断即可。

Tags:

最近发表
标签列表