redis事务

和其它数据库一样,Redis作为NoSQL数据库也同样提供了事务机制。在Redis中, MULTI/EXEC/DISCARD/WATCH这四个命令是我们实现事务的基石。Redis中事务的特征:

1). 在事务中的所有命令都将会被串行化的顺序执行,事务执行期间,Redis不会再为其它客户端的请求提供任 何服务,从而保证了事物中的所有命令被原子的执行。

2). 和关系型数据库中的事务相比,在Redis事务中如果有某一条命令执行失败,其后的命令仍然会被继续执 行。

3). 我们可以通过MULTI命令开启一个事务,有关系型数据库开发经验的人可以将其理解为"BEGIN TRANSACTION"语句。在该语句之后执行的命令都将被视为事务之内的操作,最后我们可以通过执行

EXEC/DISCARD命令来提交/回滚该事务内的所有操作。这两个Redis命令可被视为等同于关系型数据库中的 COMMIT/ROLLBACK语句。

4). 在事务开启之前,如果客户端与服务器之间出现通讯故障并导致网络断开,其后所有待执行的语句都将不会 被服务器执行。然而如果网络中断事件是发生在客户端执行EXEC命令之后,那么该事务中的所有命令都会被服务 器执行。

5). 当使用Append­Only模式时,Redis会通过调用系统函数write将该事务内的所有写操作在本次调用中全部写 入磁盘。然而如果在写入的过程中出现系统崩溃,如电源故障导致的宕机,那么此时也许只有部分数据被写入到磁 盘,而另外一部分数据却已经丢失。Redis服务器会在重新启动时执行一系列必要的一致性检测,一旦发现类似问 题,就会立即退出并给出相应的错误提示。此时,我们就要充分利用Redis工具包中提供的redis­check­aof工具,该 工具可以帮助我们定位到数据不一致的错误,并将已经写入的部分数据进行回滚。修复之后我们就可以再次重新启 动Redis服务器了。

命令列表

   

multi

用于标记事务的开始,其后执行的命令都将被存入命令队列,直到执行EXEC时,这些命令才会被原子的 执行。

exec

执行在一个事务内命令队列中的所有命令,同时将当前连接的状态恢复为正常状态,即非事务状态。如 果在事务中执行了WATCH命令,那么只有当WATCH所监控的Keys没有被修改的前提下,EXEC命令才 能执行事务队列中的所有命令,否则EXEC将放弃当前事务中的所有命令。

discard

回滚事务队列中的所有命令,同时再将当前连接的状态恢复为正常状态,即非事务状态。如果WATCH命 令被使用,该命令将UNWATCH所有的Keys。

. 事务被正常执行
#在当前连接上启动一个新的事务
127.0.0.1:> multi
OK #执行事务中的第一条命令,从该命令的返回结果可以看出,该命令并没有立即执行,而是存于事务的命令队列 127.0.0.1:> incr t1 QUEUED #又执行一个新的命令,从结果可以看出,该命令也被存于事务的命令队列 127.0.0.1:> incr t2
QUEUED #执行事务命令队列中的所有命令,从结果可以看出,队列中命令的结果得到返回 127.0.0.1:> exec ) (integer)
) (integer) #只有当提交事务后,在其他连接中才能看到变化 . 事务中存在失败的命令
#开启一个新的事务
127.0.0.1:> multi
OK
#设置键a的值为string类型的3
127.0.0.1:> set a
QUEUED #从键a所关联的值的头部弹出元素,由于该值是字符串类型,而lpop命令仅能用于List类型,因此在执行exec命 令时,该命令将会失败 127.0.0.1:> lpop a
QUEUED
#再次设置键a的值为字符串4
127.0.0.1:> set a
QUEUED #获取键a的值,以便确认该值是否被事务中的第二个set命令设置成功 127.0.0.1:> get a QUEUED #从结果中可以看出,事务中的第二条命令lpop执行失败,而其后的set和get命令均执行成功,这一点是Redis的 事务与关系型数据库中的事务之间最为重要的差别
127.0.0.1:> exec
) OK ) (error) ERR Operation against a key holding the wrong kind of value ) OK
) "" . 回滚事务 #为键t2设置一个事务执行前的值 127.0.0.1:> set t2 tt OK
#开启一个事务 127.0.0.1:> multi

主从复制Replication

