挨踢 | 石武浩

石武浩的博客

十月 2015

Redis发布及订阅消息

Redis 的 pub sub可以实现邮件系统,发送者(在 Redis 术语中被称为发布者)发送的邮件,而接收器(用户)接收它们。由该消息传送的链路被称为信道。

开启三个连接进行测试
连接1作为发布端
连接2,连接3作为接受端

连接2订阅 msg1 消息

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

连接3订阅 msg1 msg2 消息

1
2
3
4
5
6
7
8
127.0.0.1:6379> subscribe msg1 msg2
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "msg1"
3) (integer) 1
1) "subscribe"
2) "msg2"
3) (integer) 2

连接1进行消息发布

1
2
publish msg1 asdfghjklqwertyuio
(integer) 2

连接2接收结果

1
2
3
1) "message"
2) "msg1"
3) "asdfghjklqwertyuio"

连接3接收结果

1
2
3
1) "message"
2) "msg1"
3) "asdfghjklqwertyuio"

连接1进行消息发布

1
2
127.0.0.1:6379> publish msg2 1111111111111111111111111111111
(integer) 1

连接2接收结果

1
// 没有接受到消息

连接3接收结果

1
2
3
1) "message"
2) "msg2"
3) "1111111111111111111111111111111"

Redis持久化机制

Redis支持两种持久化方法:
1:snapshotting 快照方式(默认)
快照方式是默认的持久化方式,这种方式将内存中的数据已快照的方式写入到二进制文件中,默认的文件名为dump.rdb。
我们可以通过修改配置文件的方式配置Redis在N秒内如果超过M个key修改就自动做快照。

1
2
3
4
5
6
[root@localhost bin]# vi /usr/local/redis/etc/redis.conf

// 搜索save
save 900 1       // 900秒内超过1个key被修改,发起快照保存
save 300 10      // 300秒内超过10个key被修改,发起快照保存
save 60 10000    // 60秒内超过10000个key被修改,发起快照保存

2:append-only file aof方式
aof比快照方式有更好的持久化性,是由于aof时,Redis会将每一个收到的写命令通过write函数追加到文件中,当Redis重启时,会通过重新执行文件中保存的命令在内存中重建整个数据库的内容

1
2
3
4
5
6
7
8
9
10
11
12
[root@localhost bin]# vi /usr/local/redis/etc/redis.conf
// 启用aof持久化方式
appendonly yes
// aof文件名
appendfilename "appendonly.aof"

// 收到命令就立即写入磁盘,最慢,但是保证完全的持久化
# appendfsync always
// 每秒钟写入磁盘一次,性能和持久化方面比较折中
appendfsync everysec
// 完全依赖系统,性能最好,持久化没保证
# appendfsync no

Redis实现乐观锁

使用watch监控key,对key实现加锁

假设有个age的key,我们开两个连接进行赋值操作

连接一 监控age,开始事务,复制操作,先不执行exec

1
2
3
4
5
6
7
8
9
10
127.0.0.1:6379> set age 1
OK
127.0.0.1:6379> watch age
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set age 10
QUEUED
127.0.0.1:6379> get age
QUEUED

连接二 直接执行赋值操作

1
2
127.0.0.1:6379> set age 100
OK

回到连接一,执行exec操作,此时age值已被连接2改变,事务执行失败

1
2
3
4
127.0.0.1:6379> exec
(nil)
127.0.0.1:6379> get age
"100"

事务处理——Redis学习笔记

Redis对事务的支持还比较简单。Redis只能保证一个client发起的事务中的命令可以连续执行,而中间不会插入其他client的命令。当一个client在一个连接中发出 multi 命令时,这个连接会进入一个事务上下文,该连接的后续命令不会立即执行,二十先放到一个队列中,当执行 exec 命令时,Redis会顺序执行队列中的所有命令。

1:multi
事务开始

2:exec
执行multi发出所有命令

3:discard
取消事务

5:watch
监视一个或多个key

6:unwatch
取消监视

1
2
3
4
5
6
7
8
9
10
127.0.0.1:6379> set name shiwuhao
QUEUED
127.0.0.1:6379> get name
QUEUED
127.0.0.1:6379> incr version
QUEUED
127.0.0.1:6379> exec
1) OK
2) "shiwuhao"
3) (integer) 1

Redis主从复制 提示:Error condition on socket for SYNC: No route to host

从服务器启动Redis提示 “Error condition on socket for SYNC: No route to host” 解决方案

