Redis高级实用特性html
注:我学习的环境是vmware7.1 + ubantu10.10+ redis 3.0.2redis
一、安全性 数据库
设置客户端链接后进行任何其余指定前须要的密码。由于redis速度至关快,一个外部用户能够在一秒钟进行不少次的密码尝试,这就须要设定很是强大的密码来防止暴力破解。 能够在Redis的配置文件中找到以下项: # requirepass foobared requirepass annyubuntu
root@ubuntu:/usr/local/redis# ps -e缓存
root@ubuntu:/usr/local/redis# kill -9 2039
root@ubuntu:/usr/local/redis# netstat -tunpl | grep 6379
root@ubuntu:/usr/local/redis# ./bin/redis-server ./etc/redis.conf
root@ubuntu:/usr/local/redis# ./bin/redis-cli
127.0.0.1:6379> keys *
(error) NOAUTH Authentication required.
127.0.0.1:6379> 安全
为Redis设置密码后,再启动Redis客户端,命令就没法执行。服务器
对Redis客户端进行受权,经过如下命令:学习
127.0.0.1:6379> auth anny
OKui
或者在启动Redis客户端时,设置密码,命令以下:spa
root@ubuntu:/usr/local/redis# ./bin/redis-cli -a anny
二、主从复制
Redis主从复制配置和使用都要很是简单。经过主从复制能够容许多个slave server拥有和master server相同的数据库副本。
Redis主从复制的特色:
一、Master能够拥有多个slave。
二、多个slave能够链接同一个master外,还能够链接到其它的slave。
三、主从复制不会阻塞master, 在同步数据时,master能够继续处理client请求。
四、提升系统的伸缩性。
注意:Redis的主从复制,不只仅是master与slave相链接,也能够slave与slave相链接,当master宕机时,另外一个主要的slave立马转换角色,变成master。
Redis主从复制过程:
一、Slave与master创建链接,发送sync同步命令。
二、master会启动一个后台进程,将数据库快照保存到文件中,同时master主进程会开始收集新的写命令并缓存。
三、后台完在保存后,就将此文件发送给slave。
四、slave将此文件保存到硬盘上。
配置主从服务器:
只须要修改slave的配置文件中加入如下配置:
slaveof 192.168.32.216 6379 #指定master的ip和端口
masterauth anny #这是主机的密码
主从服务器实验操做:
一、首先将本台虚拟机重命名为Redis_master,经过下面命令关机。
root@ubuntu:/usr/local/redis#init 0
二、经过vmware,在Redis_master虚拟机名称上点右键,点击“Clone”命令,一路点“下一步”,直到完成。将新克隆的虚拟机重命名为Redis_slave。
三、分别启动虚拟机redis_master和redis_slave。
四、切换到虚拟机redis_slave,修改IP。修改/usr/local/redis/etc/redis.conf文件,修改如下内容:
slaveof 192.168.32.216 6379
masterauth anny
五、分别启动两台机器的redis-server.
六、咱们在虚拟机redis_master的 redis客户端写入数据,数据会自动同步到虚拟机redis_slave上。
七、如何判断谁是主谁是从,能够经过info命令查看role内容。
三、事务处理
Redis 事务能够一次执行多个命令, 而且带有如下两个重要的保证:
一个事务从开始到执行会经历如下三个阶段:
Redis对事务的支持目前还比较简单。Redis只能保证一个client发起的事务中命令能够连续的执行,而中间不会插入其余client的命令。当一个client在一个链接中发出multi命令时,这个链接会进入一个事务上下文,该链接后续的命令不会当即执行,而是先放到一个队列中,当执行exec命令时,redis会顺序的执行队列中的全部命令。
Redis 事务命令
下表列出了 redis 事务的相关命令:
序号 | 命令及描述 |
---|---|
1 | DISCARD 取消事务,放弃执行事务块内的全部命令。 |
2 | EXEC 执行全部事务块内的命令。 |
3 | MULTI 标记一个事务块的开始。 |
4 | UNWATCH 取消 WATCH 命令对全部 key 的监视。 |
5 | WATCH key [key ...] 监视一个(或多个) key ,若是在事务执行以前这个(或这些) key 被其余命令所改动,那么事务将被打断。 |
multi:将任务命令放入队列
exec:顺序执行本事务上下文队列中的任务命令。
127.0.0.1:6379> get age
"20"
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set age 10
QUEUED
127.0.0.1:6379> set age 20
QUEUED
127.0.0.1:6379> exec
1) OK
2) OK
127.0.0.1:6379> get age
"20"
discard:清空事务的命令队列并退出事务上下文,即咱们常说的事务回滚。
当执行了multi命令后,若是想取消事务处理,可使用discard命令。
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set age 30
QUEUED
127.0.0.1:6379> set age 40
QUEUED
127.0.0.1:6379> discard
OK
127.0.0.1:6379> get age
"20"
强调:在Redis的事务上下文中,当其中某一个命令执行失败时,不会影响到其余命令的执行。这一点跟咱们理解中的事务不同,发生错误,不会回滚。
看下面例子,在整个事务中,第一条命令执行成功,而第二条命令执行失败,但事务没有回滚。
127.0.0.1:6379> get age
"20"
127.0.0.1:6379> get name
"test"
127.0.0.1:6379> multi
OK
127.0.0.1:6379> incr age
QUEUED
127.0.0.1:6379> incr name
QUEUED
127.0.0.1:6379> exec
1) (integer) 21
2) (error) ERR value is not an integer or out of range
127.0.0.1:6379> get age
"21"
乐观锁:
大多数是基于数据版本(version)的记录机制实现的。即为数据增长一个版本标识,在基于数据库表的版本解决方案中,通常是经过为数据库表增长一个“version”字段来实现读出数据时,将此版本号一同读出,以后更新时,对此版本号加1。此时,将提交数据的版本号与数据库表对应记录的当前版本号时行比对,若是提交的数据版本号大于数据库当前版本号,则予以更新,不然认为是过时数据。
watch命令会监视给定的key,当exec的时候若是监视的key从调用watch后发生过变化,则整个事务会失败。也能够调用watch命令屡次监视多个key,这样就能够对指定的key加乐观锁。注意watch的key是对整个链接有效的,事务也同样。若是链接断开,监视和事务都会被自动清除。固然exec、discard、unwatch命令都会清除链接中的全部监视。
Redis乐观锁实例:
在第一个终端中,经过watch命令监控名称为“age“的key:
127.0.0.1:6379> get age
"21"
127.0.0.1:6379> watch age
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set age 18
QUEUED
而后我在第二个终端中,对key为“age“进行赋值。
127.0.0.1:6379> set age 25
OK
而后我又回到第一个终端进行后续命令,这时执行事务返回nil,表示事务执行不成功。
127.0.0.1:6379> exec
(nil)127.0.0.1:6379> get age"25"