记录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局部刷新缓存的方法。
记录Redis使用中遇到的两个问题(原子性及数据完整性)的更多相关文章
- 【运维技术】redis(一主两从三哨兵模式搭建)记录
redis(一主两从三哨兵模式搭建)记录 目的: 让看看这篇文章的的人能够知道:软件架构.软件的安装.配置.基本运维的操作.高可用测试.也包含我自己,能够节省对应的时间. 软件架构: 生产环境使用三台 ...
- Redis 备份数据的两种方式
既然是数据库,那就一定有数据备份方式了,而且 Redis 是内存形式的数据库,更需要数据备份了,要不然断电数据就全都丢失了. Redis 数据备份有两种方式: RDB(数据快照) AOF(记录操作日志 ...
- oracle相邻表记录交换(单双两两交换)
在博客园的博问中看到了一个这样的提问:一个表中有id和name两个字段,id是连续非空不重复的,想要交换相邻表记录的name值(单双两两交换). 另外,如果最后的单独行没有对应的下一行匹配记录的话,就 ...
- sql server相邻表记录交换(单双两两交换)
在博客园的博问中看到了一个这样的提问:一个表中有id和name两个字段,id是连续非空不重复的,想要交换相邻表记录的name值(单双两两交换). 另外,如果最后的单独行没有对应的下一行匹配记录的话,就 ...
- Redis中的原子操作(2)-redis中使用Lua脚本保证命令原子性
Redis 如何应对并发访问 使用 Lua 脚本 Redis 中如何使用 Lua 脚本 EVAL EVALSHA SCRIPT 命令 SCRIPT LOAD SCRIPT EXISTS SCRIPT ...
- 新姿势!Redis中调用Lua脚本以实现原子性操作
背景:有一服务提供者Leader,有多个消息订阅者Workers.Leader是一个排队程序,维护了一个用户队列,当某个资源空闲下来并被分配至队列中的用户时,Leader会向订阅者推送消息(消息带有唯 ...
- redis(一主两从三哨兵模式搭建)记录
转自:http://www.cnblogs.com/fly-piglet/p/9836314.html 目的: 让看看这篇文章的的人能够知道:软件架构.软件的安装.配置.基本运维的操作.高可用测试.也 ...
- Redis中持久化的两种方法详解
Redis提供了两种不同的持久化方法来将数据存储到硬盘里面.一种方法叫快照(snapshotting),它可以将存在于某一时刻的所有数据都写入硬盘里;另一种方法教只追加文件(append-only f ...
- Redis的持久化的两种方式drbd以及aof日志方式
redis的持久化配置: 主要包括两种方式:1.快照 2 日志 来看一下redis的rdb的配置选项和它的工作原理: save 900 1 // 表示的是900s内,有1条写入,则产生快照 save ...
随机推荐
- Windows下Redis安装过程
1.去github下载Redis-x64-2.8.2402.zip压缩包 2.将压缩包解压到你要安装的目录下 3.将redis设置为开机自启动服务 redis-server --service-ins ...
- RxJS核心概念之Subjet在angular2+上的应用
Subject,在RxJS中是一类特殊的Observable(可观察对象),它可像多个Observer(观察者)推送值.每一个Subject也可以作为Observer(观察者) Subject同样也是 ...
- HTML5-全局属性
HTML5-全局属性 HTML 属性赋予元素意义和语境.全局属性可用于任何 HTML 元素. contentEditable - 规定元素内容是否可编辑.- 注释:如果元素未设置 contentedi ...
- Unity 常用插件1
作者:Meta42链接:https://www.zhihu.com/question/29097415/answer/229015898来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转 ...
- JavaScript属性(第三天)
js语法非常灵活,这致使他非常好用,也造成它比较难掌握的地方: js中的值类型与引用类型在这里不做过多介绍,可以参照其他语言. js是可以动态添加属性的: var person={}; person. ...
- 第五章JavaScript
创建数组://1.字面量方式创建 (推荐大家使用这种方式创建数组 简单粗暴) var colors = ['red','color','yellow'];console.log(colors) //空 ...
- linux的基本操作(一)
一.Linux组成 1.1:Linux各模块介绍 内核:是系统的心脏,是运行程序和管理像磁盘和打印机等硬件设备的核心程序. Shell:是系统的用户界面,提供了用户和内核进行交互操作的一种接口.它接收 ...
- python-变量、if else语句 、for循环、while循环(4月26号)
变量: 五.注意:python是可执行程序 在linux写python第一行必须写#!/usr/bin/env python(声明解释器在windows中写python第一行需要写# -*- codi ...
- 通过企业微信API接口发送消息
最近给公司测试组内部开发一个记账小工具,当账目出现问题的时候需要发送消息通知大家,前期主要采用的QQ发送通知消息,但是有一天突然无法连接到QQ服务器,运维的同学建议采用微信的方式对接然后进行告警,所以 ...
- LOJ 2548 「JSOI2018」绝地反击 ——二分图匹配+网络流手动退流
题目:https://loj.ac/problem/2548 如果知道正多边形的顶点,就是二分答案.二分图匹配.于是写了个暴力枚举多边形顶点的,还很愚蠢地把第一个顶点枚举到 2*pi ,其实只要 \( ...