1
2
3
20309:S 03 Oct 18:26:28.358 * Connecting to MASTER 10.211.55.6:6379
20309:S 03 Oct 18:26:28.358 * MASTER <-> SLAVE sync started
20309:S 03 Oct 18:26:28.359 # Error condition on socket for SYNC: No route to host

一般出现该问题是由(主服务器)防火墙引起的

解决方案
1:关掉主服务器防火墙
临时关闭:service iptables stop 永久关闭:chkconfig iptables off

2:防火墙打开端口
#/sbin/iptables -I INPUT -p tcp –dport 6379 -j ACCEPT
#/etc/init.d/iptables save
#service iptables restart

Redis主从复制

Redis主从服务器配置很简单,只需要修改下从服务器的配置文件即可

例如:
master: 10.211.55.6:6379
slaver: 10.211.55.7:6379

修改从服务器配置文件

1
2
3
4
5
6
[root@localhost bin]$ vi /usr/local/redis/etc/redis.conf

// 添加以下配置
slaveof 10.211.55.6 6379
// 如果主服务器开启了身份验证,需要添加主机密码
masterauth shiwuhao

修改完毕,启动测试

主服务器启动

1
2
3
4
5
6
7
8
// 登录
MacBook-Pro:~ root$ ssh root@10.211.55.6
// 启动Redis
[root@localhost ~]$ /usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf &
// 进入客户端
[root@localhost ~]$ /usr/local/redis/bin/redis-cli -a shiwuhao
127.0.0.1:6379> set name shiwuhao
OK

从服务器启动

1
2
3
4
5
6
7
8
9
// 登录
MacBook-Pro:~ root$ ssh root@10.211.55.7
// 启动Redis
[root@localhost ~]$ /usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf &
// 进入客户端
[root@localhost ~]$ /usr/local/redis/bin/redis-cli -a shiwuhao
// 查看是否已同步
127.0.0.1:6379> get name
"shiwuhao"

同步成功

// 如果从服务器启动提示 Error condition on socket for SYNC: No route to host,
解决方案见:Redis主从复制 提示:Error condition on socket for SYNC: No route to host

Redis加入身份验证

Redis数据库可以设置安全,所以做出相关的任何客户端都需要在执行命令之前进行身份验证。为了确保Redis需要设置在配置文件中的密码验证一致。

默认情况下授权密码为空

1
2
3
127.0.0.1:6379> config get requirepass
1) "requirepass"
2) ""

阅读更多

键值相关命令——Redis学习笔记

1:KEYS pattern
返回满足给定pattern的所有key

1
2
3
4
5
6
7
127.0.0.1:6379> keys *
1) "name"
2) "name2"
3) "age"
127.0.0.1:6379> keys n*
1) "name"
2) "name2"

2:EXISTS key [key …]
确认一个key是否存在

1
2
3
4
127.0.0.1:6379> exists name
(integer) 1
127.0.0.1:6379> exists nokey
(integer) 0

阅读更多

有序集合命令——Redis学习笔记

1:ZADD key score member [score member …]
添加一个或多个成员到有序集合,如果该成员已经存在,更新其分数(成员不存在,分数相同时,也会创建新的成员)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
127.0.0.1:6379> zadd zset1 1 one 2 two 3 three
(integer) 3
127.0.0.1:6379> zrange zset1 0 -1 withscores
1) "one"
2) "1"
3) "two"
4) "2"
5) "three"
6) "3"
127.0.0.1:6379> zadd zset1 4 three
(integer) 0
127.0.0.1:6379> zrange zset1 0 -1 withscores
1) "one"
2) "1"
3) "two"
4) "2"
5) "three"
6) "4"
127.0.0.1:6379> zadd zset1 4 five
(integer) 1
127.0.0.1:6379> zrange zset1 0 -1 withscores
1) "one"
2) "1"
3) "two"
4) "2"
5) "five"
6) "4"
7) "three"
8) "4"

阅读更多

无序集合命令——Redis学习笔记

1:SADD key member [member …]
添加一个或多个成员到无序集合

1
2
3
4
5
6
7
127.0.0.1:6379> sadd myset 'hello'
(integer) 1
127.0.0.1:6379> sadd myset 'world'
(integer) 1
127.0.0.1:6379> smembers myset
1) "world"
2) "hello"

2:SCARD key
获取无序集合成员的数量

1
2
3
4
5
127.0.0.1:6379> smembers myset
1) "world"
2) "hello"
127.0.0.1:6379> scard myset
(integer) 2

阅读更多

下一页

程序猿,爱游戏,爱电影,爱折腾
邮箱:admin@shiwuhao.com