Heim > Fragen und Antworten > Hauptteil
现在的方案是,sql 作为key 查询结果序列化后 存入value 。表如果有数据修改添加删除,flushDB()。
但是整个项目只要有数据变更缓存就没了。
谁还有其他方案?
想知道的就是数据增删改对redis都有操作后再对数据库操作,redis里查询的永远是最新的,当某些原因redis里查不到时查数据库然后保存到reids里。
这种方案有谁实现了吗?
高洛峰2017-04-18 09:15:22
为啥要用sql作为key....还每次flushdb,你可以换个思路,假如有个表是商品,主键是id,你可以建一个key是detail:商品id的缓存,把这行记录作为value,数据类型hash或string都行。有些时候你的业务要根据主键查某条商品信息的时候,先去redis看看有没有detail:主键的缓存,有的时候就直接取缓存,没有命中缓存然后查数据库,并把查询结果存入缓存。还有就是当有该条记录变更的时候,可以直接删掉缓存,也可以update缓存。
这只是一个很简单的例子,redis数据类型很丰富的,合理使用可以用得很爽。还有,上面例子,可以设置每个缓存后给这条缓存设置一个有效期,好比一周,看你业务了。一般来说老的东西用户看得比较少,那么到期后没人浏览就不重建了,保证你redis一直是热数据。不至于一堆陈年数据,手机打字好累,有用请给赞
ringa_lee2017-04-18 09:15:22
缓存的意义就是存储热门的数据,比如说在redis中存储数据库经常要用到的数据,这样就不必每次查询数据库了。
楼主遇到的问题是缓存里的数据如何跟数据库的数据保持一致的问题。
像上面说到的表如果有数据修改添加删除,flushDB()
,是不可取的。
对缓存数据的操作实际上简化下来就是读和写
当你的应用查询redis时,如果发现查不到,这个时候就要去查数据库,并把查出来的数据存到redis中。
当数据库的数据有改动时,上面说到的数据增删改对redis都有操作后再对数据库操作
,其实也是不可取的,应用应先修改数据库,成功了之后再对redis更新。如果先对redis更新,但对数据库的更新失败了怎么办?redis不就存储有脏数据了吗。
另外,缓存中的数据是可以设置失效时间的(expire timeout),过了失效时间,就再查一次数据库,更新一下数据(即使数据根本没变过),在失效时间之前,至少减少了数据库的负载。
看楼主题目的意思,有一种想把redis当做数据库数据的备份一样,那样就不是用redis缓存的意义了(也许应该考虑数据库主从备份)。
至于你说的方案,看题目的描述,这并不是需要一个方案(我觉得高可用配置,考虑数据的一致性强弱等等方面才称之为方案)。
实际上是代码的逻辑,看代码怎么写。
迷茫2017-04-18 09:15:22
你实现一个缓存系统,一定要考虑这三个问题(第三个问题为可选)
缓存的加载
缓存的失效
缓存的更新(可选)
缓存的加载, 你要做的很简单. 就是任何查询,首先查询缓存, 缓存没有命中,再查数据库.
缓存的失效,你要做的就是在任何对数据库的修改(更新,删除)时. 记得删除缓存.
数据有更新时,不对缓存做失效删除,而是对缓存进行更新.这个可选的操作,可以帮你实现缓存永远是最新的效果.
针对问题3,还有一个问题就是. 不要在数据库还没有更新成功之前就更新缓存. 更新数据库有可能失败, 这时如果你的缓存没有还原, 就会出现脏数据.