redis中的事务与mysql的类似,只有语句有些不同。
redis mysql 开始事务 multi start transition 事务中的query语句 执行事务 exec commit 回滚事务 discard roll back
对于并发影响,redis有watch语句控制,被watch语句监测的key值一旦在事务提交前发生变化,则事务自动被取消回滚。
watch key1 [key2...]
unwatch 取消所有监测。
redis原生发布和订阅功能,它类似于设计模式中的观察者模式,被订阅对象一旦发布了新的消息,那么所有订阅对象都会收到这条消息。使用方式为:
subscribe key //订阅某个key,如果这个key发布了新的消息,则会收听到 public key value//发布消息key,值为value,返回值是收到这个消息的人的个数 unsubscribe key //取消监听 psubscribe key1 key2/pattrn //[根据模式]监听多个key
redis的数据持久化
redis通过rdb和aof两种方式实现数据持久化,两种数据持久化方式都会占用CPU资源,拖慢redis的执行效率,一般两种模式配合使用。
rdb方式的主要原理就是达到某一写入条件后把内存中的所有数据的快照保存一份到磁盘上,数据恢复时用数据快照恢复。
aof方式是通过将每条redis执行命令记录入文本文件,恢复数据时重复执行记录的命令。
rdb方式实现数据持久化
用save/bgSave命令可以主动使用rdb方式[后台]存储rdb
修改redis.conf文件进行配置
save m n //在m秒内有n次修改即进行一次快照,保存点很重要,一般会配置多个条件,满足其中之一就保存 stop-writes-on-bgsave-error yes //在进行快照的过程中如果出错,则停止写入 rdbcompression yes //设置进行数据压缩 rdbchecksum yes //导入数据时检查文件是否损坏 dbfilename xxx.rdb //导出的文件名 dir path //导出的文件路径
aof方式实现数据持久化
aof持久化的问题在于将每条指令都记录下来,即使是对一个键的反复操作,这样会导致aof文件越来越大,使用aof重写将会大大减小aof文件的体积,因为它是在最后将数据库内数据的状态统一逆化为命令,而不论一个key经过了多少次变化。使用 bgrewrite 命令可手动重写aof文件。
配置redis.conf文件:
noapppendfsync-on-rewrite yes //设置导出rdb时停止写入aof,aof会被写在内存队列里,dump rdb 完成后统一进行写入操作。 appendfsync everysec //每秒写入一次 appendfilename //path/filename.aof auto-aof-rewrite-percentage 100 //文件大小增长100%时重写 auto-aof-rewrite-min-size 64m //文件至少达到64m时重写
redis的主从复制
主从复制时,主从都要以自己的.conf文件来启动服务器。主服务器可以将rdb关闭,以从服务器来产生rdb,加快主服务器的速度。
从服务器复制一个redis6380.conf文件,设置端口,pid存放文件,只读,主服务器的密码。
port 6380 pidfile filename slave-read-only yes masterauth password
设置完成后,分别用不同的conf文件打开服务器。
考虑到主服务器宕机的情况,我们用sentinel redis哨兵来监测服务器状态,在主服务器宕机之后做出反应。sentinel是redis集成的,我们只需要将安装包里的sentinel.conf文件拷贝到redis/bin目录下,使用redis-sentinel进程文件来启动服务器即可。
port 26379 //sentinel监听的端口号 daemonize yes //后台启动进程 sentinel monitor mymaster 192.168.100.211 6379 2 //设置主进程ip和端口号,并设置两个哨兵发现主服务器长时间无法连接才判定其宕机 sentinel down-after-milliseconds mymaster 30000 //30000毫秒连接不上判定为无法连接 sentinel parallel-syncs mymaster 1 //一个主服务器打开时,同时复制的从服务器数,太大的话会造成服务器瞬间拥堵 sentinel failover-timeout mymaster 900000 //在90000秒内哨兵不再试图恢复原主服务器
PHP操作redis服务器
安装好php的redis扩展后(具体可参考前面的文章 Linux下php安装Redis扩展的方法 http://www.jb51.net/article/99775.htm),就可以直接使用redis的类函数库了。