Redis(事务、持久化)

1、redis简介

redis是NoSQL(Not Only SQL):非关系型数据库

常见的非关系型数据库有:MongoDB、Redis、Memcache。

Redis是一个开源的使用ANSIC语言编写、支持网络、可基于内存、持久化的日志型、Key-Value数据库,并提供多种语言的API。

支持的数据类型:String(字符串)、hash(哈希)、list(列表)、set(集合)和zset(sorted set :有序集合)。这些都支持push/pop、add/remove以及交集并集和差集等操作。

redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

Redis的所有数据都是保存在内存中,然后不定期的通过异步方式保存到磁盘上(半持久化模式);也可以把每一次数据变化都写入到一个append only file(aof)里面(全持久化模式)。由于Redis的数据都存放在内存中,如果没有配置持久化,redis重启后数据就全丢失了,于是需要开启redis的持久化功能,将数据保存到磁盘上,当redis重启后,可以从磁盘中恢复数据。redis提供两种方式进行持久化,一种是DRB持久化(原理是将redis在内存中的数据库记录定时dump到磁盘上的RDB持久化),另外一种是AOF(append only file)持久化(原理是将Redis的操作日志以追加的方式写入文件)。

2、Redis常用的命令
ping :测试redis数据库是否连接成功
set a 12 :表示a为键存储一个值为12;
keys * :查看当前所有库的key;
exists key :判断某个key是否存在;
type key : 查看key是什么类型
del key :删除指定的key数据
unlike key :根据value删除非阻塞删除。
expire key 10 :指定key的有效期为10秒;
ttl key :查看指定的key还有多少秒过期,-1表示永不过期
select dbindex :切换数据库 默认为0;
flushdb :清空当前数据库;
flushall :清空全部数据库
1、String字符串类型:

set <key> <value>:设置键值对的

get <key> :获取键得到对应的值

append <key> newValue:往key中追加值。

strlen <key>:查看键的长度。

incr/decr:原子递增/递减1

incrby/descrby:递增或递减指定的数字

mset <key> <value> <key> <value> :可以同时设置多个键值对

mget <key> <key> :可以同时得到键的值

getrange:获取值的范围 getrange key start end;

setrange key <起始位置> <value> :覆盖指定位置的值

getset:<key> <value> :以新换旧,设置新值的同时返回旧值。

2、List列表

redis列表是简单的字符串列表,按照插入排序,可以添加一个元素到列表的头部(左边)或者尾部(右边),他的底层是使用的双向链表实现的,对两端的操作性能很高。通过索引下标操作组件节点性能会比较差。

lpush/rpush:从左边或者右边插入一个或多个值。

lrange <key> <start> <stop> :从列表左边获取指定范围内的值

lpop/rpop <key> <count> :从左边或者右边弹出多个元素

count:可以省略 默认值为1。

lpop/rpop 操作之后,弹出的值会从列表中删除,如果列表内的值全部弹出,则键将被删除。

llen <key>:获取列表长度

linsert:在某个值的前面或后面插入一个值

linsert <key> before|after <value> <newvalue>

3、发布和订阅

redis的发布和订阅(pub/sub)是一种消息通信模式:发布者发布消息,订阅者接受消息,redis客户端可以订阅任意数量的频道。

subscrible:订阅一个或者多个频道

subscrible channel [channel1.....]

publish:发布消息到指定的频道

publish channel message

psubscribe:可以支持通配符来订阅多个符合给定模式的频道

psubscrible pattern [pattern.....] 可能会遇到*通配符
4、事务和锁

redis的事务是一个单独的隔离操作,事务中的所有命令都会序列化,按顺序的执行,事务在执行的过程中,不会被其他客户端发来的命令请求所打断。redis事务的主要作用就是串联多个命令防止别的命令插队。

Multi、Exec 、Discard

从输入Multi命令开始,输入的命令都会依次进入命令队列中,但不会执行,直到输入Exec后,redis会将之前的命令依次执行。组队的过程中可以通过discard来放弃组队。

redis事务分为2个阶段:组队阶段和执行阶段

