一、设置redis外网访问

更改redis.conf 文件

# vim redis.conf
bind 127.0.0.1      # 注释掉改行
protected-mode yes # 更改模式为no(redis3.2后)

二、设置密码验证

更改redis.conf配置文件

requirepass redhat

或者通过set设置

127.0.0.1:6379> config get requirepass      # 查看密码设置
1) "requirepass"
2) ""
127.0.0.1:6379> config set requirepass "redhat"   # 设置密码
OK
127.0.0.1:6379> config get requirepass       # 已设置认证,无法继续访问
(error) NOAUTH Authentication required.
127.0.0.1:6379> auth "redhat"                  # 键入密码
OK
127.0.0.1:6379> config get requirepass
1) "requirepass"
2) "redhat"

三、redis主从复制

redis 主从复制特点

(1) master 可以拥有多个slave
(2) 多个slave 可以连接同一个master 外,还可以连接到其他slave
(3) 主从复制不会阻塞master,在同步数据时,master 可以继续处理client 请求
(4) 提高系统的伸缩性

redis 主从复制过程

当配置好slave 后,slave 与master 建立连接,然后发送sync 命令。无论是第一次连接还是重新连接,master 都会启动一个后台进程,将数据库快照保存到文件中,同时master 主进程会开始收集新的写命令并缓存。后台进程完成写文件后,master 就发送文件给slave,slave将文件保存到硬盘上,再加载到内存中,接着master 就会把缓存的命令转发给slave,后续master 将收到的写命令发送给slave。如果master 同时收到多个slave 发来的同步连接命令,master 只会启动一个进程来写数据库镜像,然后发送给所有的slave。

redis主从复制配置

安装多个实例

# cp redis.conf redis_slave.
# vim redis_slave.conf

更改以下内容:

pidfile /var/run/redis_slave.pid    
port 6378
logfile "/wh_k/redis-2.8.17/src/redis_slave.log"
dbfilename dump_slave.rdb

修改配置文件redis_slave.conf (主从配置)

# vim redis_slave.conf

添加以下内容:

# slaveof  
slaveof 192.168.61.128 6379
masterauth redhat     # master主服务器有密码,需添加此配置,“redhat”为主服务器密码

启动slave连接数据库

# ./redis-server ../redis_slave.conf
# ./redis-cli -h 192.168.61.128 -p 6378

测试

mater端:

127.0.0.1:6379> select 2
OK
127.0.0.1:6379[2]> keys *
(empty list or set)

slave端:

192.168.61.128:6378> select 2
OK
192.168.61.128:6378[2]> keys *
(empty list or set)

master端插入数据:

127.0.0.1:6379[2]> set name Whk
OK
127.0.0.1:6379[2]> set age 18
OK
127.0.0.1:6379[2]> mget name age
1) "Whk"
2) "18"

slave端测试:

192.168.61.128:6378[2]> keys *
1) "name"
2) "age"
192.168.61.128:6378[2]> mget name age
1) "Whk"
2) "18"

查看角色(主、备)

192.168.61.128:6378[2]> info
...
...
...
# Replication
role:slave

四、redis事务

简单事务控制

127.0.0.1:6379[1]> set age 10
OK
127.0.0.1:6379[1]> multi    # 标记事务块开始
OK
127.0.0.1:6379[1]> set age 15
QUEUED
127.0.0.1:6379[1]> set age 20
QUEUED
127.0.0.1:6379[1]> exec  # 调用
1) OK
2) OK
127.0.0.1:6379[1]> get age
"20"

取消事务discard(事务回滚)

127.0.0.1:6379[1]> get age
"20"
127.0.0.1:6379[1]> multi
OK
127.0.0.1:6379[1]> set age 15
QUEUED
127.0.0.1:6379[1]> set age 10
QUEUED
127.0.0.1:6379[1]> discard
OK
127.0.0.1:6379[1]> get age
"20"

监视命令watch

watch 命令会监视给定的key,当exec 时候如果监视的key 从调用watch 后发生过变化,则整个事务会失败。也可以调用watch 多次监视多个key.这 样就可以对指定的key 加乐观锁了。注意watch 的key 是对整个连接有效的,事务也一样。如果连接断开,监视和事务都会被自动清除。当然了exec,discard,unwatch 命令都会清除连接中的所有监视。

redis事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做。

127.0.0.1:6379[1]> get age
"20"
127.0.0.1:6379[1]> set name whk
OK
127.0.0.1:6379[1]> 
127.0.0.1:6379[1]> watch age
OK
127.0.0.1:6379[1]> multi
OK
127.0.0.1:6379[1]> incr age
QUEUED
127.0.0.1:6379[1]> incr name
QUEUED
127.0.0.1:6379[1]> exec
1) (integer) 21
2) (error) ERR value is not an integer or out of range
127.0.0.1:6379[1]> get age
"21"                                     # age已发生变化
127.0.0.1:6379[1]> get name
"whk"    # name未变化

五、发布和订阅消息

Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息,客户端可以订阅任意数量的频道。有新消息通过PUBLISH 命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的另几个客户端

打开客户端1订阅消息:

127.0.0.1:6379> SUBSCRIBE Wechat
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "Wechat"
3) (integer) 1

打开客户端2发布消息:

127.0.0.1:6379> PUBLISH Wechat "Hello world !"
(integer) 1
127.0.0.1:6379> PUBLISH Wechat "Beautifull"
(integer) 1

打开客户端1查看消息:

127.0.0.1:6379> SUBSCRIBE Wechat
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "Wechat"
3) (integer) 1
1) "message"
2) "Wechat"
3) "Hello world !"
1) "message"
2) "Wechat"
3) "Beautifull"

六、redis 数据备份与恢复

创建备份save

该命令将在 redis 安装目录中创建dump.rdb文件(默认src下)

127.0.0.1:6379> SAVE 
OK

恢复备份

将dump.rdb移至安装目录下启动服务即可。

后台备份bgsave

127.0.0.1:6379> bgsave
Background saving started

7、性能测试

redis 性能测试是通过同时执行多个命令实现的。

[root@Centos6 src]# ./redis-benchmark -n 10000 -q
PING_INLINE: 50505.05 requests per second
PING_BULK: 48309.18 requests per second
SET: 58823.53 requests per second
GET: 60975.61 requests per second
INCR: 60606.06 requests per second
LPUSH: 61349.69 requests per second
LPOP: 59880.24 requests per second
SADD: 61728.39 requests per second
SPOP: 59880.24 requests per second
LPUSH (needed to benchmark LRANGE): 64516.13 requests per second
LRANGE_100 (first 100 elements): 27777.78 requests per second
LRANGE_300 (first 300 elements): 11737.09 requests per second
LRANGE_500 (first 450 elements): 9115.77 requests per second
LRANGE_600 (first 600 elements): 6702.41 requests per second
MSET (10 keys): 39840.64 requests per second

为提升性能,可以采用管道技术:管道技术可以在服务端未响应时,客户端可以继续向服务端发送请求,并最终一次性读取所有服务端的响应。