zoukankan      html  css  js  c++  java
  • 记录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局部刷新缓存的方法。

  • 相关阅读:
    POJ 1703 Find them, Catch them
    POJ 2236 Wireless Network
    POJ 2010 Moo University
    POJ 2184 Cow Exhibition
    POJ 3280 Cheapest Palindrome
    POJ 3009 Curling 2.0
    POJ 3669 Meteor Shower
    POJ 2718 Smallest Difference
    POJ 3187 Backward Digit Sums
    POJ 3050 Hopscotch
  • 原文地址:https://www.cnblogs.com/uuhorse/p/9885878.html
Copyright © 2011-2022 走看看