首页  >  文章  >  后端开发  >  redis 缓存策略

redis 缓存策略

WBOY
WBOY原创
2016-09-06 08:57:081232浏览

在使用redis缓存数据的过程中,设计缓存思路如下:
获取数据时,先从缓存中获取数据,如果获取到的数据为空,则查询数据库,然后先将查询到的数据缓存到redis,再返回数据
但现在有两个问题请教一下大家:

  1. 如果数据库中查询的结果为空,那么不会缓存数据,因此也无法从缓存中获取数据,那么每次获取数据时都会进行一个数据库查询,这个应该怎么优化?

  2. 数据进行更新时,缓存应该怎么处理?

对这两个问题我有一点不成熟的想法,现提出来恳请大家指点一下是否可行以及是否有更好的处理方式:

对于第一个问题,如果从数据库查询没有获取到数据,那么缓存一个固定的默认值(如字符串:'nodata')表示没有数据,下次从缓存中获取数据时,得到这个固定表示没有数据的值时就直接返回空,而不用再次查询数据库

对于第二个问题,当前想法是,如果更新的数据是不是特别重要的话,那么将数据写入数据库后直接更新缓存中对应的数据,下次获取数据时不用查询数据库就能直接获取到最新的数据,但如果更新的数据是特别重要的(比如:金钱),那么将数据写入数据库后直接清除对应的缓存,下次再获取数据的时候就需要查询数据库获取最新的数据。

回复内容:

在使用redis缓存数据的过程中,设计缓存思路如下:
获取数据时,先从缓存中获取数据,如果获取到的数据为空,则查询数据库,然后先将查询到的数据缓存到redis,再返回数据
但现在有两个问题请教一下大家:

  1. 如果数据库中查询的结果为空,那么不会缓存数据,因此也无法从缓存中获取数据,那么每次获取数据时都会进行一个数据库查询,这个应该怎么优化?

  2. 数据进行更新时,缓存应该怎么处理?

对这两个问题我有一点不成熟的想法,现提出来恳请大家指点一下是否可行以及是否有更好的处理方式:

对于第一个问题,如果从数据库查询没有获取到数据,那么缓存一个固定的默认值(如字符串:'nodata')表示没有数据,下次从缓存中获取数据时,得到这个固定表示没有数据的值时就直接返回空,而不用再次查询数据库

对于第二个问题,当前想法是,如果更新的数据是不是特别重要的话,那么将数据写入数据库后直接更新缓存中对应的数据,下次获取数据时不用查询数据库就能直接获取到最新的数据,但如果更新的数据是特别重要的(比如:金钱),那么将数据写入数据库后直接清除对应的缓存,下次再获取数据的时候就需要查询数据库获取最新的数据。

  1. 你需要一个方式(比如天然可空类型或者和类型)来区分这两个情况。比如有数据的时候里边存的是一个 JSON 化的列表 [{...}, {...}],那么没数据时自然存 [] 了。总之没有冲突就行。

  2. 缓存更新的套路 | 酷 壳 - CoolShell.cn

楼上说的很有道理。
你可以参考下文件缓存的思路,
thinkphp文件缓存采取的是serialize(valle)去保存数据,文件名作为key名。清除缓存,直接set(null)来实现。
缓存只是为了查询时候的方便,减少mysql的访问次数,至于缓存更新的问题得靠代码去实现。

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn