美文网首页
关于redis事务的几点思考

关于redis事务的几点思考

作者: 高稚商de菌 | 来源:发表于2019-03-01 19:56 被阅读0次
1. 事务

事务提供了一种“将多个命令打包, 然后一次性、按顺序地执行”的机制, 并且事务在执行的期间不会主动中断 —— 服务器在执行完事务中的所有命令之后, 才会继续处理其他客户端的其他命令。
Redis 通过 MULTI、DISCARD、EXEC和WATCH四个命令来实现事务功能,MULTI表示事务的开始;事务期间的命令并不会立刻执行,而是会进入命令队列,等待执行;EXEC表示事务的执行和结束,它会将队列中的命令依次执行;DISCARD表示丢弃事务;WATCH表示监听任意数量的key,当EXEC前发现key发现变化,就会直接返回失败。
当EXEC的过程中,如果有一个命令出错,不会影响后续命令的执行,只会将错误信息包在结果中返回。Redis事务不提供回滚的功能。
Redis的事务是原子性的。Redis基于单线程模型,且一个事务的多个命令会顺序执行,中间不会有其它命令插队。

2. pipeline

Redis的pipeline功能在命令行中没有,但redis是支持pipeline的。可以选择事务执行或者非事务方式。

import redis
redis.Redis.pipeline()
with r.pipeline(transaction=True) as p:
      p.set("1", "1")
      p.hgetall("1")
      p.set("2", "2")
      p.execute(raise_on_error=False)

需要说明的是,无论是否事务,这里的raise_on_error只代表再程序中是否抛出异常,但是在redis中,即使第2个命令出错了,也不影响后续的命令执行。

3. redis+lua

Redis内置lua解释器,可以执行lua脚本,可以实现复杂的逻辑。另外,比较重要的一点是,lua脚本的执行是原子的。
语法:

EVAL script numkeys key [key ...] arg [arg ...] 

例如:

> eval "return 10" 0
(integer) 10

如果lua脚本比较大,每次都传输完整的脚本就不怎么划算了。可以使用SCRIPT LOAD命令,加载lua脚本到redis中,该命令返回给定脚本的SHA1校验和,可以用EVALHASH命令和这个校验和执行lua脚本。
以下是redis-py github文档上给的一个例子,实现了乘法功能。

>>> r = redis.Redis()
>>> lua = """
... local value = redis.call('GET', KEYS[1])
... value = tonumber(value)
... return value * ARGV[1]"""
>>> multiply = r.register_script(lua)
>>> r.set('foo', 2)
>>> multiply(keys=['foo'], args=[5])
10

在lua脚本中有call和pcall两种调用redis命令的方式,二者唯一区别是:当call在执行命令的过程中发生错误时,脚本会停止执行,并返回一个脚本错误,错误的输出信息会说明错误造成的原因;pcall出错时并不引发错误,而是返回一个带err域的lua表(table),用于表示错误。

4. codis

Codis是一个分布式 Redis 解决方案,但是不支持很多命令。以上所说的MULTI、DISCARD、EXEC和WATCH,以及SCRIPT都不支持。在使用pipeline时,不支持事务。但是支持EVAL和EVALHASH,不过要求其中操作的key属于同一个slot。
另外说一句,不同的key写入同一个slot可以用hashtag来实现

相关文章

  • 关于redis事务的几点思考

    1. 事务 事务提供了一种“将多个命令打包, 然后一次性、按顺序地执行”的机制, 并且事务在执行的期间不会主动中断...

  • Redis 能否保证数据高可靠性

    记录下工作中关于Redis的一些思考,主要关于Redis的事务,脚本,持久化 本文讨论的问题: Redis的事务或...

  • 关于redis事务

    MULTI、EXEC、DISCARD和WATCH是 Redis 事务相关的命令。事务可以一次执行多个命令, 并且带...

  • redis系列(十):事务

    redis有事务么? redis官方说是有事务的。但这个事务不是我们普遍理解的mysql事务。 redis的事务不...

  • 九、Redis 事务

    Redis 事务 Redis事务描述: Redis事务允许在单个步骤中执行一组命令。以下是Redis事务的两个属性...

  • Redis事务

    redis事务机制 Redis事务与传统关系型事务的比较

  • Redis事务

    转载自Redis之Redis事务 Redis事务的概念: Redis 事务的本质是一组命令的集合。事务支持一次执行...

  • redis中的事物、消息订阅、持久化

    Redis 中的事务 Redis支持简单的事务 Redis与 mysql事务的对比 注: rollback与dis...

  • Redis简单操作记录

    Redis事务 1.Redis事务本质:一组命令的集合,加入队列,然后执行,执行完事务结束。 redis事务: ①...

  • redis 常用指令

    Redis 的事务 Redis 的事务处理与 RDBMS 的事务有一些不同。首先 Redis 不支持事务的回滚机制...

网友评论

      本文标题:关于redis事务的几点思考

      本文链接:https://www.haomeiwen.com/subject/tyujuqtx.html