Redis——事务&持久化

一、    事务处理

  Redis对事务的支持比较简单,或者说它的事务是有缺陷的。它只能保证一个Client发起的事务中的命令可以连续执行,中间不会插入其它client端的命令。缺陷在于,如果一个client将两条命令放到一个事务了,执行的时候第二条命令发送错误,但此时Redis的事务不会回滚第一条命令。如下图:

  

  Redis事务的执行原理如下:当client端发起multi命令时,这个连接会进入一个事务上下文,该连接后续的命令不会立即执行,而是先放到一个缓冲队列中,当执行exec命令时,Redis会依次执行队列中所有命令。

  1.1    开启/执行事务(multi/exec)

  

  1.2    取消事务(discard)

  

  1.3    乐观锁

大多数是基于教据版本(version)的记录机制实现的。即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数据库表添加一个” version”字段来实现读取出数据时,将此版本号一同读出,之后更新时,对此版本号加1。此时,将提交数据的版本号与数据库表对应记录的当前版本号进行比对,如果提交的数据版本号大于数据库当前版本号,则予以更新,否则认为是过期数据。

举例:

假设有一个age的key,我们开两个Session对age进行赋值操作,然后看一下结果。

  

  

  

  watch命令会监视给定的key,当exec时候,如果监视的key从调用watch后发生过变化,则整个事务会失败。也可以调用watch多次监视多个key.这样就可以对指定的key加乐观锁了。注意watch的key是对整个连接有效的,事务也一样。如果连接断开,监视和事务都会被自动清除。当然了exec,discard,unwatch命令都会清除连接中的所有监视。

二、    持久化机制

Redis是一个支持持久化的内存数据库,也就是说redis需要经常将内存中的数据同步到硬盘来保证持久化。Redis支持两种持久化方案:

  2.1     snapshotting(快照—存数据—默认方式)

快照是默认的持久化方式。这种方式是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb。可以通过配置设置自动做快照持久化的方式。我们可以配置Redis在n秒内如果超过m个key被修改就自动做快照。如下图:

  

  2.2     aof(存操作)

  由于快照方式是在一定间隔时间做一次的,所以如果Redis被意外down掉的话,就会丢失最后一次快照后的所有修改。aof方式比快照方式有更好的持久化性,是由于在使用aof时,Redis会将每一个收到的写命令都通过write函数追加到文件中,当Redis重启时会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容。

  当然由于os会在内核中缓存write做的修改,所以可能不是立即写到磁盘上.这样aof仿式的持久化也还是有可能会丢失部分修改.我们可以通过配置文件告诉Redis我们想要通过fsync涵数强制os写入到磁盘的时机。如下图:

  

  我们查看appendonly.aof文件可以看到,里面存的都是Redis的操作:

  

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-05 13:30:57

Redis——事务&持久化的相关文章

Redis事务、持久化、发布订阅

一.Redis事物 1. 概念 Redis 事务可以一次执行多个命令, 并且带有以下两个重要的保证: 事务是一个单独的隔离操作:事务中的所有命令都会序列化.按顺序地执行.事务在执行的过程中,不会被其他客户端发送来的命令请求所打断. 事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行. 一个事务从开始到执行会经历以下三个阶段: 开始事务. 命令入队. 执行事务. 2. 实例     3. Redis 事务命令 下表列出了 redis 事务的相关命令: 序号 命令及描述 1 DISCA

(6)redis 事务

redis对事务的支持目前还比较简单.redis只能保证一个client发起的事务中的命令可以连续的执行,而中间不会插入其他client的命令. 由于redis是单线程来处理所有client的请求的所以做到这点是很容易的.一般情况下redis在接受到一个client发来的命令后会立即处理并 返回处理结果,但是当一个client在一个连接中发出multi命令有,这个连接会进入一个事务上下文,该连接后续的命令并不是立即执行,而是先放到一 个队列中.当从此连接受到exec命令后,redis会顺序的执行

Redis事务的分析及改进

Redis事务的分析及改进 Redis的事务特性 数据ACID特性满足了几条? 为了保持简单,redis事务保证了其中的一致性和隔离性: 不满足原子性和持久性: 原子性 redis事务在执行的中途遇到错误,不会回滚,而是继续执行后续命令:(违反原子性) 事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作: 中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做: 比如: redis 127.0.0.1:7000> multi OK redis 127.0.0.1:7

Redis(3)---Redis事务

Redis事务 Redis 通过 MULTI .EXEC. DISCARD  和 WATCH 四个命令来实现事务功能. MULTI :标记一个事务块的开始. EXEC: 执行所有事务块内的命令. DISCARD :取消事务,放弃执行事务块内的所有命令. WATCH key [key ...] :监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断. 一.事务 1.是什么? 可以一次执行多个命令,本质是一组命令的集合.一个事务中的所有命令都会序

Redis系列六 Redis事务

Redis事务 1.介绍 在Redis事务中可以一次执行多个命令,本质是一组命令的集合.一个事务中的所有命令都会序列化,按顺序地串行化执行而不会被其它命令插入,不许加塞. 2.事务的作用 一个队列中,一次性.顺序性.排他性的执行一系列命令. 3.事物执行五中情况 case1:正常执行 执行exec全部成功 Case2:放弃事务 执行Discard Case3:全体连坐 在向事物队列中添加命令的时候报错,然后执行Exec会全部失败. Case4:冤头债主 在向事物队列中添加命令的时候没有报错,但在

redis事务(转载)

原文地址:http://blog.csdn.net/hechurui/article/details/49508749 Redis事务 首先,Redis本身是单线程的. redis中的事务(transaction)是一组命令的集合.事务同命令一样都是Redis最小的执行单位,一个事务中的命令要么都执行,要么都不执行.Redis事务的实现需要用到 MULTI 和 EXEC 两个命令,事务开始的时候先向Redis服务器发送 MULTI 命令,然后依次发送需要在本次事务中处理的命令,最后再发送 EXE

Redis 事务

Redis 事务可以一次执行多个命令, 并且带有以下两个重要的保证: 事务是一个单独的隔离操作:事务中的所有命令都会序列化.按顺序地执行.事务在执行的过程中,不会被其他客户端发送来的命令请求所打断. 事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行. 一个事务从开始到执行会经历以下三个阶段: 开始事务. 命令入队. 执行事务. 实例 以下是一个事务的例子, 它先以 MULTI 开始一个事务, 然后将多个命令入队到事务中, 最后由 EXEC 命令触发事务, 一并执行事务中的所有命令

redis 数据持久化

转:redis 数据持久化 1.快照(snapshots) 缺省情况情况下,Redis把数据快照存放在磁盘上的二进制文件中,文件名为dump.rdb.你可以配置Redis的持久化策略,例如数据集中每N秒钟有超过M次更新,就将数据写入磁盘:或者你可以手工调用命令SAVE或BGSAVE. 数据保存的目录: 工作原理 Redis forks. 子进程开始将数据写到临时RDB文件中. 当子进程完成写RDB文件,用新文件替换老文件. 这种方式可以使Redis使用copy-on-write技术. 2.APP

Redis学习笔记(4) Redis事务、生存时间及排序

1. Redis事务 Redis中的事务(transaction)是一组命令的集合,一个事务中的命令要么都执行,要么都不执行.事务的原理是先将属于一个事务的命令发送给Redis,然后再让Redis依次执行这些命令. 127.0.0.1:6379> multi OK 127.0.0.1:6379> sadd user:1:following 2 QUEUED 127.0.0.1:6379> sadd user:2:followers 1 QUEUED 127.0.0.1:6379>