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。

  1. . 事务被正常执行
  2. #在当前连接上启动一个新的事务
  3. 127.0.0.1:> multi
  4. OK #执行事务中的第一条命令,从该命令的返回结果可以看出,该命令并没有立即执行,而是存于事务的命令队列 127.0.0.1:> incr t1
  5.  
  6. QUEUED
  7.  
  8. #又执行一个新的命令,从结果可以看出,该命令也被存于事务的命令队列
  9.  
  10. 127.0.0.1:> incr t2
  11. QUEUED #执行事务命令队列中的所有命令,从结果可以看出,队列中命令的结果得到返回 127.0.0.1:> exec
  12.  
  13. ) (integer)
  14. ) (integer) #只有当提交事务后,在其他连接中才能看到变化
  15.  
  16. . 事务中存在失败的命令
  17. #开启一个新的事务
  18. 127.0.0.1:> multi
  19. OK
  20. #设置键a的值为string类型的3
  21. 127.0.0.1:> set a
  22. QUEUED #从键a所关联的值的头部弹出元素,由于该值是字符串类型,而lpop命令仅能用于List类型,因此在执行exec命 令时,该命令将会失败
  23.  
  24. 127.0.0.1:> lpop a
  25. QUEUED
  26. #再次设置键a的值为字符串4
  27. 127.0.0.1:> set a
  28. QUEUED #获取键a的值,以便确认该值是否被事务中的第二个set命令设置成功
  29.  
  30. 127.0.0.1:> get a
  31.  
  32. QUEUED
  33.  
  34. #从结果中可以看出,事务中的第二条命令lpop执行失败,而其后的set和get命令均执行成功,这一点是Redis的 事务与关系型数据库中的事务之间最为重要的差别
  35. 127.0.0.1:> exec
  36. ) OK
  37.  
  38. ) (error) ERR Operation against a key holding the wrong kind of value ) OK
  39. ) ""
  40.  
  41. . 回滚事务 #为键t2设置一个事务执行前的值 127.0.0.1:> set t2 tt OK
  42. #开启一个事务 127.0.0.1:> multi

主从复制Replication

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

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

 

配置 步骤:

  1. . 同时启动两个Redis服务器,可以考虑在同一台机器上启动两个Redis服务器,分别监听不同的端口,如 63796380
  2.  
  3. 将配置文件拷贝两份,并修改端口号
    启动服务器:

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

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

  1. . 连接slave服务器,并执行如下命令:
$ redis­cli ­p 6380 #连接从服务器,slave端口号为6380
127.0.0.1:6380> slaveof 127.0.0.1 6379 #配置主从关系,指定master的主机地址和端口号
OK 
  1. 上面的方式只是保证了在执行slaveof命令之后,redis6380 (redis_6380)重新启动之后,他们之间的复制关系将终止。
  2.  
  3. 3.如果希望长期保证这两个服务器之间的Replication关系,可以在redis_6380的配置文件中做如下修改:
  4.  
  5. $ vi .conf
  6. slaveof 127.0.0.1
  7. 这样就可以保证Redis6380 Redis6379Replication连接了。

redis的持久化

Redis提供的持久化方式:

  1. RDB

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

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

RDB

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

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

编辑配置文件:

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

持久化的时机:

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

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

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

优缺点:

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

AOF

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

编辑配置文件:

  1. $ vi myredis.conf
  1. #开启aof模式的持久化
  1. appendonly yes
  2.  
  1. #aof的持久化文件
  1. appendfilename "appendonly.aof"
  2.  
  1. #每一秒进行一次持久化操作,可取值:always、everysec、no
  1. appendfsync everysec
  2.  
  1. #持久化文件的目录,与RDB相同
  1. 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. 守护客户数据价值:企业级NewSQL HTAP分布式云TBase架构详解

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 作者:jasonys,隶属于腾讯技术工程事业群数据平台部,负责TBase数据的技术研发和架构设计,有超过10年的数据库内核开发设计经验,完成 ...

  2. JS异步执行之setTimeout 0的妙用

    最近在工作中遇到一些问题,大致是关于js执行问题的.由于没搞清执行顺序,导致出现了一些奇怪的bug. 所以这里整理一些有关异步执行的知识(冰山一角角)... 大家都知道js是单线程的,执行起来是顺序的 ...

  3. ztree使用方法 python后台

    一.在提前加载js的地方写一段js,判断该页面是否需要添加ztree,我的项目所有提前加载的js都写在admin.js中 //增加ztree $(document).ready(function() ...

  4. 基于RBAC模式的权限管理系统设计概要

    很多人都知道以角色为基础的权限管理设计(RBAC),但是大部分人似懂非懂,不知道完整的权限管理系统都包括哪些内容.  在此以权限管理的使用场景来说明一下完整的权限管理内容.     一是鉴权管理,即权 ...

  5. Nginx反向代理与负载均衡[转]

    nginx启动和关闭(centos平台) /usr/local/nginx/sbin/nginx #启动 /usr/local/nginx/sbin/nginx -s reload #平滑启动 vi ...

  6. mysql 乱码问题的捣鼓

    mysql在ubuntu的终端下出现中文乱码的问题: 先学着在不改数据库的情况下对my.cnf配置文件进行修改, 主要的是设置 default-character-set=utf8 但是设置完后数据库 ...

  7. 正则表达式验证问题(用户名、密码、email、身份证

    实现的代码如下: <html> <head> <meta charset="UTF-8"> </head> <body> ...

  8. Python爬虫之三种数据解析方式

    一.引入 二.回顾requests实现数据爬取的流程 指定url 基于requests模块发起请求 获取响应对象中的数据 进行持久化存储 其实,在上述流程中还需要较为重要的一步,就是在持久化存储之前需 ...

  9. Aligning Plots in a Column作图列对齐

    Plot[Sin[x], {x, 0, Pi}] Plot[10000 Sin[x], {x, 0, Pi}] 直接作图左边无法对齐,影响图的美观.可以使用左边界空格实现列对齐,代码如下: optio ...

  10. Selenium2学习(五)-- SeleniumBuilder辅助定位元素

    前言 福利来了,对于用火狐浏览器的小伙伴们,你还在为定位元素而烦恼嘛? 上古神器Selenium Builder来啦,哪里不会点哪里,妈妈再也不用担心我的定位元素问题啦!(但是也不是万能,基本上都能覆 ...