redis原子性读写操作

  最近在开发电商平台的子系统——储值卡系统,系统核心业务涉及到金额消费以及库存控制,因此为了解决建立在内存上高并发情况下的事务控制,使用了spring封装的RedisTemplate执行lua脚本进行原子性操作,确保金额消费,库存按顺序处理,解决资源争抢。

  

  1.使用lua脚本

  Redis 使用单个 Lua 解释器去运行所有脚本,并且, Redis 也保证脚本会以原子性(atomic)的方式执行:当某个脚本正在运行的时候,不会有其他脚本或 Redis 命令被执行。这和使用 MULTI / EXEC 包围的事务很类似。在其他别的客户端看来,脚本的效果(effect)要么是不可见的(not visible),要么就是已完成的(already completed)。

  另一方面,这也意味着,执行一个运行缓慢的脚本并不是一个好主意。写一个跑得很快很顺溜的脚本并不难,因为脚本的运行开销(overhead)非常少,但是当你不得不使用一些跑得比较慢的脚本时,请小心,因为当这些蜗牛脚本在慢吞吞地运行的时候,其他客户端会因为服务器正忙而无法执行命令。

  2.实现watch机制

  

  MULTI

  标记一个事务块的开始。

  事务块内的多条命令会按照先后顺序被放进一个队列当中,最后由 EXEC 命令原子性(atomic)地执行。

  例子:

  

  redis> MULTI            # 标记事务开始
  OK

  redis> INCR user_id     # 多条命令按顺序入队
  QUEUED

  redis> INCR user_id
  QUEUED

  redis> INCR user_id
  QUEUED

  redis> PING
  QUEUED

  redis> EXEC             # 执行
  1) (integer) 1
  2) (integer) 2
  3) (integer) 3
  4) PONG
时间: 2024-10-10 05:39:51

redis原子性读写操作的相关文章

StackExchange.Redis客户端读写主从配置,以及哨兵配置。

今天简单分享一下StackExchange.Redis客户端中配置主从分离以及哨兵的配置. 关于哨兵如果有不了解的朋友,可以看我之前的一篇分享,当然主从复制文章也可以找到.http://www.cnblogs.com/tdws/tag/NoSql/ 为什么要有这篇分享呢,是因为我之前也有一些疑问,相信学习Redis的朋友都有过相同的疑问. 在代码中,如何分别操作主从数据库?,也就是说,如何只向主数据库写,而读取只向从服务器读.我目前给出的解决方案就是有关Set命令使用主服务器地址,关于Get的命

Java使用Pipeline对Redis批量读写(hmset&hgetall)

一般情况下,Redis Client端发出一个请求后,通常会阻塞并等待Redis服务端处理,Redis服务端处理完后请求命令后会将结果通过响应报文返回给Client.这有点类似于HBase的Scan,通常是Client端获取每一条记录都是一次RPC调用服务端.在Redis中,有没有类似HBase Scanner Caching的东西呢,一次请求,返回多条记录呢?有,这就是Pipline.官方介绍 http://redis.io/topics/pipelining 通过pipeline方式当有大批

Java使用Pipeline对Redis批量读写(hmset&hgetall)

一般情况下,Redis Client端发出一个请求后,通常会阻塞并等待Redis服务端处理,Redis服务端处理完后请求命令后会将结果通过响应报文返回给Client. 这有点类似于HBase的Scan,通常是Client端获取每一条记录都是一次RPC调用服务端. 在Redis中,有没有类似HBase Scanner Caching的东西呢,一次请求,返回多条记录呢? 有,这就是Pipline.官方介绍 http://redis.io/topics/pipelining 通过pipeline方式当

Redis的相关操作

参考文献:http://www.runoob.com/redis/redis-transactions.html redis下载(Windows安装)D:\downloads\redis>redis-server.exe redis.windows.conf(启动服务)打开另一个cmd终端:D:\downloads\redis>redis-cli(打开本地连接)D:\downloads\redis>redis-cli.exe -h 127.0.0.1 -p 6379(打开远程连接,然后打

redis集群介绍、redis集群搭建配置、redis集群操作

一:redis集群介绍 多个redis节点网络互联,数据共享所有的节点都是一主一从(可以是多个从),其中从不提供服务,仅作为备用不支持同时处理多个键(如mset/mget),因为redis需要把键均匀分布在各个节点上,并发量很高的情况下同时创建键值会降低性能并导致不可预测的行为.支持在线增加.删除节点客户端可以连任何一个主节点进行读写 二:redis集群搭建配置 场景设置:两台机器,分别开启三个Redis服务(端口)A机器上三个端口7000,7002,7004,全部为主B机器上三个端口7001,

Redis 以及 Python操作Redis

Redis Redis是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. Redis有以下特点: -- Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用. -- Redis支持五种数据类型. -- Redis支持数据库备份. Redis的优势: -- Redis性能极高,读的速度是110000次/s,写的速度是81000次/s. -- Redis丰富的数据类型,String,Lists,Hashes,Sets以及Ordered S

redis的常用操作

redis的介绍: redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set --有序集合)和hash(哈希类型).这些数据类型都支持push/pop.add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的.在此基础上,redis支持各种不同方式的排序.与memcached一样,为了保证效率,数据都是缓存在内存中.区别的是redis

Redis数据库基础操作

MySQL和Redis的区别 """ redis: 内存数据库(读写快,IO操作少).非关系型(操作数据方便) mysql: 硬盘数据库(数据持久化,IO操作多).关系型(操作数据间关系) 大量访问的临时数据,才有redis数据库更优 """ redis和memcache的区别 """ redis: 操作字符串.列表.字典.无序集合.有序集合 | 支持数据持久化(数据丢失可以找回.可以将数据同步给mysql) | 高

文件的新建、定位、截短和读写操作

1.创建一个新文件,创建新文件除了可以使用open函数之外还可以用creat()函数. 创建文件函数 creat(const char * pathname, mode_t mode) 头文件 :#include <fcntl.h> 参数说明:第一个参数pathname同open函数的第一个参数具有同样的意义,区别在于这是需要创建的文件的地址而不是需要打开文件的地址,第二个参数mode是新建文件的访问权限. 返回值:成功返回1,失败返回-1. 函数说明:creat()函数能够创建一个新的文件,