组队阶段:只是将所有命令加入命令队列;

执行阶段:依次执行队列中的命令,在执行这些命令的过程中,不会被其他客户端发送的请求命令插队或打断。

multi:标记一个事务块的开始,事务块内的多条命令会按照先后顺序放进一个队列中,最后有exec命令原子性(atomic)地执行。

乐观锁(Optimistic Lock)顾名思义,就是很乐观,每次去拿数据的时候都会认为别人不会修改,所以不会上锁,但是在修改的时候会判断一下再次期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量。redis就是使用这种check-and-set机制实现事务的。redis默认支持乐观锁机制。

unwatch:取消监视

取消WATCH命令对所有key的监视,如果在执行WATCH命令之后,EXEC命令或DISCARD命令先被执行了的话,那么就不需要再执行UNWATCH了,因为exec命令会执行事务,因此watch命令的效果已经产生了,而discard命令在取消事务的同时也会取消所有对key的监视,因此这两个命令执行之后,就没有必要执行unwatch了。

redis事务的三大特征:

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

2、没有隔离级别的概念:队列中的命令没有提交exec之前,都不会实际被执行,因为事务提交前任何指令都不会被实际执行。

3、不能保证原子性:事务中如果有一条命令执行失败,后续的命令任然会被执行,没有回滚,如果在组队阶段,有1个失败了,后面年都不会成功;如果在组队阶段成功了,在执行阶段有那个命令失败就这条失败,其他的命令则正常执行,不保证都成功或都失败。

5、持久化

1、触发PDB备份

save用来配置备份的规则save的格式:

save 秒钟 写操作次数

默认是1分钟内修改1万次,或5分钟内需要修改10次,或30分钟修改1次。

手动执行命令备份(save,bgsave、flushall)有三个命令可以触发备份。

save:save时只管保存,其他不管,全部阻塞,手动保存 不建议使用;

bgsave:redis会在后台异步进行快照操作,快照同时还可以相应客户端情况。可以通过lastsave命令获取最后一次成功生成快照的时间。

flushall:执行flushall命令,也会产生dump.db文件,但里面是空的,无意义。

优势:

适合大规模数据恢复、对数据完整性和一致性要求不高更适合使用、节省磁盘空间、恢复速度快。

2、AOP

以日志的形式来记录每个写操作(增量保存),将redis执行过的所有写指令记录下来(读操作不记录),只允许追加文件但不可改写文件,redis启动之初会读取该文件重新构造数据,换言之,redis重启的话就根据日志文件的内容将写指令从前到后执行一次,以完成数据的恢复工作。

AOF持久化流程:

1、客户端的请求写命令会被append追加到AOF缓冲区内;

2、AOF缓冲区会根据AOF持久挂策略【always,everysec,no】将操作sync同步到磁盘的AOF文件中;

3、AOF文件大小超过重写策略或手写重写时,会对AOF文件进行重写(rewrite),压缩AOF文件容量;

4、redis服务器重启时,会重新load加载AOF文件中的写操作达到数据恢复的目的。

AOF默认不开启 可以在redis.conf文件中进行配置。

appendonly on # yes是开启,no是关闭,默认为no。
appendfilename "appendonly.aof"  # aof文件名称,默认为appendonly.aof
dir ./  # aof文件所在目录

当AOF和RDB同时开启,系统默认取AOF的数据(数据不会存在丢失)AOF的备份机制和性能虽然和RDB不同,但是备份和恢复的操作同RDB一样,都是拷贝备份文件,需要恢复时再拷贝到Redis工作目录下,启动系统即加载。

AOF同步频率设置:

1、appendfsync always:每次写入立即同步,始终同步,每次redis的写入都会like记入日志;性能较差但数据完整性比较好。

2、appendfsync everysec:每秒同步,每秒记录日志一次,如果宕机,本地数据可能丢失;更新的命令会放在内存中AOF缓冲区,每秒将缓冲区的命令追加到AOF文件;

3、appendfsync no:不主动同步,redis不主动进行同步,把同步交给操作系统。

  • 50
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值