redis 缓存策略
获取数据时,先从缓存中获取数据,如果获取到的数据为空,则查询数据库,然后先将查询到的数据缓存到redis,再返回数据
但现在有两个问题请教一下大家:
如果数据库中查询的结果为空,那么不会缓存数据,因此也无法从缓存中获取数据,那么每次获取数据时都会进行一个数据库查询,这个应该怎么优化?
数据进行更新时,缓存应该怎么处理?
对这两个问题我有一点不成熟的想法,现提出来恳请大家指点一下是否可行以及是否有更好的处理方式:
对于第一个问题,如果从数据库查询没有获取到数据,那么缓存一个固定的默认值(如字符串:'nodata')表示没有数据,下次从缓存中获取数据时,得到这个固定表示没有数据的值时就直接返回空,而不用再次查询数据库
对于第二个问题,当前想法是,如果更新的数据是不是特别重要的话,那么将数据写入数据库后直接更新缓存中对应的数据,下次获取数据时不用查询数据库就能直接获取到最新的数据,但如果更新的数据是特别重要的(比如:金钱),那么将数据写入数据库后直接清除对应的缓存,下次再获取数据的时候就需要查询数据库获取最新的数据。
回复内容:
在使用redis缓存数据的过程中,设计缓存思路如下:
获取数据时,先从缓存中获取数据,如果获取到的数据为空,则查询数据库,然后先将查询到的数据缓存到redis,再返回数据
但现在有两个问题请教一下大家:
如果数据库中查询的结果为空,那么不会缓存数据,因此也无法从缓存中获取数据,那么每次获取数据时都会进行一个数据库查询,这个应该怎么优化?
数据进行更新时,缓存应该怎么处理?
对这两个问题我有一点不成熟的想法,现提出来恳请大家指点一下是否可行以及是否有更好的处理方式:
对于第一个问题,如果从数据库查询没有获取到数据,那么缓存一个固定的默认值(如字符串:'nodata')表示没有数据,下次从缓存中获取数据时,得到这个固定表示没有数据的值时就直接返回空,而不用再次查询数据库
对于第二个问题,当前想法是,如果更新的数据是不是特别重要的话,那么将数据写入数据库后直接更新缓存中对应的数据,下次获取数据时不用查询数据库就能直接获取到最新的数据,但如果更新的数据是特别重要的(比如:金钱),那么将数据写入数据库后直接清除对应的缓存,下次再获取数据的时候就需要查询数据库获取最新的数据。
你需要一个方式(比如天然可空类型或者和类型)来区分这两个情况。比如有数据的时候里边存的是一个 JSON 化的列表
[{...}, {...}]
,那么没数据时自然存[]
了。总之没有冲突就行。缓存更新的套路 | 酷 壳 - CoolShell.cn
楼上说的很有道理。
你可以参考下文件缓存的思路,
thinkphp文件缓存采取的是serialize(valle)去保存数据,文件名作为key名。清除缓存,直接set(null)来实现。
缓存只是为了查询时候的方便,减少mysql的访问次数,至于缓存更新的问题得靠代码去实现。
上一篇: Nginx+CI出现404错误
下一篇: 关于HTTPS的七个误解