相关文章

更多

最近更新

更多

Redis 事务详解

2019-04-11 21:49|来源: 网路

Redis 事务可以一次执行多个命令, 并且带有以下两个重要的保证:

1、事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。

2、事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。


一个事务从开始到执行会经历以下三个阶段:

开始事务。

命令入队。

执行事务。



实例

以下是一个事务的例子, 它先以 MULTI 开始一个事务, 然后将多个命令入队到事务中, 最后由 EXEC 命令触发事务, 一并执行事务中的所有命令:

redis 127.0.0.1:6379> MULTI
OK

redis 127.0.0.1:6379> SET book-name "Mastering C++ in 21 days"QUEUED

redis 127.0.0.1:6379> GET book-name
QUEUED

redis 127.0.0.1:6379> SADD tag "C++" "Programming" "Mastering Series"QUEUED

redis 127.0.0.1:6379> SMEMBERS tag
QUEUED

redis 127.0.0.1:6379> EXEC1) OK2) 
"Mastering C++ in 21 days"3) (integer) 34) 
1) "Mastering Series"
2) "C++"
3) "Programming"


单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的。

事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做。

这是官网上的说明 From redis docs on transactions:

It's important to note that even when a command fails, all the other commands in the queue are processed – Redis will not stop the processing of commands.

比如:

redis 127.0.0.1:7000> multi
OK
redis 127.0.0.1:7000> set a aaa
QUEUED
redis 127.0.0.1:7000> set b bbb
QUEUED
redis 127.0.0.1:7000> set c ccc
QUEUED
redis 127.0.0.1:7000> exec
1) OK
2) OK
3) OK

如果在 set b bbb 处失败,set a 已成功不会回滚,set c 还会继续执行。


Redis 事务命令

下表列出了 redis 事务的相关命令:

序号 命令及描述
1 DISCARD 
取消事务,放弃执行事务块内的所有命令。
2 EXEC 
执行所有事务块内的命令。
3 MULTI 
标记一个事务块的开始。
4 UNWATCH 
取消 WATCH 命令对所有 key 的监视。
5 WATCH key [key ...] 
监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。



redis知识点

redis快速入门

reids常用命令

redis数据结构

java_API_客户端

Jedis

Tlcache

redis_持久化

AOF

RDB

发布订阅(pub/sub)

redis_事件

redis事务

redis通讯协议

RESP(Redis Serialization Protocol)

redis高可用

redis哨兵

监控(Monitoring) 提醒(Notification) 自动故障迁移(Automatic failover)

redis主从复制

  • 复制模式

    1. 主从复制
    2. 从从复制
  • 复制过程

    • slave向master发送sync命令;
    • master开启子进程执行bgsave写入rdb文件;
    • master发送缓存和RDB文件给slave;
    • master发送数据发送给slave完成复制;

redis集群(Redis_Cluster)

相关问答

更多
  • 1、引入jar包 org.springframework.data spring-data-redis 1.6.1.RELEASE redis.clients jedis 2.7.3 2、配置bean 在application.xml加入如下配置 其中配置文件redis一些配置数据redis.properties如下: #redis中心 redis.host=10.75.202.11 redis.port=6379 redis.password=123456 redis.maxIdle=100 redis. ...
  • 本文实例讲述了Laravel框架使用Redis的方法。分享给大家供大家参考,具体如下: 安装 laravel中使用redis首先需要你通过 Composer 安装 predis/predis 包: composer require predis/predis 配置 redis的配置文件是:config/database.php 'redis' => [ 'client' => 'predis', 'default' => [ 'host' => env('REDIS_HOST', '127.0.0.1'), ...
  • redis和mysql的区别非常大。 具体如下: mysql中一个中小型的网络数据库,比oracle和sqlserver小, 但是并发能力远超过acess这样的桌面数据库。 redis是一个支持网络、可基于内存亦可持久化的日志型、Key-Value数据库。 可以认为redis比mysql简化很多。 mysql支持集群。 现在大量的软件使用redis作为mysql在本地的数据库缓存,然后再适当的时候和mysql同步.
  • 支持的 DISCARD 取消事务,放弃执行事务块内的所有命令。 EXEC 执行所有事务块内的命令。 MULTI 标记一个事务块的开始。 UNWATCH 取消 WATCH 命令对所有 key 的监视。 WATCH key [key ...] 监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。
  • redis没这功能,它只是key-value数据库,缓存得用程序存进redis里。
  • 1234567891011121314151617181920212223242526272829303132333435363738394041function f(s, n) { // 保留20位以内的小数位 n = n > 0 && n <= 20 ? n : 2; // 这里 +'' 的含义是把数字转化为字符串, 正则里面的 \. \- 表示小数点和负号 // 删除掉s中非数字小数点或负号的字符 s = parseFloat((s + "").replace(/[^\d\.-]/g, "")).to ...
  • 我通过像下面这样将函数放在队列中来解决它: class CreditJob extends Job implements ShouldQueue { use InteractsWithQueue, SerializesModels; protected $order; protected $trip; protected $promotion; protected $customer; public function __construct($order,Order $trip,Customer $cu ...
  • 这是旧版StackExchange.Redis中的一个错误 - 1.0.481,1.0.488(没有测试任何旧版本)。 使用新版本1.1.553,它可以正常工作( https://github.com/StackExchange/StackExchange.Redis/issues/200 )。 It was a bug in older versions of StackExchange.Redis - 1.0.481, 1.0.488 (didn't test any older ones). With ...
  • 事务在本地缓冲,直到您调用“exec”,然后以原子单位发送。 如果你在执行前“等待”,你将永远不会发送任何东西。 只有在调用execute 之后才有必要“等待”事务中的操作。 其次,您无法在事务期间查询数据 。 更具体地说,您可以 ,但只有在调用“执行”时才能获得结果。 这是redis工作原理的基本部分:简单地说,redis事务与SQL事务不同。 这意味着您无法根据转换期间查询的数据做出决策。 但是,您可以查询事务外部的数据,然后确保它不会更改。 使用booksleeve,事务上的AddConstraint ...
  • JedisCluster没有实现Transaction和Pipeline,因为它很难实现。 Redis可以在群集模式下发送MOVED或ASK,这意味着我们应该在节点之间移动插槽。 我正在考虑JedisCluster的管道模式,但没有进行进一步的研究。 https://groups.google.com/d/msg/jedis_redis/u6j8slokO3E/Dh5Q94TRjJUJ 目前,Jedis团队正致力于为JedisCluster稳定/提供更多API。 JedisCluster didn't im ...