redis的数据失效后重新写入的问题

weixin_40158246 2017-12-15 10:56:07
在redis失效后:
1.假如A客户端对一条数据修改,修改完后要将数据库中的数据重新写入redis,但是这样的话需要等数据写入redis后函数才能返回,那么这次修改A客户端等待时间会很长,怎样让函数先返回,再去把数据库数据写入redis。

2.假如redis失效后,我们只在查询操作时才将数据写入redis,那么有个问题,A客户端执行查询和B客户端执行修改,两者同时判断redis都是已经失效了,如果A客户端先把数据写入redis后,B客户端才执行完修改,那么内存中的数据和数据库的数据就不一致了。

请问怎么解决这个问题?
...全文
627 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Enchanter, 2017-12-25
  • 打赏
  • 举报
回复
OK,问题说明白了就好,首先,要给你讲解个基础类容。  Redis对存储值的过期处理实际上是针对该值的键(key)处理的,即时间的设置也是设置key的有效时间。Expires字典保存了所有键的过期时间,Expires也被称为过期字段。 expire key time(以秒为单位)--这是最常用的方式 setex(String key, int seconds, String value)--字符串独有的方式 注:   1、除了字符串自己独有设置过期时间的方法外,其他方法都需要依靠expire方法来设置时间   2、如果没有设置时间,那缓存就是永不过期   3、如果设置了过期时间,之后又想让缓存永不过期,使用persist key 看明白了么?也就是说,如果没有设置过期时间,redis的缓存是永久都在,甚至有时候清理需要手动去清理。 所以你说的问题是不存在,但是你却碰到这个问题了,那么只有一种可能,那就是KEY值复用导致value被替换了。还有一个可能,程序里对redis的数据进行了定时清理逻辑,把这个逻辑去掉就好。
oyljerry 2017-12-25
  • 打赏
  • 举报
回复
这个主要是考虑一下cache系统的做法 比如write through,写入的时候,数据写入数据库,同时对redis对应数据进行失效。这样比重新写要快。 读取的时候,就是去数据库读一次,然后更新redis 至于A,B同时修改,这本来就是线程同步的问题,有可能A先到,有可能B先到。这不是redis来控制的。
weixin_40158246 2017-12-15
  • 打赏
  • 举报
回复
引用 1 楼 mj280824108 的回复:
说实话,你的语言表达能力有些问题,又是redis失效了,又A客户端先把数据写入redis,又B客户端执行修改,都失效了,肯定都报错了,哪还有后面这些种种? 但是你的大致意思我猜到了,总结一下,无非就是一句话,redis挂了失效了,该怎么办。方法一:当程序逻辑判定redis挂掉了,发出报警并转用预备的第二套业务处理逻辑去继续维持整个业务的正常运行。方法二:写一个启动程序或脚本,当程序逻辑判断redis失效了挂了,直接重启。方法三:主从redis,骚年,要记住,任何事情要做两手准备。这三个方法可以根据你的情况去单独使用或者套用,自己看着办吧
大佬,我没说清楚,我指的是键的生存时间或过期时间。不是指redis挂了。就比如数据库有张学生表,然后我用map集合把数据存入redis(template.opsForValue().set("students",studentMap);) 。然后有一段时间客户端没对这个数据进行操作,键过期,内存中的数据被清理后又有客户端来操作这些数据,需要重新写入,这时候,在上面1和2情况下怎么处理?
Enchanter, 2017-12-15
  • 打赏
  • 举报
回复
说实话,你的语言表达能力有些问题,又是redis失效了,又A客户端先把数据写入redis,又B客户端执行修改,都失效了,肯定都报错了,哪还有后面这些种种? 但是你的大致意思我猜到了,总结一下,无非就是一句话,redis挂了失效了,该怎么办。方法一:当程序逻辑判定redis挂掉了,发出报警并转用预备的第二套业务处理逻辑去继续维持整个业务的正常运行。方法二:写一个启动程序或脚本,当程序逻辑判断redis失效了挂了,直接重启。方法三:主从redis,骚年,要记住,任何事情要做两手准备。这三个方法可以根据你的情况去单独使用或者套用,自己看着办吧

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