在Redis中配置Master­Slave模式非常简单,Redis中主从复制的特点和优势:

). 同一个Master可以同步多个Slaves。
). Slave同样可以接受其它Slaves的连接和同步请求,可以有效的分载Master的同步压力,所以可以将Redis的 Replication架构视为图结构。
). Master Server是以非阻塞的方式为Slaves提供服务,所以在Master­Slave同步期间,客户端仍然可以提交查 询或修改请求。
). Slave Server同样是以非阻塞的方式完成数据同步,在同步期间,如果有客户端提交查询请求,Redis则返回 同步之前的数据。
). 为了分载Master的读操作压力,Slave服务器可以为客户端提供只读操作的服务,写服务仍然必须由Master来 完成。即便如此,系统的伸缩性还是得到了很大的提高。
). Master可以将数据保存操作交给Slaves完成,从而避免了在Master中要有独立的进程来完成此操作。

 

配置 步骤:

. 同时启动两个Redis服务器,可以考虑在同一台机器上启动两个Redis服务器,分别监听不同的端口,如 6379和6380

 将配置文件拷贝两份,并修改端口号 
启动服务器:

$ redis­server 6379.conf #master主服务器

$ redis­server 6380.conf #slave从服务器

. 连接slave服务器,并执行如下命令:
$ redis­cli ­p 6380 #连接从服务器,slave端口号为6380
127.0.0.1:6380> slaveof 127.0.0.1 6379 #配置主从关系,指定master的主机地址和端口号
OK 
上面的方式只是保证了在执行slaveof命令之后,redis6380 (redis_6380)重新启动之后,他们之间的复制关系将终止。

3.如果希望长期保证这两个服务器之间的Replication关系,可以在redis_6380的配置文件中做如下修改:

$ vi .conf
slaveof 127.0.0.1
这样就可以保证Redis6380 Redis6379的Replication连接了。

redis的持久化

Redis提供的持久化方式:

  1. RDB

         该机制是指在指定的时间间隔内将内存中的数据集快照写入磁盘。
    
  2. AOF 该机制将以日志的形式记录服务器所处理的每一个写操作,在Redis服务器启动之初会读取该文件来重新

         构建数据库,以保证启动后数据库中的数据是完整的。

RDB

Redis Database:通过单文件的方式来持久化

RDB是默认的持久化方式,默认存储在启动redis服务器时所在当前目录下的dump.rdb文件中,一般都会修改
存储在一个固定的目录中

编辑配置文件:

 $ vi myredis.conf
  
 #持久化文件的名称
dbfilename dump.rdb 
#持久化文件的默认目录,默认为执行redis­server命令时所在的目录 
#dir ./
#修改存储位置为一个固定的目录
 dir /home/soft01/software/dump/

持久化的时机:

1. 在数据库关闭时会持久化(需要注意的是在数据库宕机时不会生成,数据可能会丢失)

2. 满足特定条件时会持久化,编辑配置文件:

$ vi myredis.conf
save #在900秒内,只要有1个key发生变化,就会dump持久化
save
save

优缺点:

缺点:可能会丢失数据
优点:效率比较高

AOF

Append Only File:通过操作日志的方式来持久化

编辑配置文件:

  $ vi myredis.conf
#开启aof模式的持久化
appendonly yes

#aof的持久化文件 
appendfilename "appendonly.aof" 

#每一秒进行一次持久化操作,可取值:always、everysec、no 
appendfsync everysec 

#持久化文件的目录,与RDB相同
dir /home/soft01/software/dump/

注:可以直接查看生成的appendonly.aof文件,可以认为是一个日志文件

优缺点:

缺点:效率比较差

优点:丢失数据量比较少

