redis的事务、主从复制、持久化
redis事务
和其它数据库一样,Redis作为NoSQL数据库也同样提供了事务机制。在Redis中, MULTI/EXEC/DISCARD/WATCH这四个命令是我们实现事务的基石。Redis中事务的特征:
1). 在事务中的所有命令都将会被串行化的顺序执行,事务执行期间,Redis不会再为其它客户端的请求提供任 何服务,从而保证了事物中的所有命令被原子的执行。
2). 和关系型数据库中的事务相比,在Redis事务中如果有某一条命令执行失败,其后的命令仍然会被继续执 行。
3). 我们可以通过MULTI命令开启一个事务,有关系型数据库开发经验的人可以将其理解为"BEGIN TRANSACTION"语句。在该语句之后执行的命令都将被视为事务之内的操作,最后我们可以通过执行
4). 在事务开启之前,如果客户端与服务器之间出现通讯故障并导致网络断开,其后所有待执行的语句都将不会 被服务器执行。然而如果网络中断事件是发生在客户端执行EXEC命令之后,那么该事务中的所有命令都会被服务 器执行。
5). 当使用AppendOnly模式时,Redis会通过调用系统函数write将该事务内的所有写操作在本次调用中全部写 入磁盘。然而如果在写入的过程中出现系统崩溃,如电源故障导致的宕机,那么此时也许只有部分数据被写入到磁 盘,而另外一部分数据却已经丢失。Redis服务器会在重新启动时执行一系列必要的一致性检测,一旦发现类似问 题,就会立即退出并给出相应的错误提示。此时,我们就要充分利用Redis工具包中提供的redischeckaof工具,该 工具可以帮助我们定位到数据不一致的错误,并将已经写入的部分数据进行回滚。修复之后我们就可以再次重新启 动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中配置MasterSlave模式非常简单,Redis中主从复制的特点和优势:
- ). 同一个Master可以同步多个Slaves。
- ). Slave同样可以接受其它Slaves的连接和同步请求,可以有效的分载Master的同步压力,所以可以将Redis的
- Replication架构视为图结构。
- ). Master Server是以非阻塞的方式为Slaves提供服务,所以在MasterSlave同步期间,客户端仍然可以提交查
- 询或修改请求。
- ). Slave Server同样是以非阻塞的方式完成数据同步,在同步期间,如果有客户端提交查询请求,Redis则返回
- 同步之前的数据。
- ). 为了分载Master的读操作压力,Slave服务器可以为客户端提供只读操作的服务,写服务仍然必须由Master来
- 完成。即便如此,系统的伸缩性还是得到了很大的提高。
- ). Master可以将数据保存操作交给Slaves完成,从而避免了在Master中要有独立的进程来完成此操作。
配置 步骤:
- . 同时启动两个Redis服务器,可以考虑在同一台机器上启动两个Redis服务器,分别监听不同的端口,如 6379和6380
- 将配置文件拷贝两份,并修改端口号
启动服务器:
$ redisserver 6379.conf #master主服务器
$ redisserver 6380.conf #slave从服务器
- . 连接slave服务器,并执行如下命令:
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提供的持久化方式:
RDB
- 该机制是指在指定的时间间隔内将内存中的数据集快照写入磁盘。
AOF 该机制将以日志的形式记录服务器所处理的每一个写操作,在Redis服务器启动之初会读取该文件来重新
- 构建数据库,以保证启动后数据库中的数据是完整的。
RDB
Redis Database:通过单文件的方式来持久化
RDB是默认的持久化方式,默认存储在启动redis服务器时所在当前目录下的dump.rdb文件中,一般都会修改
存储在一个固定的目录中
编辑配置文件:
- $ vi myredis.conf
- #持久化文件的名称
- dbfilename dump.rdb
- #持久化文件的默认目录,默认为执行redisserver命令时所在的目录
- #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的事务、主从复制、持久化的更多相关文章
- redis 事务,持久化,日志,主从,VM
redis目前对事务的支持比较简单,只能保证一个客户端连接发起事务中的命令可以连续执行,而中间不会插入其他客户端的命令. 1.事务 一般情况下,redis接收到一个客户端发送的命令,立刻执行并返回结果 ...
- Linux+Redis实战教程_day02_消息订阅与发布_多数据库_redis批量操作-事务_redis持久化
5.扩展知识-消息订阅与发布(了解) 订阅新闻,新闻发布 subscribe channel:订阅频道,例:subscribe mychat,订阅mychat这个频道 psubscribe chann ...
- Redis高级特性---------事务与持久化与发布订阅
一.redis事务的用法 1.开启事务:multi 2.提交事务:exec ( queued只是把指令放入队列中,没有执行) 3.取消事务:discard 4.redis事务不能保证同时成功或者失 ...
- redis高级命令4 持久化机制 、事务
redis的事务是支持很简单,基本没有啥用我们来看下面的列子 我们开启一个事务,在事务中执行了age 加1,set a4 ,还有对一个字符串进行加一,对字符串加1导致了事务失败,按道理incr age ...
- Redis高可用(持久化、主从复制、哨兵、集群)
Redis高可用(持久化.主从复制.哨兵.集群) 目录 Redis高可用(持久化.主从复制.哨兵.集群) 一.Redis高可用 1. Redis高可用概述 2. Redis高可用策略 二.Redis持 ...
- 第四章· Redis的事务、锁及管理命令
一.事务介绍 二.Redis乐观锁介绍 三.Redis管理命令 一.事务介绍 Redis的事务与关系型数据库中的事务区别 1)在MySQL中讲过的事务,具有A.C.I.D四个特性 Atomic(原子性 ...
- nginx+tomcat+redis sesson id主从复制
Redis与Memcached的区别: 内存利用率:使用简单的key-value存储的话,Memcached的内存利用率更高,而如果Redis采用hash结构来做key-value存储, ...
- redis的事务(简单介绍)
1.简单描述 redis对事务的支持目前还是比较简单.redis只能保证一个client发起的事务中的命令是可以连续的执行,而中间不会插入其他client的命令.由于redis是但现场来处理所有cli ...
- Docker下redis的主从、持久化配置
Docker下redis的主从.持久化配置 redis是k-v型nosql数据库,支持字符串(string).列表(list).集合(set).散列(hash).有序集合(zset:形如member: ...
随机推荐
- 守护客户数据价值:企业级NewSQL HTAP分布式云TBase架构详解
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 作者:jasonys,隶属于腾讯技术工程事业群数据平台部,负责TBase数据的技术研发和架构设计,有超过10年的数据库内核开发设计经验,完成 ...
- JS异步执行之setTimeout 0的妙用
最近在工作中遇到一些问题,大致是关于js执行问题的.由于没搞清执行顺序,导致出现了一些奇怪的bug. 所以这里整理一些有关异步执行的知识(冰山一角角)... 大家都知道js是单线程的,执行起来是顺序的 ...
- ztree使用方法 python后台
一.在提前加载js的地方写一段js,判断该页面是否需要添加ztree,我的项目所有提前加载的js都写在admin.js中 //增加ztree $(document).ready(function() ...
- 基于RBAC模式的权限管理系统设计概要
很多人都知道以角色为基础的权限管理设计(RBAC),但是大部分人似懂非懂,不知道完整的权限管理系统都包括哪些内容. 在此以权限管理的使用场景来说明一下完整的权限管理内容. 一是鉴权管理,即权 ...
- Nginx反向代理与负载均衡[转]
nginx启动和关闭(centos平台) /usr/local/nginx/sbin/nginx #启动 /usr/local/nginx/sbin/nginx -s reload #平滑启动 vi ...
- mysql 乱码问题的捣鼓
mysql在ubuntu的终端下出现中文乱码的问题: 先学着在不改数据库的情况下对my.cnf配置文件进行修改, 主要的是设置 default-character-set=utf8 但是设置完后数据库 ...
- 正则表达式验证问题(用户名、密码、email、身份证
实现的代码如下: <html> <head> <meta charset="UTF-8"> </head> <body> ...
- Python爬虫之三种数据解析方式
一.引入 二.回顾requests实现数据爬取的流程 指定url 基于requests模块发起请求 获取响应对象中的数据 进行持久化存储 其实,在上述流程中还需要较为重要的一步,就是在持久化存储之前需 ...
- Aligning Plots in a Column作图列对齐
Plot[Sin[x], {x, 0, Pi}] Plot[10000 Sin[x], {x, 0, Pi}] 直接作图左边无法对齐,影响图的美观.可以使用左边界空格实现列对齐,代码如下: optio ...
- Selenium2学习(五)-- SeleniumBuilder辅助定位元素
前言 福利来了,对于用火狐浏览器的小伙伴们,你还在为定位元素而烦恼嘛? 上古神器Selenium Builder来啦,哪里不会点哪里,妈妈再也不用担心我的定位元素问题啦!(但是也不是万能,基本上都能覆 ...