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局部刷新缓存的方法。

  • 相关阅读:
    VIM常用操作
    计算机之二进制基础
    交换机安全学习笔记 第六章 IPV4 ARP攻击
    交换机安全学习笔记 第八章 针对POE的攻击
    交换机安全学习笔记 第九~十章 HSRP VRRP
    CSRF-DVWA_1.9-笔记
    命令注入-笔记
    暴力破解-H3C路由器-MSR900
    暴力破解-DVWA_1.9-笔记
    DVWA、 DSVM 环境搭建简述
  • 原文地址:https://www.cnblogs.com/uuhorse/p/9885878.html
Copyright © 2011-2022 走看看