• 记录Redis使用中遇到的两个问题(原子性及数据完整性)


    1、使用Redis作为分布式锁的原子性问题

      原方案:

      ① SETNX $LOCK_BUSI_KEY $REQ_ID

      ② EXPIRE $LOCK_BUSI_KEY $LOCK_TIME

      问题:

      使用SETNX,如果锁不存在,则SET成功,返回1;否则,返回0。

      为了保证锁在异常退出时,仍能超时释放,使用了EXPIRE;但是由于①和②为非原子操作,导致EXPIRE未能设置成功,造成死锁。

      修复方案:

      Redis从2.6.12版本开始,在SET命令中增加了EX选项支持设置过期时间,NX参数设置KEY不存在时才写入值

      SET $LOCK_BUSI_KEY $REQ_ID EX $LOCK_TIME NX

    2、Redis的hset导致hgetAll数据不完整的问题

      问题:

      将config写入DB,业务获取所有的config时加载到Redis缓存,放入set中。即service.getAll执行Redis.hgetAll加载数据,若未命中,则从DB加载到Redis中。

      另外,在业务更新config时,允许单条更新,DB更新成功后,单独hset刷新到Redis缓存。或者service允许get单条数据,未命中缓存时,从DB加载单条hset到Redis。

      问题症状:

        会导致hgetAll返回的数据与DB数据不一致,可能比DB的条数少。

      修复方案:

        不允许单独执行hset局部刷新缓存的方法。

  • 相关阅读:
    实验四 决策树
    实验三 朴素贝叶斯算法及应用
    实验二 k邻近算法及应用
    实验一 感知器及其应用
    实验三 面向对象分析与设计
    个人作业三---ATM管理系统
    流程图与活动图的区别于联系
    个人作业---四则运算生成程序
    面向对象分析与设计
    结构化分析与设计
  • 原文地址:https://www.cnblogs.com/uuhorse/p/9885878.html
Copyright © 2020-2023  润新知