redis原子性读写操作

Posted 请叫我CL2

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

以上是关于redis原子性读写操作的主要内容,如果未能解决你的问题,请参考以下文章

Redis——主从同步原理

为什么Redis的操作是原子性的,怎么保证原子性的?

Redis 数据类型及应用场景

Redis 数据类型及应用场景

redis初识01

# 技术栈知识点巩固——Redis