首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Redis过期时间引发的问题

开发项目的时候遇到了这个问题:向一个有过期时间的hash进行HINCRBY操作,然而这个时候hash已经过期,因此在HINCRBY操作的时候,又从0开始了,然后再用已经错了的数据更新到MySQL那向,导致数据异常。

假如有一个文章详情(当然实际遇到的不是文章详情)的hash,key是article:[artilcle_id],结构大概为:

考虑到有些文章时间久了之后,它的访问很低,或者没有访问量,给它设置了过期时间(expire)。

现在有用户在访问了id为1的文章,在读redis时,刚好读取成功,然而到我们开始更新read_num的时候,article:1已经过期,即这个key的数据已经不存在,这个时候HINCRBY操作之后,更新操作成功,但此时read_num的值是由0加到1,而article:1下也只有read_num这个字段,同时它也没有了过期时间,用HINCRBY之后返回的结果向数据库写入后,也造成数据库的数据异常。

再访问article:1的时候,因为redis有这个数据,于是就没有向数据库取的操作,而这个时候,article:1下没有其他字段,会导致程序异常。

因此在更新Redis的时候,不应该直接对一个字段(比如上面的read_num)更新,应该对整个hash更新,并设置过期时间。同时考虑到存在并发,因为对增长性的字段,应该用增长操作,而不是和其他字段那样进行hMset。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190409A0PJSQ00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券