redis的事务、主从复制、持久化的更多相关文章

  1. redis 事务,持久化,日志,主从,VM

    redis目前对事务的支持比较简单,只能保证一个客户端连接发起事务中的命令可以连续执行,而中间不会插入其他客户端的命令. 1.事务 一般情况下,redis接收到一个客户端发送的命令,立刻执行并返回结果 ...

  2. Linux+Redis实战教程_day02_消息订阅与发布_多数据库_redis批量操作-事务_redis持久化

    5.扩展知识-消息订阅与发布(了解) 订阅新闻,新闻发布 subscribe channel:订阅频道,例:subscribe mychat,订阅mychat这个频道 psubscribe chann ...

  3. Redis高级特性---------事务与持久化与发布订阅

    一.redis事务的用法 1.开启事务:multi 2.提交事务:exec   ( queued只是把指令放入队列中,没有执行) 3.取消事务:discard 4.redis事务不能保证同时成功或者失 ...

  4. redis高级命令4 持久化机制 、事务

    redis的事务是支持很简单,基本没有啥用我们来看下面的列子 我们开启一个事务,在事务中执行了age 加1,set a4 ,还有对一个字符串进行加一,对字符串加1导致了事务失败,按道理incr age ...

  5. Redis高可用(持久化、主从复制、哨兵、集群)

    Redis高可用(持久化.主从复制.哨兵.集群) 目录 Redis高可用(持久化.主从复制.哨兵.集群) 一.Redis高可用 1. Redis高可用概述 2. Redis高可用策略 二.Redis持 ...

  6. 第四章· Redis的事务、锁及管理命令

    一.事务介绍 二.Redis乐观锁介绍 三.Redis管理命令 一.事务介绍 Redis的事务与关系型数据库中的事务区别 1)在MySQL中讲过的事务,具有A.C.I.D四个特性 Atomic(原子性 ...

  7. nginx+tomcat+redis sesson id主从复制

       Redis与Memcached的区别:     内存利用率:使用简单的key-value存储的话,Memcached的内存利用率更高,而如果Redis采用hash结构来做key-value存储, ...

  8. redis的事务(简单介绍)

    1.简单描述 redis对事务的支持目前还是比较简单.redis只能保证一个client发起的事务中的命令是可以连续的执行,而中间不会插入其他client的命令.由于redis是但现场来处理所有cli ...

  9. Docker下redis的主从、持久化配置

    Docker下redis的主从.持久化配置 redis是k-v型nosql数据库,支持字符串(string).列表(list).集合(set).散列(hash).有序集合(zset:形如member: ...

随机推荐

  1. [linux] uptime 命令中关于平均负载的解释

    1.当前时间 00:13:25 2.系统已运行的时间 9小时19分 3.当前在线用户 2 user 4.平均负载:0.17, 0.12, 0.07 最近1分钟.5分钟.15分钟系统的负载 为了更好地理 ...

  2. 查询指定tomcat应用的进程数

    假设应用名称为pear,查询指定tomcat应用pear的进程数: ps -ef |grep "/datong/tomcat-pear/" |grep -v tail | grep ...

  3. Windows x64位通过PEB获得Kernel32基地址

    在64位系统下 gs:[0x30] 指向TEB gs:[0x60] 指向PEB kd> dt _TEB nt!_TEB +0x000 NtTib : _NT_TIB +0x000 Excepti ...

  4. Whu 1603——Minimum Sum——————【单个元素贡献、滑窗】

    Problem 1603 - Minimum Sum Time Limit: 2000MS   Memory Limit: 65536KB   Total Submit: 623  Accepted: ...

  5. 深入理解JavaScript系列(29):设计模式之装饰者模式

    介绍 装饰者提供比继承更有弹性的替代方案. 装饰者用用于包装同接口的对象,不仅允许你向方法添加行为,而且还可以将方法设置成原始对象调用(例如装饰者的构造函数). 装饰者用于通过重载方法的形式添加新功能 ...

  6. 【数据库】7.0 MySQL入门学习(七)——MySQL基本指令:帮助、清除输入、查询等

    1.0 help == ? 帮助指令,查询某个指令的解释.用法.说明等.详情参考博文: [数据库]6.0 MySQL入门学习(六)——MySQL启动与停止.官方手册.文档查询 https://www. ...

  7. C#中.Net的值传递和引用传递

    /// <summary> /// 电脑类 /// </summary> public class Computer { public string Type { get; s ...

  8. SharePoint 2013 - System Features

    1. Embed Information & Convert to PDF 功能,在文档的preview界面(hover panel); 2. Share功能可以选择是否发送邮件 -- Don ...

  9. Flexviewer调用特定的widget

    Flexviewer调用特定的widget: 之前一直是自己添加个固定的key来调用widget 但是后来发现框架早就为你写好啦调用widget的方法 在WidgetManager中有个 public ...

  10. PHP:数字转Excel列头

    转自我的个人博客:阔野飞花 http://www.rexcao.net/archives/169 前段时间升级一个项目的Excel导出功能,这次的列数大概有60多条,在处理过程中发现一个问题,原先做好 ...