redis高级实用特性(2)

事务处理:

redis对事务的支持目前还是比较简单,redis只能保证一个

client发起事务中的命令可以连续执行,而中间不会插入其他

client的命令,当一个client 在一个连接中发出multi命令时,这个

连接会进入一个事务上下文,该连接后续的命令不会立即执行,

而是先放到一个队列中,当执行exec命令时,redis会顺序的执行

队列中的所有命令。

127.0.01:6379> MULTI
OK
127.0.01:6379> set age 20
QUEUED
127.0.01:6379> set age 30
QUEUED
127.0.01:6379> get age
QUEUED
127.0.01:6379> EXEC
1) OK
2) OK
3) "30"

如何取消一个事务

discard 取消事务,达到事务回滚的效果

>>现在的redis对事务的支持还是不完善的

如:

127.0.01:6379> MULTI
OK
127.0.01:6379> incr age
QUEUED
127.0.01:6379> incr name
QUEUED
127.0.01:6379> exec
1) (integer) 31
2) (error) ERR value is not an integer or out of range
当执行事务中的语句出错时,age并没有回滚

 

>>乐观锁复杂事务控制

乐观锁:大多数是是基于数据版本(version)的记录机制实现的。

即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一

般是通过为数据表添加一个version字段来实现读取数据时,将此版本号一同

读出,之后更新时,对此版本号加1.此时,将提交数据的版本号与数据库表对应

的字段版本号进行对比,如果提交的数据版本号大于数据库当前版本号,则给予

更新,否则认为是过期数据。

>redis乐观锁实例:假设有一个age的key,我们开两个session来对age进行复制操作,

这样事务会执行失败,watch 命令会监视给定的key,当exec时,如果监视的key

从调用watch后发生过变化,则整个事务会失败。也可以调用watch多次监视多个

key.这样就可以对指定的key加乐观锁了,注意watch的key是对整个连接

有效的,事务也是一样的,如果连接断开,监视和事务都会自动清除,

当然exec,discard,unwatch命令都会清除连接中的所有监视。

 

>>持久化机制

redis是一个支持持久化的内存数据库,也就是说redis需要经常将内存中的数据

同步到硬盘来保持持久化。redis支持两种持久化方式:

1.snapshotting(快照)也是默认的方式

2.append-only file(缩写aof)的方式

>snapshottting

快照是默认的持久化方式,这种方式是将内存中数据以快照的方式写入

到二进制文件中,默认的 文件名为dump.rdb.可以通过配置设置自动

做快照持久化的方式。我们可以配置redis在n秒内如果超过m个key被

修改就自动做快照。

save 60 10000 #如果60秒内超过10000个key被修改,则发起快照保存

>aof

由于快照方式是在一定间隔时间内做一次,所以如果redis意外down掉得话,

就会丢失最后一次快照后的所有修改。

aof比快照方式有更好的持久化性,是由于在使用aof时,redis会将每一个

收到的写命令都通过write函数追加到文件中,当redis重启时会通过重新执行

文件中保存的写命令来在内存中重建整个数据库内容。

当然由于os会在内核中缓存write做的修改,所以可能不是立即写到磁盘上。

这样aof方式的持久化也还是有可能丢失部分修改。

可以通过配置文件告诉redis,我们想要通过fsync函数强制os写入到磁盘的时机。

appendonly yes //启用aof持久化方式

#appendfsync always //收到写命令就立即写入到磁盘,最慢,但是保证完全的持久化

#appendsync everysec //每秒写入磁盘一次,在性能和持久化方面做了很好的折中

#appendsync no //完全依赖os,性能最好,性能没有保证

 

>>发布及订阅消息

发布订阅(pub/sub)是一种消息通信模式,主要的目的是解除消息发布者和消息订阅者之间

的耦合,redis作为一个pub/sub的server,在订阅者和发布者之间起到了消息路由的功能。

订阅者可以通过subscribe和psubscribe命令向redis server订阅自己感兴趣的消息类型

redis将消息类型称为通道(channel).当发布者通过publish命令向redis server发送

特定类型的信息时,订阅该信息类型的全部client都会收到此消息。

客户端1 subscibe tv1 订阅tv1

publish tv1 "发布的消息"

消息发布时,客户端1会收到信息

 

>>虚拟内存的使用

redis的虚拟内存与操作系统的虚拟内存不是一回事,但是思路和目的都是相同的。

就是暂时把不经常访问的数据从内存交换到磁盘中,从而腾出 宝贵的内存空间用于

其他需要访问的数据。尤其是对于redis这样的内存数据库,内存总是不够用的。除了

可以将数据分割到redis server外。另外能够提高数据库容量的办法就是使用虚拟内存

把那些不经常访问的数据交换到磁盘上。

下面是vm相关的配置:

vm-enabled yes  #开启vm功能

vm-swap-file  /tmp/redis.swap #交换出来的value保存的文件路径

vm-max-memory 1000000 #redis使用的最大内存上限

vm-page-size 32 #每个页面的大小32字节

vm-pages 134217728 #最多使用多少页面

vm-max-threads 4  #用于执行value对象换入的线程数量

 

posted @ 2016-08-03 21:42  玉曲风  阅读(195)  评论(0编辑  收藏  举报