Redis高级实用特性
Redisd的高级特性包括:安全性、事务处理、持久化机制、发布订阅消息、虚拟内存的实用、主从复制。
Redis安全性
查看密码配置参数
127.0.0.1:6379> config get requirepass
1) "requirepass"
2) ""
默认情况下,此属性为空,表示没有设置密码,此实例。您可以通过执行以下命令来更改这个属性(重启失效)
127.0.0.1:6379> config set requirepass "123456"
OK
127.0.0.1:6379> config get requirepass
(error) NOAUTH Authentication required.
127.0.0.1:6379> auth 123456
OK
127.0.0.1:6379> config get requirepass
1) "requirepass"
2) "123456"
设置密码,如果任何客户端运行命令没有验证,报错NOAUTH需要验证。因此,客户端需要使用AUTH命令进行认证。
AUTH命令的基本语法如下所示:
127.0.0.1:6379> AUTH password
127.0.0.1:6379> AUTH 111
(error) ERR invalid password
127.0.0.1:6379> AUTH 123456
OK
上述方法设置的密码值当服务器重启后失效,要永久有效需要把密码写入配置文件中:
# requirepass foobared requirepass 123456
然后重启服务器,则密码设置生效。通过两种方式进行授权
1、登入后验证
127.0.0.1:6379> keys * (error) NOAUTH Authentication required. 127.0.0.1:6379> auth 123456 OK 127.0.0.1:6379> keys * (empty list or set)
2、登入时验证
[root@centos-7 ~]# redis-cli -a 123456 127.0.0.1:6379> keys * (empty list or set)
远程服务器上运行命令
要在Redis远程服务器上运行的命令,需要通过同一个客户端redis-cli 连接到服务器
$ redis-cli -h host -p port -a password
例:下面的示例演示了如何连接到Redis主机:192.168.100.200,端口:6379上的远程服务器,并加上验证密码为:123456(需要注意远程服务器的防火墙)
root@Ubuntu:/usr/local/redis/etc# redis-cli -h 192.168.100.200 -p 6379 -a 123456
127.0.0.1:6379> ping
PONG
主从复制
Redis主从复制配置和使用都非常简单。通过主从复制可以允许多个slave server拥有和master server相同的数据库副本。
Redis主从复制特点:
1、master可以拥有多个slave
2、多个slave可以连接同一个master外,还可以连接到其它slave
3、主从复制不会阻塞master,在同步数据时,master可以继续处理client请求
4、提高系统的伸缩性
Redis主从复制过程:
1、slave与master建立连接,发送sync同步命令
2、master会启动一个后台进程,将数据库快照保存到文件中,同时master主进程会开始收集新的写命令并缓存。
3、后台完成保存后,将此文件发送给slave
4、slave将此文件保存到硬盘上
配置主从服务器:
配置slave服务器很简单,只需要在slave的配置文件中加入以下配置:
# slaveof <masterip> <masterport> slaveof 192.168.100.200 6379 #指定master的ip和端口 # If the master is password protected (using the "requirepass" configuration # directive below) it is possible to tell the slave to authenticate before # starting the replication synchronization process, otherwise the master will # refuse the slave request. # # masterauth <master-password> masterauth 123456 #这是主机的密码
可以通过info来查看主从的信息
--主服务器 # Replication role:master connected_slaves:1 slave0:ip=192.168.100.150,port=6379,state=online,offset=326,lag=0 ... --从服务器 # Replication role:slave master_host:192.168.100.200 master_port:6379 master_link_status:up ...
SLAVEOF NO ONE 可以使当前数据库停止接收其他数据库的同步,转成主数据库
事务处理
Redis对事物的支持目前还比较简单。Redis只保证一个client发起的事物中的命令可以连续的执行,而中间不会插入其他client的命令。当一个client在一个连接中发出multi命令时,这个连接会进入一个事物上下文,该连接后续的命令不会立即执行,而是先放到一个队列中,当执行exec命令时,redis会顺序的执行队列中的所有命令。
127.0.0.1:6379> get age "30" 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
127.0.0.1:6379> get age "20" 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"
当其中一个步骤出现错误时不会回滚
127.0.0.1:6379> get age "20" 127.0.0.1:6379> get name "simon" 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.此时,将提交数据的版本号与数据库表对应记录的当期版本号进行比对,如果提交的数据版本号大于数据库当前版本号,则予以更新,否则认为是过期数据。
Redis乐观锁实例:
假设有一个age的key、我们开2个session来对age进行赋值操作,我们来看一下结果如何。
(1)session1

(2)session2

(3)session1

watch命令会监视给定的key、当exec时候如果监视的key从调用watch后发生过变化,则整个事物会失败。也可以调用watch多次监视多个key。这样就可以对指定的key加乐观锁了。注意watch的key是对整个连接有效的,事物也一样。如果连接断开,监视和事物都会被自动清除。当然了exec、discard、unwatch命令都会清除连接中的所有监视。
事物回滚
redis的事务实现是如此简单,当然会存在一些问题;第一个问题是redis只能保证事务的每个命令连续执行,但是如果事务中的一个命令失败了,并不回滚其他命令,比如使用的命令类型不匹配。
发布及订阅消息
发布订阅(pub/sub)是一种消息通信模式,主要的目的是解除消息发布者和消息订阅者之间的耦合,Redis作为一个pub/sub的server,在订阅者和发布者之间起到了消息路由的功能。订阅者可以通过subscribe和psubscribe命令向redis server订阅自己感兴趣的消息类型,redis将信息类型称为通道(channel)。当发布者通过publish命令向redis server发送特定类型的信息时,订阅该信息类型的全部client都会收到此消息。
虚拟内存的使用
Redis的虚拟内存与操作系统的虚拟内存不是一回事,但是思路和目的都是相同的。就是暂时把不经常访问的数据从内存交互到磁盘中,从而腾出宝贵的内存空间用于其他需要访问的数据。尤其是对于redis这样的内存数据库,内存总是不够用的。除了可以将数据分割到多个redis server外。另外能够提高数据库容量的办法就是使用虚拟内存把那些不经常访问的数据交换到磁盘上。
下面是vm相关配置:

浙公网安备 33010602011771号