redis(五) 高级应用(事务处理,持久化操作,pub_sub、虚拟内存)

高级应用之事务处理,持久化操作,pub_sub、虚拟内存。

简单的事务处理:
redis只能保证一个client发起的事务中的命令可以连续的执行,而中间不会插入其他client的命令。当一个clien在连续中发出multi命令时,这个连接会进入一个事务的上下文,该连续后续的命令不会立即执行,而是会先放到一个队列中,当执行exec命令时,redis会顺序的执行队列中的所有命令。

示例:
127.0.0.1:6379> set age 10
OK
127.0.0.1:6379> get age
"10"
127.0.0.1:6379> multi    //开启一个事务
OK
127.0.0.1:6379> set age 20
QUEUED        //表示加入队列中
127.0.0.1:6379> set age 30
QUEUED        //表示加入队列中
127.0.0.1:6379> exec    //执行队列中的命令,先执行age 等于20 ,在执行age等于30。返回队列中的执行中每个的结果
1) OK
2) OK
127.0.0.1:6379> get age
"30"


discard:清空事务的队列,并退出事务。(事务回滚)
127.0.0.1:6379> set name a
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set name b
QUEUED
127.0.0.1:6379> set name c
QUEUED
127.0.0.1:6379> discard
OK
127.0.0.1:6379> get name
"a"


注意:
redis事务没有完整性,一致性,事务队列中是独立执行的(例如:小明给小王转100元,小明-100,小王+100,如果小王+100失败,那么小明-100任然能成功执行。)

乐观锁复杂事务控制:
乐观锁:类似版本控制器,如果提交的数据版本号大于当前数据的版本号,则更新,否则认为是过期数据。

wath命令会监控给定的key,当exec时候如果监控的key从调用wath后发生变化则整个事务会失败。
wath keyname:

unwatch:清除所有监视

redis持久化机制:
redis是一个支持持久化的内存数据库,也就是说redis需要经常将内存中的数据同步到硬盘来保持持久化
redis支持的两种持久化方式:
1:snapashotting(快照)也是默认方式。
2:Append-only file(缩写aof)的方式。

Snapshotting方式(快照)--默认
快照是默认的持久化方式,这种方式是将内存中数据以快照的方式写进二进制文件中,可以通过配置设置自动快照持久化的方式。我默认的文件名为dump.rdb可以设置redis在n秒内如果超过m个key被修改就自动启动快照。

save 900 1  //900秒内超过1个key被修改,则发起快照保存。
save 300 10
save 60 10000

注意这种方式不太安全,当还没有到被保存的时间服务器已经坏掉了。就会出现数据丢失

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

问题:
当然由于os会在内核中缓存write做的修改,所以可能不是立即写到磁盘中。这样aof方式持久化也还是会有可能丢失部分修改数据。
解决方法:
可以通过配置文件(redis.conf)告诉redis我们想要通过fsync(同步)函数强制os写入到磁盘的时机。


appendonly yes  //启动aof持久化方式
appendfsync always //收到命令就立即写入磁盘。最慢,但是保证完全的持久化。
appendfsync everysec//每秒钟写入磁盘一次,在性能和持久化做了很好的折中
appendfsync no//完全依赖os,性能最好,持久化没有保证


发布与订阅消息
发布订阅(pub/sub)是一种消息通信模式。主要目的是解除消息发布者和消息订阅者之间的耦合。订阅者可以通过subscribe和pubscribe命令向redis server 订阅自己监听的变量。发布者通过puslish命令向redis server发送特定特性的信息,订阅此类型的全部client都会收到
redis(五) 高级应用(事务处理,持久化操作,pub_sub、虚拟内存)

redis(五) 高级应用(事务处理,持久化操作,pub_sub、虚拟内存)
虚拟内存的使用
暂时把不经常访问的数据从内存交换到磁盘中,从而腾出宝贵的内存空间用于其他需要访问的数据,尤其是对于redis这样的内存数据库,内存总是不够用的,除了可以将数据分割到多个redis server外,另外能够提高数据库容量的办法就是使用虚拟内存把那些不经常访问的数据交互到磁盘。

虚拟内存配置
下面是VM相关配置:
vm-enabled yes                        //开启vm功能
vm-swap-file /tmp/redis.swap  //交换出来的value保存的文件路径
vm-max-memory 10000000    //redis使用的最大内存上限
vm-page-size 32                     //每个页面的大小32个字节  
vm-pages 134217728      //最多使用多少页面
vm-max-threads 4 //用于执行value对象换入缓存的工作线程数量。