您的位置:首页 > 数据库 > Redis

NoSQL——Redis

2018-08-23 22:44 253 查看

NoSQL——Redis

一、Redis介绍

Redis和Memcached类似,也属于k-v数据存储,但是功能和操作性要比Memcached好很多。

Redis官网redis.io, 当前最新稳定版4.0.1 支持更多value类型,除了和string外,还支持hash、lists(链表)、sets(集合)和sorted sets(有序集合)

redis使用了两种文件格式:全量数据(RDB)[b]和增量请求(aof)[/b]。

全量数据格式是把内存中的数据写入磁盘,便于下次读取文件进行加载。

增量请求文件则是把内存中的数据序列化为操作请求,用于读取文件进行replay得到数据,这种类似于mysql binlog。为了节省资源,当我们手动保存一次全量数据,就可以删除当前的所有增量数据了,有些增量数据其实早就过期了,也可定期利用脚本做一些优化。

redis的存储分为内存存储、磁盘存储和log文件三部分

Redis最大的用户就是新浪微博,它的部署场景大致分为两种:

应用程序直接访问Redis数据库。

应用程序直接访问Redis,只有当Redis访问失败时,才访问Mysql。

Redis适用场景:

取出最新N个数据的操作

排行榜应用,取出Top N操作

需要精确设定过期时间的应用

计数器应用

uniq操作,获取某段时间所有数据排除重复值

实时系统,反垃圾系统

Pub/Sub构建实时消息系统。Redis独有功能,发布/订阅

构建队列系统

缓存

二、redis的安装与配置

[root@ying01 ~]# cd /usr/local/src/
[root@ying01 src]# wget http://download.redis.io/releases/redis-4.0.9.tar.gz 
[root@ying01 src]# tar zxf redis-4.0.9.tar.gz
[root@ying01 src]# cd redis-4.0.9/
[root@ying01 redis-4.0.9]#

[root@ying01 redis-4.0.9]# make && make install

[root@ying01 redis-4.0.9]# echo $?
0

[root@ying01 redis-4.0.9]# vim /etc/redis.conf

以下为redis.conf配置内容的一些设置:

# Examples:
#
# bind 192.168.1.100 10.0.0.1     //此处配置监听IP
# bind 127.0.0.1 ::1

protected-mode yes          //定义保护模式

# Accept connections on the specified port, default is 6379 (IANA #815344).
# If port 0 is specified Redis will not listen on a TCP socket.
port 6379                   //监听端口

daemonize no      //默认值为no,代表前台启动,yes表示后台启动

pidfile /var/run/redis_6379.pid   //定义redis的PID

logfile ""            //此处定义redis的log存放路径,默认为空

dir ./                //定义rdb的存放位置(aof也是存在这个位置),默认为根下

slave-priority 100    //此为设置权重,类似于负责均衡

appendonly no         //只增文件的名称,默认为 no ,不指定

# The name of the append only file (default: "appendonly.aof")

appendfilename "appendonly.aof"  //只增文件的名称为 appendonly.aof

# appendfsync always    // 每次更新数据都写入仅增日志文件。慢,但是最安全。
appendfsync everysec    //每秒调用一次。折中。(默认情况)
# appendfsync no       ///不调用,等待操作系统来清空缓冲区当操作系统要输出数据时。很快。

大概了解以上设置含义,现在把配置文件中部分内容按下面设置;

[root@ying01 ~]# vim /etc/redis.conf

daemonize yes                         //默认为no,现设置为yes

logfile "/var/log/redis.log"         //默认为空

dir /data/redis                      //重新设置目录,原来为根下,等下需要创建定义的目录

appendonly yes                       //原为no

[root@ying01 redis-4.0.9]# mkdir /data/redis

[root@ying01 redis-4.0.9]# redis-server /etc/redis.conf
[root@ying01 redis-4.0.9]# netstat -lntp |grep redis
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      1285/redis-server 1

查看redis.log,发现有记下警告信息:

[root@ying01 redis-4.0.9]# less /var/log/redis.log


第一条 警告信息

WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
#警告:无法强制执行TCP的积压设置511,因为/ proc / sys / net / core / somaxconn设置为较低的值128。

第二条 警告信息

WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.

#overcommit_memory设置为0!在低内存条件下,后台保存可能会失败。要解决此问题,请将“vm.overcommit_memory = 1”添加到/etc/sysctl.conf,然后重新启动或运行命令“sysctl vm.overcommit_memory = 1”以使其生效。

第三条警告信息

WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.

# 警告您在内核中启用了透明大页面(THP)支持。这将导致Redis的延迟和内存使用问题。要解决此问题,请以root身份运行命令“echo never> / sys / kernel / mm / transparent_hugepage / enabled”,并将其添加到/etc/rc.local中,以便在重新启动后保留设置。禁用THP后必须重新启动Redis。


解决方法:(安装日志说明来解决)

在此文件中,先添加以下语句

[root@ying01 redis-4.0.9]# vim /etc/rc.local

sysctl vm.overcommit_memory=1

echo never > /sys/kernel/mm/transparent_hugepage/enable

使用命令行,让其生效;

[root@ying01 redis-4.0.9]# sysctl vm.overcommit_memory=1
vm.overcommit_memory = 1
[root@ying01 redis-4.0.9]# echo never > /sys/kernel/mm/transparent_hugepage/enabled

重启redis服务

[root@ying01 redis-4.0.9]# redis-cli -h 127.0.0.1 -p 6379 shutdown     //停止服务
[root@ying01 redis-4.0.9]# netstat -lntp |grep redis
[root@ying01 redis-4.0.9]# redis-server /etc/redis.conf               //开启服务
[root@ying01 redis-4.0.9]# netstat -lntp |grep redis
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      1285/redis-server 1

再次查看redis.log,发现2个警告已经解除

[root@ying01 redis-4.0.9]# less /var/log/redis.log_._
_.-``__ ''-._
_.-`` `. `_. ''-._ Redis 4.0.9 (00000000/0) 64 bit
.-`` .-```. ```\/ _.,_ ''-._
( ' , .-` | `, ) Running in standalone mode
|`-._`-...-` __...-.``-._|'` _.-'| Port: 6379
| `-._ `._ / _.-' | PID: 1394
`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' | http://redis.io `-._ `-._`-.__.-'_.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-'

1394:M 24 Aug 01:35:48.787 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is s
et to the lower value of 128.
1394:M 24 Aug 01:35:48.787 # Server initialized
1394:M 24 Aug 01:35:48.787 * Ready to accept connections
(END)


https://www.cnblogs.com/GoQC/p/5764201.html

https://www.cnblogs.com/pqchao/p/6549510.html

三、Redis 持久化

和Memcached服务一样,如果关闭RDB和aof数据就会存储在内存中,当重启服务或者重启机器 存储的数据就会丢失。如果数据很重要,我们就需要做持久化。

Redis的两种持久化方式:RDB(Redis DataBase)和AOF(Append Only File)。

RDB:在不同的时间点,将redis存储的数据生成快照并保存到磁盘等介质上。默认情况下,RDB是开启的。

AOF:将Redis执行过的所有指令记录下来,下次Redis重新启动时,只要把这些指令从前到后再重复执行一遍,就可以实现数据恢复了。默认情况,AOF是关闭的。

这两种方式可以同时使用。

如果你没有数据持久化的需求,就可以关闭RDB、AOF,这样就跟memcache一样,变成了一个纯内存数据库。

再次进入redis.conf配置文件

[root@ying01 redis-4.0.9]# vim /etc/redis.conf

#注意下面的演示:

#   In the example below the behaviour will be to save:
#   after 900 sec (15 min) if at least 1 key changed
#   after 300 sec (5 min) if at least 10 keys changed
#   after 60 sec if at least 10000 keys changed
#
#   Note: you can disable saving completely by commenting out all "save" lines.
#
#   It is also possible to remove all the previously configured save
#   points by adding a save directive with a single empty string argument
#   like in the following example:
#
#   save ""         //开启持久化

save 900 1          //表示每(900s)15分钟且至少有1个key改变,就触发一次持久化
save 300 10         //表示每(300s)5分钟且至少有10个key改变,就触发一次持久化
save 60 10000       //表示每(60s)5分钟且至少有10个key改变,就触发一次持久化

关闭持久化:把#去掉则关闭持久化

save ""           //关闭持久化

#save 900 1          //表示每(900s)15分钟且至少有1个key改变,就触发一次持久化
#save 300 10         //表示每(300s)5分钟且至少有10个key改变,就触发一次持久化
#save 60 10000

AOF格式中appendfsync三种形式解析:

# appendfsync always            //一直写,每次有变更就写进去
appendfsync everysec            //安全高效,每一秒记录一次,把数据从内存刷新到磁盘中去
# appendfsync no               //每隔一段时间,根据系统的算法,Linux系统不定期把内存的数据同步到磁盘上去,根据这个频率走,容易丢数据

开启AOF:appendonly yes,默认是appendonly no。

四、 redis数据类型

4.1、string类型

string为最简单的类型,与Memcached一样的类型,一个key对应一个value,其支持的操作与Memcached的操作类似,它的功能更丰富。设置可以存二进制的对象。

[root@ying01 redis-4.0.9]# redis-cli
127.0.0.1:6379> set mykey "abc"              //s设置单个键值
OK
127.0.0.1:6379> get mykey                    //获取键值
"abc"
127.0.0.1:6379> mset k1 a k2 b k3 c k4 d     //设置多个键值
OK
127.0.0.1:6379> mget k2 mykey                //获取多个键值
1) "b"
2) "abc"
127.0.0.1:6379>

4.2 Redis数据类型-list 链表

list是一个链表结构,主要功能是push、pop、获取一个范围的所有值等等。操作中key理解为链表的名字。

应用场景:

使用 list 结构,我们可以轻松地实现最新消息排行等功能(比如新浪微博的 TimeLine )。list 的另一个应用就是消息队列,可以利用 list 的 push操作,将任务存在 list 中,然后工作线程再用pop操作将任务取出进行执行。

127.0.0.1:6379> LPUSH list1 "8"
(integer) 1
127.0.0.1:6379> LPUSH list1 "18"
(integer) 2
127.0.0.1:6379> LPUSH list1 "28"
(integer) 3
127.0.0.1:6379> LRANGE list1 0 -1
1) "28"
2) "18"
3) "8"
127.0.0.1:6379> LPOP list1
"28"
127.0.0.1:6379> LRANGE list1 0 -1
1) "18"
2) "8"
127.0.0.1:6379>

4.3 Redis数据类型-set 集合

set是集合,和我们数学中的集合概念相似,对集合的操作有添加删除元素,有对多个集合求交并差等操作。操作中key理解为集合的名字。

应用场景:

比如在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。因为 Redis 非常人性化的为集合提供了求交集、并集、差集等操作,那么就可以非常方便的实现如共同关注、共同喜好、二度好友等功能,对上面的所有集合操作,你还可以使用不同的命令选择将结果返回给客户端还是存集到一个新的集合中。

建立set1、set2集合元素

127.0.0.1:6379> SADD set1 8
(integer) 0
127.0.0.1:6379> SADD set1 28
(integer) 0
127.0.0.1:6379> SADD set1 58
(integer) 1
127.0.0.1:6379> SADD set2 28
(integer) 1
127.0.0.1:6379> SADD set2 58
(integer) 1
127.0.0.1:6379> SADD set2 88
(integer) 1

查看set1、set2集合

127.0.0.1:6379> SMEMBERS set1
1) "8"
2) "28"
3) "58"
127.0.0.1:6379> SMEMBERS set2
1) "28"
2) "58"
3) "88"

集合并集

127.0.0.1:6379>  SUNION set1 set2
1) "8"
2) "28"
3) "58"
4) "88"

集合交集

127.0.0.1:6379> SINTER set1 set2
1) "28"
2) "58"

集合差集

127.0.0.1:6379> SDIFF set1 set2
1) "8"

删除元素

127.0.0.1:6379> SREM set1 8 28
(integer) 2
127.0.0.1:6379> SMEMBERS set1
1) "58"

4.4 Redis数据类型-sort set 有序集合

sorted set是有序集合,它比set多了一个权重参数score,使得集合中的元素能够按 score 进行有序排列。

应用场景:

比如一个存储全班同学成绩的 Sorted Sets,其集合 value 可以是同学的学号,而 score 就可以是其考试得分,这样在数据插入集合的时候,就已经进行了天然的排序。

127.0.0.1:6379> ZADD score 18 A
(integer) 1
127.0.0.1:6379> ZADD score 8  B
(integer) 1
127.0.0.1:6379> ZADD score 58 ZQ
(integer) 1
127.0.0.1:6379> ZADD score 88 Q
(integer) 1
127.0.0.1:6379> ZRANGE score 0 -1         //正序
1) "B"
2) "A"
3) "ZQ"
4) "Q"
127.0.0.1:6379> ZREVRANGE score 0 -1     //倒序
1) "Q"
2) "ZQ"
3) "A"
4) "B"
127.0.0.1:6379>

4.5 Redis数据类型-hash

在 Memcached 中,我们经常将一些结构化的信息打包成 hashmap,在客户端序列化后存储为一个字符串的值(一般是 JSON 格式),比如用户的昵称、年龄、性别、积分等

127.0.0.1:6379> HSET hash1 name zq      //定义
(integer) 1
127.0.0.1:6379> HSET hash1 age 18
(integer) 1
127.0.0.1:6379> HSET hash1 job sing
(integer) 1
127.0.0.1:6379> HSET hash1 home shanghai
(integer) 1
127.0.0.1:6379> Hget hash1 job         //查看
"sing"
127.0.0.1:6379> Hget hash1 name
"zq"
127.0.0.1:6379> Hget hash1 home
"shanghai"
127.0.0.1:6379> Hget hash1 age
"18"
127.0.0.1:6379>

五、Redis常用操作

5.1 string操作

如果一个key设置两个不同的值,第二个值会覆盖第一个值。

127.0.0.1:6379> set key1 18
OK
127.0.0.1:6379> set key2 58
OK
127.0.0.1:6379> set key1 88
OK
127.0.0.1:6379> get key1
"88"
127.0.0.1:6379>


SETNX 检测键值是否有value 如果有直接返回一个 0 如果没有直接返回一个 1 并且创建此 value

127.0.0.1:6379> SETNX key1 zq
(integer) 0
127.0.0.1:6379> get key1
"88"
127.0.0.1:6379> SETNX key3 zq
(integer) 1
127.0.0.1:6379> get key3
"zq"
127.0.0.1:6379>


setex 针对某个key设置一个过期时间。

127.0.0.1:6379> set key3 zq01 ex 5
OK
127.0.0.1:6379> get key3
(nil)
127.0.0.1:6379> set key3 zq01 ex 50
OK
127.0.0.1:6379> get key3
"zq01"
127.0.0.1:6379>

127.0.0.1:6379> setex key3 10 zq02  //给key3设置过期时间为10s,值为zq02,若key已经存在,会覆盖新的值
OK
127.0.0.1:6379> get key3
"zq02"
127.0.0.1:6379> get key3
(nil)

5.2、list操作

LPUSH 取值,RPOP 或者 LPOP只要把值取出来 其中的值就会被删除掉。

lpush lista a //从左侧加入一个元素
lrange lista 0 -1 //取出从0开始到倒数第一个之间的元素
lpop lista //从左侧取出第一个元素
rpush lista 1 //从右侧加入一个元素
rpop lista //从右侧取出第一个元素

127.0.0.1:6379> LPUSH lista 111
(integer) 1
127.0.0.1:6379> LPUSH lista 222
(integer) 2
127.0.0.1:6379> LPUSH lista 333
(integer) 3
127.0.0.1:6379> LPUSH lista 555
(integer) 4
127.0.0.1:6379> LRANGE lista 0 -1
1) "555"
2) "333"
3) "222"
4) "111"
127.0.0.1:6379> LPOP lista
"555"
127.0.0.1:6379> LPOP lista
"333"
127.0.0.1:6379> LRANGE lista 0 -1
1) "222"
2) "111"
127.0.0.1:6379>  RPOP lista
"111"
127.0.0.1:6379> LRANGE lista 0 -1
1) "222"
127.0.0.1:6379>

元素的修改:先在xxx清单增加 A B C D E ,然后更换第二位的数值

127.0.0.1:6379> LPUSH xxx A
(integer) 1
127.0.0.1:6379> LPUSH xxx B
(integer) 2
127.0.0.1:6379> LPUSH xxx C
(integer) 3
127.0.0.1:6379> LPUSH xxx D
(integer) 4
127.0.0.1:6379> LPUSH xxx E
(integer) 5
127.0.0.1:6379> LSET xxx 2 W
OK
127.0.0.1:6379> LINDEX xxx 2
"W"
127.0.0.1:6379> LINDEX xxx 3
"B"
127.0.0.1:6379> LINDEX xxx 4
"A"
127.0.0.1:6379> LINDEX xxx 5
(nil)
127.0.0.1:6379> LINDEX xxx 1
"D"
127.0.0.1:6379> LINDEX xxx 0
"E"

查看清单中元素的数量

127.0.0.1:6379> LLEN xxx
(integer) 5

在某个元素前面(后面)插入一个元素:

127.0.0.1:6379> LINSERT xxx  before D S
(integer) 6
127.0.0.1:6379> LRANGE xxx 0 -1
1) "E"
2) "S"
3) "D"
4) "W"
5) "B"
6) "A"
127.0.0.1:6379>

5.3、set操作

前面已经演示过,下面set操作整理起来;

命令格式释义
sadd 集合名 元素向集合添加元素
smembers 集合名查看集合中的全部元素
srem 集合名 元素删除元素
spop 集合名取出一个元素,删除
sdiff 集合1 集合2以集合1为标准,求差集
sdiffstore 集合1 集合2 集合3求差集并储存到集合1
sinter 集合1 集合2求交集
sinterstore 集合1 集合2 集合3求交集,并存储到集合1
sunion 集合1 集合2求并集
sunion 集合1 集合2 集合3求并集并存储到集合1
sismembaer 集合 元素判断一个元素是否属于一个集合,是则返回1。
srandmember 集合取出一个元素,但不删除
zadd 集合创建有序集合
zrange 集合 0 -1显示所有元素,按顺序显示
zrange 集合 0 -1 withscores带上分值
zrem 集合 元素删除指定元素
zrank 集合 元素返回元素的索引值
zrevrank 集合 元素按score反向排列
zrevrange 集合 0 -1反向显示,并带分值
zcard 集合返回集合中的元素的个数
zrangebyscore 集合 1 10返回1-10的元素个数
zremrangebyrank 集合 0 2删除索引0-2的元素,按分值正向排序
zremrangebyscore 集合 0 2删除分值0-2的元素

5.3 hash操作

HMSET 批量建立键值对

127.0.0.1:6379> HMSET hash2 a 1 b 2 c 3 d 4 e 5
OK
127.0.0.1:6379> Hgetall hash2
1) "a"
2) "1"
3) "b"
4) "2"
5) "c"
6) "3"
7) "d"
8) "4"
9) "e"
10) "5"


HMGET 查询一个键值

127.0.0.1:6379> hmget hash2 b c
1) "2"
2) "3"

HMGET 查询一个键值

127.0.0.1:6379> hdel hash2 b
(integer) 1
127.0.0.1:6379>  Hgetall hash2
1) "a"
2) "1"
3) "c"
4) "3"
5) "d"
6) "4"
7) "e"
8) "5"


HKEYS 打印所有的键值

127.0.0.1:6379> hkeys hash2
1) "a"
2) "c"
3) "d"
4) "e"


HVALS 打印所有的values

127.0.0.1:6379> hvals hash2
1) "1"
2) "3"
3) "4"
4) "5"


hlen 查看有几个filed

127.0.0.1:6379> hlen hash2
(integer) 4
127.0.0.1:6379>

六、Redis操作键值

常用以下键值

keys * :取出所有键

exists 键名:存在返回1

del 键:删除键

expire 键 100:设置键100秒后过期

ttl 键:查看键的过期时间,单位是秒,当键不存在返回-2,键存在但没设置过期时间返回-1

select 0 :代表选择当前数据库,默认进入0数据库

move age 1 :把age移动到1数据库

persist 键:取消键的过期时间

randomkey:返回一个键

rename oldname newname:重命名

type 键:返回键的类型

查看所有键值:

127.0.0.1:6379> keys *
1) "score"
2) "key1"
3) "set2"
4) "key2"
5) "xxx"
6) "k4"
7) "lista"
8) "list1"
9) "hash1"
10) "set1"
11) "k2"
12) "k1"
13) "k3"
14) "mykey"
15) "hash2"

模糊匹配键:

127.0.0.1:6379> keys ke*
1) "key1"
2) "key2"

判断键是否存在:

127.0.0.1:6379> exists key1
(integer) 1
127.0.0.1:6379> exists key
(integer) 0

删除键

127.0.0.1:6379> get key1
"88"
127.0.0.1:6379> del key1
(integer) 1
127.0.0.1:6379> get key1
(nil)

设置过期时间:

127.0.0.1:6379> expire key2 50
(integer) 1

查看键的过期时间:

127.0.0.1:6379> ttl key2
(integer) 42

选择当前数据库:

127.0.0.1:6379> select 0
OK
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> keys *
(empty list or set)
127.0.0.1:6379[1]> select 0   //代表选择当前数据库,默认进入0 数据库
OK

将某个键移动到其他数据库:

127.0.0.1:6379> keys *
1) "score"
2) "set2"
3) "xxx"
4) "k4"
5) "lista"
6) "list1"
7) "hash1"
8) "set1"
9) "k2"
10) "k1"
11) "k3"
12) "mykey"
13) "hash2"
127.0.0.1:6379> move k1 3
(integer) 1

随机返回一个键:

127.0.0.1:6379> randomkey
"k2"
127.0.0.1:6379> randomkey
"set2"
127.0.0.1:6379> randomkey
"set2"

键重命名:

127.0.0.1:6379> rename k1 kx   //k1不存在
(error) ERR no such key

127.0.0.1:6379> keys *
1) "score"
2) "set2"
3) "xxx"
4) "k4"
5) "lista"
6) "list1"
7) "hash1"
8) "set1"
9) "k2"
10) "k3"
11) "mykey"
12) "hash2"
127.0.0.1:6379> rename k2 k8
OK

键的类型:

127.0.0.1:6379> type score
zset
127.0.0.1:6379> type k8
string
127.0.0.1

dbsize:返回当前数据的key数量

:6379> dbsize
(integer) 12

七、Redis安全设置

如何解决redis漏洞

设置密码

更改默认端口

监听内网IP

设定专用账户

修改configure命令

root@ying01 redis-4.0.9]# vim /etc/redis.conf

port 18000                     //更改端口

requirepass www123             //设置密码

rename-command CONFIG ying    //改为ying,自定义

# rename-command CONFIG ""   //禁用

先不重启服务,查看k8的值

[root@ying01 redis-4.0.9]# redis-cli
127.0.0.1:6379> get k6
(nil)
127.0.0.1:6379> get k8
"b"
127.0.0.1:6379> quit

重启服务

[root@ying01 redis-4.0.9]# killall redis-server
[root@ying01 redis-4.0.9]# redis-server /etc/redis.conf

尝试登录redis

[root@ying01 redis-4.0.9]# redis-cli                                       //直接登录不上
Could not connect to Redis at 127.0.0.1:6379: Connection refused
not connected> quit

[root@ying01 redis-4.0.9]# netstat -lntp |grep redis                       //端口变为18000
tcp        0      0 127.0.0.1:18000         0.0.0.0:*               LISTEN      1832/redis-server 1

[root@ying01 redis-4.0.9]# redis-cli -p 18000                              //指定端口18000 还是登录不上
127.0.0.1:18000> get k8
(error) NOAUTH Authentication required.
127.0.0.1:18000> quit

[root@ying01 redis-4.0.9]# redis-cli -p 18000 -a 'www123'               //端口、密码都指定,才能登录
127.0.0.1:18000> get k8
"b"
127.0.0.1:18000>

八、redis慢查询日志

慢查询日志,两个参数:一个是执行时长,单位是微妙,另一个是慢查询日志的长度。当一个新的命令被写入日志时,最老的一条会从命令日志队列中被移除。

在配置文件redis.conf中,查看慢日志的定义:

[root@ying01 ~]# vim /etc/redis.conf

slowlog-log-slower-than 1000:表示慢于1000ms则记录日志
slowlog-max-len 128:定义长度,最多存128条


使用命令行,查询慢日志

slowlog get:列出 全部慢查询日志

slowlog len:查看慢查询日志条数

先在配置文件中,定义慢于10ms,则记录日志,(为了方便试验,因为任何操作都会大于10ms)

[root@ying01 ~]# vim /etc/redis.conf

slowlog-log-slower-than 10

启动redis服务,开始做测试

[root@ying01 ~]# redis-server /etc/redis.conf
[root@ying01 ~]# ps aux |grep redis
root      1385  4.3  0.7 145304  7692 ?        Ssl  23:36   0:00 redis-server 127.0.0.1:6379
root      1390  0.0  0.0 112720   984 pts/0    R+   23:36   0:00 grep --color=auto redis
[root@ying01 ~]# redis-cli -a 'www123'
127.0.0.1:6379> slowlog get      //此时刚进入了,没有
1) 1) (integer) 0
2) (integer) 1535125047
3) (integer) 283
4) 1) "COMMAND"
5) "127.0.0.1:34834"
6) ""
127.0.0.1:6379> keys *        //试着执行一个命令
1) "set2"
2) "score"
3) "k8"
4) "xxx"
5) "lista"
6) "k4"
7) "k3"
8) "hash2"
9) "hash1"
10) "list1"
11) "set1"
12) "mykey"
127.0.0.1:6379> get k3       //再执行第二个命令
"c"
127.0.0.1:6379> SLOWLOG get    //此时列出全部查询日志
1) 1) (integer) 2
2) (integer) 1535125090
3) (integer) 30
4) 1) "keys"
2) "*"
5) "127.0.0.1:34834"
6) ""
2) 1) (integer) 1
2) (integer) 1535125066
3) (integer) 34
4) 1) "slowlog"
2) "get"
5) "127.0.0.1:34834"
6) ""
3) 1) (integer) 0
2) (integer) 1535125047
3) (integer) 283
4) 1) "COMMAND"
5) "127.0.0.1:34834"
6) ""
127.0.0.1:6379> SLOWLOG get 1    //获得当前的日志
1) 1) (integer) 3
2) (integer) 1535125141
3) (integer) 68
4) 1) "SLOWLOG"
2) "get"
5) "127.0.0.1:34834"
6) ""
127.0.0.1:6379> SLOWLOG get 2     //获得前二个日志
1) 1) (integer) 4
2) (integer) 1535125219
3) (integer) 15
4) 1) "SLOWLOG"
2) "get"
3) "1"
5) "127.0.0.1:34834"
6) ""
2) 1) (integer) 3
2) (integer) 1535125141
3) (integer) 68
4) 1) "SLOWLOG"
2) "get"
5) "127.0.0.1:34834"
6) ""
127.0.0.1:6379> SLOWLOG len       //获得慢日志条数
(integer) 6
127.0.0.1:6379>

九、php安装redis扩展模块

下载phpredis模块源码包,解压

[root@ying01]# cd /usr/local/src/
[root@ying01 src]# wget https://codeload.github.com/phpredis/phpredis/zip/develop 
[root@ying01 src]# mv develop phpredis-develop.zip
[root@ying01 src]# unzip phpredis-develop.zip

编译,安装php的redis模块

[root@ying01 phpredis-develop]# cd phpredis-develop/
[root@ying01 phpredis-develop]# /usr/local/php-fpm/bin/phpize
Configuring for:
PHP Api Version:         20131106
Zend Module Api No:      20131226
Zend Extension Api No:   220131226
[root@ying01 phpredis-develop]#  ./configure --with-php-config=/usr/local/php-fpm/bin/php-config

[root@ying01 phpredis-develop]# make

[root@ying01 phpredis-develop]# make install

在php.ini配置文件中添加 extension=redis.so

[root@ying01 phpredis-develop]# vim /usr/local/php-fpm/etc/php.ini

extension=memcache.so     //memcache模块之前添加的
extension=redis.so       //添加

查看php-fpm模块中,是否有redis模块;

[root@ying01 phpredis-develop]# /usr/local/php-fpm/bin/php -m|grep redis
redis

[root@ying01 phpredis-develop]# /etc/init.d/php-fpm restart
Gracefully shutting down php-fpm . done
Starting php-fpm  done

十、redis存储session

** redis存储session,有三种配置方法**:

1、/usr/local/php-fpm/etc/php.ini中添加:

session.save_handler = "redis"

session.save_path = "http://my.oschina.net/u/3851633/blog/tcp:/127.0.0.1:6379"

2、lamp中在Apache虚拟主机配置文件中添加:

php_value session.save_handler = "redis"

php_value session.save_path = "http://my.oschina.net/u/3851633/blog/tcp:/127.0.0.1:6379"

3、在php-fpm配置文件对应的pool:/usr/local/php-fpm/etc/php-fpm.d/ying.com.conf 中添加:

php_value[session.save_handler] = "redis"

php_value[session.save_path] = "http://my.oschina.net/u/3851633/blog/tcp:/127.0.0.1:6379"

把下面语句添加在 ying.com pool下

[root@ying01 ~]# vim /usr/local/php-fpm/etc/php-fpm.d/ying.com.conf

添加以下语句:

php_value[session.save_handler] = redis
php_value[session.save_path] = " http://my.oschina.net/u/3851633/blog/tcp:/127.0.0.1:6379 "

在redis配置文件中,取消密码,方便试验

[root@ying01 ~]# vim /etc/redis.conf

#requirepass www123         //加上#,就代表此命令不执行

更改配置文件后,需要重启redis服务

[root@ying01 ~]# killall redis-server
[root@ying01 ~]# redis-server /etc/redis.conf

测试中,可以看出来redis是可以存储ssion

[root@ying01 ~]# curl localhost/1.php
1535202678<br><br>1535202678<br><br>fb0tk0r5nnvgs1fhngten6kvf4
[root@ying01 ~]# curl localhost/1.php
1535202680<br><br>1535202680<br><br>d9u8oi1d0o1l2m6blm0gneb9p5 //注意
[root@ying01 ~]# curl localhost/1.php
1535202681<br><br>1535202681<br><br>ks2a20t9gikjbvhpevcrrts5r0
[root@ying01 ~]# curl localhost/1.php
1535202681<br><br>1535202681<br><br>26ff1ifkdi6s6vje10kl1ane36
[root@ying01 ~]# curl localhost/1.php
1535202682<br><br>1535202682<br><br>5setf9nc5ih8de5a8p6dda01r3
[root@ying01 ~]# curl localhost/1.php
1535202682<br><br>1535202682<br><br>phh916fl6s4fcl08agee13cqe6
[root@ying01 ~]# curl localhost/1.php
1535202683<br><br>1535202683<br><br>2467qf64g4j4rk4ac2o2ms4mm6
[root@ying01 ~]# curl localhost/1.php
1535202684<br><br>1535202684<br><br>cl3m6hpshf55unro62ccq4q5h6
[root@ying01 ~]# redis-cli
127.0.0.1:6379> keys *
1) "PHPREDIS_SESSION:d9u8oi1d0o1l2m6blm0gneb9p5"            //注意
2) "score"
3) "PHPREDIS_SESSION:cl3m6hpshf55unro62ccq4q5h6"
4) "list1"
5) "k8"
6) "set1"
7) "PHPREDIS_SESSION:2467qf64g4j4rk4ac2o2ms4mm6"
8) "k3"
9) "PHPREDIS_SESSION:26ff1ifkdi6s6vje10kl1ane36"
10) "PHPREDIS_SESSION:phh916fl6s4fcl08agee13cqe6"
11) "mykey"
12) "PHPREDIS_SESSION:fb0tk0r5nnvgs1fhngten6kvf4"
13) "set2"
14) "hash1"
15) "lista"
16) "hash2"
17) "PHPREDIS_SESSION:ks2a20t9gikjbvhpevcrrts5r0"
18) "k4"
19) "PHPREDIS_SESSION:5setf9nc5ih8de5a8p6dda01r3"
20) "xxx"
127.0.0.1:6379> get PHPREDIS_SESSION:d9u8oi1d0o1l2m6blm0gneb9p5    //注意
"TEST|i:1535202680;TEST3|i:1535202680;"
127.0.0.1:6379> get PHPREDIS_SESSION:5setf9nc5ih8de5a8p6dda01r3
"TEST|i:1535202682;TEST3|i:1535202682;"
127.0.0.1:6379>

十一、redis主从配置

在master(ying01)上修改redis的配置文件,master上改动不大

[root@ying01 ~]# vim /etc/redis.conf

bind 192.168.112.136 127.0.0.1

port 6379

pidfile /var/run/redis_6379.pid

appendonly yes

在slave(ying02)上修改redis的配置文件

[root@ying02 ~]# vim /etc/redis.conf

bind  127.0.0.1 192.168.112.138

port 6380

pidfile /var/run/redis_6380.pid

slaveof 192.168.112.136 6379

appendonly yes

分别在master、slave机器上重启redis服务

[root@ying01 ~]# killall redis-server
[root@ying01 ~]# redis-server /etc/redis.conf

[root@ying02 ~]#  killall redis-server
[root@ying02 ~]# redis-server /etc/redis.conf

分别在master、slave机器上登录redis,使用命令"info Replication"

[root@ying01 ~]# redis-cli -p 6379
127.0.0.1:6379> info Replication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.112.138,port=6380,state=online,offset=14,lag=1
master_replid:87fc3ee31a10a84b042f74e896e060d3acbd9de2
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:14
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:14
127.0.0.1:6379>

slave上的信息

[root@ying02 ~]# redis-cli -p 6380
127.0.0.1:6380>  info Replication
# Replication
role:slave
master_host:192.168.112.136
master_port:6379
master_link_status:up
master_last_io_seconds_ago:5
master_sync_in_progress:0
slave_repl_offset:28
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:87fc3ee31a10a84b042f74e896e060d3acbd9de2
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:28
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:28
127.0.0.1:6380>

上面的信息表明:主从启动成功

十二、redis集群

12.1 、redis集群介绍

先看redis的集群架构图



在这个图中,每一个蓝色的圈都代表着一个redis的服务器节点。它们任何两个节点之间都是相互连通的。客户端可以与任何一个节点相连接,然后就可以访问集群中的任何一个节点。对其进行存取和其他操作。

redis集群特点

多个redis节点网络互联,数据共享

所有的节点都是一主一从(可以是多个从),其中从不提供服务,仅作为备用

不支持同时处理多个键(如mset/mget),因为redis需要把键均匀分布在各个节点上,并发量很高的情况下同时创建键值会降低性能并导致不可预测的行为。

支持在线增加、删除节点

客户端可以连任何一个主节点进行读写

参考资料

三张图秒懂Redis集群设计原理

12.2 redis集群搭建配置

ying01机器上

新建redis_7000.conf配置文件

[root@ying01 ~]# cd /etc/
[root@ying01 etc]# vim redis_7000.conf

port 7000
bind 192.168.112.136
daemonize yes
pidfile /var/run/redis_7000.pid
dir /data/redis_data/7000
cluster-enabled yes
cluster-config-file nodes_7000.conf
cluster-node-timeout 10100
appendonly yes

新建redis_7002.conf配置文件

[root@ying01 etc]# vim redis_7002.conf

port 7002
bind 192.168.112.136
daemonize yes
pidfile /var/run/redis_7002.pid
dir /data/redis_data/7002
cluster-enabled yes
cluster-config-file nodes_7002.conf
cluster-node-timeout 10100
appendonly yes

新建redis_7004.conf配置文件

[root@ying01 etc]# vim redis_7004.conf

port 7004
bind 192.168.112.136
daemonize yes
pidfile /var/run/redis_7004.pid
dir /data/redis_data/7004
cluster-enabled yes
cluster-config-file nodes_7004.conf
cluster-node-timeout 10100
appendonly yes

创建目录

[root@ying01 etc]# mkdir /data/redis_data
[root@ying01 etc]# mkdir /data/redis_data/{7000,7002,7004}

分别开启7000、7002、7004的redis服务

[root@ying01 etc]# redis-server /etc/redis_7000.conf
13835:C 27 Aug 00:20:59.978 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
13835:C 27 Aug 00:20:59.978 # Redis version=4.0.9, bits=64, commit=00000000, modified=0, pid=13835, just started
13835:C 27 Aug 00:20:59.978 # Configuration loaded
[root@ying01 etc]# redis-server /etc/redis_7002.conf
13840:C 27 Aug 00:21:08.133 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
13840:C 27 Aug 00:21:08.133 # Redis version=4.0.9, bits=64, commit=00000000, modified=0, pid=13840, just started
13840:C 27 Aug 00:21:08.133 # Configuration loaded
[root@ying01 etc]# redis-server /etc/redis_7004.conf
13845:C 27 Aug 00:21:13.131 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
13845:C 27 Aug 00:21:13.131 # Redis version=4.0.9, bits=64, commit=00000000, modified=0, pid=13845, just started
13845:C 27 Aug 00:21:13.131 # Configuration loaded
[root@ying01 etc]# netstat -lntp |grep redis
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      1741/redis-server 1
tcp        0      0 192.168.112.136:6379    0.0.0.0:*               LISTEN      1741/redis-server 1
tcp        0      0 192.168.112.136:17004   0.0.0.0:*               LISTEN      13846/redis-server
tcp        0      0 192.168.112.136:7000    0.0.0.0:*               LISTEN      13836/redis-server
tcp        0      0 192.168.112.136:7002    0.0.0.0:*               LISTEN      13841/redis-server
tcp        0      0 192.168.112.136:7004    0.0.0.0:*               LISTEN      13846/redis-server
tcp        0      0 192.168.112.136:17000   0.0.0.0:*               LISTEN      13836/redis-server
tcp        0      0 192.168.112.136:17002   0.0.0.0:*               LISTEN      13841/redis-server
[root@ying01 etc]# ps aux |grep redis
root      1741  0.1  0.5 147352  9840 ?        Ssl  8月26   0:05 redis-server 192.168.112.136:6379
root     13836  0.0  0.4 145308  7580 ?        Ssl  00:20   0:00 redis-server 192.168.112.136:7000 [cluster]
root     13841  0.1  0.4 145308  7576 ?        Ssl  00:21   0:00 redis-server 192.168.112.136:7002 [cluster]
root     13846  0.0  0.4 145308  7576 ?        Ssl  00:21   0:00 redis-server 192.168.112.136:7004 [cluster]
root     13853  0.0  0.0 112720   984 pts/0    S+   00:21   0:00 grep --color=auto redis

ying02 机器上

新建redis_7001.conf配置文件

[root@ying02 etc]# vim redis_7001.conf

port 7001
bind 192.168.112.138
daemonize yes
pidfile /var/run/redis_7001.pid
dir /data/redis_data/7001
cluster-enabled yes
cluster-config-file nodes_7001.conf
cluster-node-timeout 10100
appendonly yes

新建redis_7003.conf配置文件

[root@ying02 etc]# vim redis_7003.conf

port 7003
bind 192.168.112.138
daemonize yes
pidfile /var/run/redis_7003.pid
dir /data/redis_data/7003
cluster-enabled yes
cluster-config-file nodes_7003.conf
cluster-node-timeout 10100
appendonly yes

新建redis_7005.conf配置文件

[root@ying02 etc]# vim redis_7005.conf

port 7005
bind 192.168.112.138
daemonize yes
pidfile /var/run/redis_7005.pid
dir /data/redis_data/7005
cluster-enabled yes
cluster-config-file nodes_7005.conf
cluster-node-timeout 10100
appendonly yes

创建目录

[root@ying02 etc]# mkdir /data/redis_data
[root@ying02 etc]# mkdir /data/redis_data/{7001,7003,7005}

分别开启7001、7003、7005的redis服务

[root@ying02 etc]# redis-server /etc/redis_7001.conf
4535:C 27 Aug 00:22:55.023 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
4535:C 27 Aug 00:22:55.023 # Redis version=4.0.9, bits=64, commit=00000000, modified=0, pid=4535, just started
4535:C 27 Aug 00:22:55.023 # Configuration loaded
[root@ying02 etc]# redis-server /etc/redis_7003.conf
4544:C 27 Aug 00:22:59.103 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
4544:C 27 Aug 00:22:59.103 # Redis version=4.0.9, bits=64, commit=00000000, modified=0, pid=4544, just started
4544:C 27 Aug 00:22:59.103 # Configuration loaded
[root@ying02 etc]# redis-server /etc/redis_7005.conf
4552:C 27 Aug 00:23:03.193 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
4552:C 27 Aug 00:23:03.193 # Redis version=4.0.9, bits=64, commit=00000000, modified=0, pid=4552, just started
4552:C 27 Aug 00:23:03.193 # Configuration loaded
[root@ying02 etc]# netstat -lntp |grep redis
tcp        0      0 192.168.112.138:17003   0.0.0.0:*               LISTEN      4545/redis-server 1
tcp        0      0 192.168.112.138:6380    0.0.0.0:*               LISTEN      2974/redis-server 1
tcp        0      0 127.0.0.1:6380          0.0.0.0:*               LISTEN      2974/redis-server 1
tcp        0      0 192.168.112.138:17005   0.0.0.0:*               LISTEN      4553/redis-server 1
tcp        0      0 192.168.112.138:7001    0.0.0.0:*               LISTEN      4536/redis-server 1
tcp        0      0 192.168.112.138:7003    0.0.0.0:*               LISTEN      4545/redis-server 1
tcp        0      0 192.168.112.138:7005    0.0.0.0:*               LISTEN      4553/redis-server 1
tcp        0      0 192.168.112.138:17001   0.0.0.0:*               LISTEN      4536/redis-server 1
[root@ying02 etc]# ps aux |grep redis
root      2974  0.1  0.1 147352  2516 ?        Ssl  8月26   0:05 redis-server 127.0.0.1:6380
root      4536  0.0  0.1 145308  2648 ?        Ssl  00:22   0:00 redis-server 192.168.112.138:7001 [cluster]
root      4545  0.1  0.1 145308  2652 ?        Ssl  00:22   0:00 redis-server 192.168.112.138:7003 [cluster]
root      4553  0.0  0.1 145308  2648 ?        Ssl  00:23   0:00 redis-server 192.168.112.138:7005 [cluster]
root      4565  0.0  0.0 112720   984 pts/0    R+   00:23   0:00 grep --color=auto redis

在ying01机器上安装ruby2.2(只需要在ying01上安装)

[root@ying01 ~]# yum -y groupinstall "Development Tools"

[root@ying01 ~]# yum -y install gdbm-devel libdb4-devel libffi-devel libyaml libyaml-devel ncurses-devel openssl-devel readline-devel tcl-deve

创建rpmbuild目录及其子目录

[root@ying01 ~]# mkdir -p rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}
[root@ying01 ~]# ls rpmbuild/
BUILD  BUILDROOT  RPMS  SOURCES  SPECS  SRPMS

下载ruby的源码包,存放在rpmbuild/SOURCES目录下

[root@ying01 ~]# wget http://cache.ruby-lang.org/pub/ruby/2.2/ruby-2.2.3.tar.gz -P rpmbuild/SOURCES

下载ruby的spec的文件,目的rpmbuild把其生成rpm文件

[root@ying01 ~]# wget https://raw.githubusercontent.com/tjinjin/automate-ruby-rpm/master/ruby22x.spec -P rpmbuild/SPECS

[root@ying01 ~]# rpmbuild -bb rpmbuild/SPECS/ruby22x.spec

安装 ruby-2.2.3-1.el7.centos.x86_64.rpm ,并查看其版本号

[root@ying01 ~]# ls rpmbuild/RPMS/x86_64/ruby-2.2.3-1.el7.centos.x86_64.rpm
rpmbuild/RPMS/x86_64/ruby-2.2.3-1.el7.centos.x86_64.rpm
[root@ying01 ~]# du -sh !$
du -sh rpmbuild/RPMS/x86_64/ruby-2.2.3-1.el7.centos.x86_64.rpm
10M	rpmbuild/RPMS/x86_64/ruby-2.2.3-1.el7.centos.x86_64.rpm
[root@ying01 ~]# rpm -ivh rpmbuild/RPMS/x86_64/ruby-2.2.3-1.el7.centos.x86_64.rpm
准备中...                          ################################# [100%]
正在升级/安装...
1:ruby-2.2.3-1.el7.centos          ################################# [100%]

[root@ying01 ~]# ruby -v                          //查看版本号
ruby 2.2.3p173 (2015-08-18 revision 51636) [x86_64-linux]

用gem安与redis中与ruby相关的文件 redis-trib.rb

[root@ying01 ~]# gem install redis
Fetching: redis-4.0.2.gem (100%)
Successfully installed redis-4.0.2
Parsing documentation for redis-4.0.2
Installing ri documentation for redis-4.0.2
Done installing documentation for redis after 1 seconds
1 gem installed

现在把redis-trib.rb 复制到/usr/bin/下,可以直接使用这个命令

[root@ying01 ~]#  cp /usr/local/src/redis-4.0.9/src/redis-trib.rb /usr/bin/

用redis-trib.rb 命令分配主、从端口

[root@ying01 ~]#  redis-trib.rb create --replicas 1 192.168.112.136:7000 192.168.112.136:7002 192.168.112.136:7004 192.168.112.138:7001 192.168.112.138:7003 192.168.112.138:7005
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.112.136:7000
192.168.112.138:7001
192.168.112.136:7002
Adding replica 192.168.112.138:7005 to 192.168.112.136:7000
Adding replica 192.168.112.136:7004 to 192.168.112.138:7001
Adding replica 192.168.112.138:7003 to 192.168.112.136:7002
M: 25cff1f2c0d7e296b8af969ac8c1de535e8ddf6c 192.168.112.136:7000
slots:0-5460 (5461 slots) master
M: f2690645620ad4c4042536108e576158dec751b3 192.168.112.136:7002
slots:10923-16383 (5461 slots) master
S: 022afc487ced1c543ee85c4f9ba591b377d5e9e1 192.168.112.136:7004
replicates 0ff8984070960a56f204d992d176ca7275e06c1d
M: 0ff8984070960a56f204d992d176ca7275e06c1d 192.168.112.138:7001
slots:5461-10922 (5462 slots) master
S: 578367da301f9d795854ce2ee3daf56d5971e7de 192.168.112.138:7003
replicates f2690645620ad4c4042536108e576158dec751b3
S: 0e107e02f89ef282470174bfa6bcf6cdfebc8271 192.168.112.138:7005
replicates 25cff1f2c0d7e296b8af969ac8c1de535e8ddf6c
Can I set the above configuration? (type 'yes' to accept): yes   //满意就 yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join....
>>> Performing Cluster Check (using node 192.168.112.136:7000)
M: 25cff1f2c0d7e296b8af969ac8c1de535e8ddf6c 192.168.112.136:7000
slots:0-5460 (5461 slots) master
1 additional replica(s)
S: 578367da301f9d795854ce2ee3daf56d5971e7de 192.168.112.138:7003
slots: (0 slots) slave
replicates f2690645620ad4c4042536108e576158dec751b3
M: 0ff8984070960a56f204d992d176ca7275e06c1d 192.168.112.138:7001
slots:5461-10922 (5462 slots) master
1 additional replica(s)
S: 0e107e02f89ef282470174bfa6bcf6cdfebc8271 192.168.112.138:7005
slots: (0 slots) slave
replicates 25cff1f2c0d7e296b8af969ac8c1de535e8ddf6c
S: 022afc487ced1c543ee85c4f9ba591b377d5e9e1 192.168.112.136:7004
slots: (0 slots) slave
replicates 0ff8984070960a56f204d992d176ca7275e06c1d
M: f2690645620ad4c4042536108e576158dec751b3 192.168.112.136:7002
slots:10923-16383 (5461 slots) master
1 additional replica(s)
[OK] All nodes agree about slots configuration.          //成功的标志
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.                            //成功的标志
[root@ying01 ~]# echo $?
0

12.3 、redis集群操作

开始以集群的方式登录,创建不同的值,观察存在哪个服务器(端口)

[root@ying01 ~]# redis-cli -c -h 192.168.112.136 -p 7000     //-c 表示以集群的方式登录,否则就是单机登录
192.168.112.136:7000> set key1 aaa
-> Redirected to slot [9189] located at 192.168.112.138:7001
OK
192.168.112.138:7001> set key2 bbb
-> Redirected to slot [4998] located at 192.168.112.136:7000
OK
192.168.112.136:7000> set key3 ccc
OK
192.168.112.136:7000> set key4 ddd
-> Redirected to slot [13120] located at 192.168.112.136:7002
OK
192.168.112.136:7002> set key5 eee
-> Redirected to slot [9057] located at 192.168.112.138:7001
OK
192.168.112.138:7001> get key3
-> Redirected to slot [935] located at 192.168.112.136:7000
"ccc"
192.168.112.136:7000> get key4
-> Redirected to slot [13120] located at 192.168.112.136:7002
"ddd"
192.168.112.136:7002>

检测集群状态 redis-trib.rb IP:port

[root@ying01 ~]# redis-trib.rb check 192.168.112.136:7000   //可以跟任何端口
>>> Performing Cluster Check (using node 192.168.112.136:7000)
M: 25cff1f2c0d7e296b8af969ac8c1de535e8ddf6c 192.168.112.136:7000
slots:0-5460 (5461 slots) master
1 additional replica(s)
S: 578367da301f9d795854ce2ee3daf56d5971e7de 192.168.112.138:7003
slots: (0 slots) slave
replicates f2690645620ad4c4042536108e576158dec751b3
M: 0ff8984070960a56f204d992d176ca7275e06c1d 192.168.112.138:7001
slots:5461-10922 (5462 slots) master
1 additional replica(s)
S: 0e107e02f89ef282470174bfa6bcf6cdfebc8271 192.168.112.138:7005
slots: (0 slots) slave
replicates 25cff1f2c0d7e296b8af969ac8c1de535e8ddf6c
S: 022afc487ced1c543ee85c4f9ba591b377d5e9e1 192.168.112.136:7004
slots: (0 slots) slave
replicates 0ff8984070960a56f204d992d176ca7275e06c1d
M: f2690645620ad4c4042536108e576158dec751b3 192.168.112.136:7002
slots:10923-16383 (5461 slots) master
1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

以集群的方式登录到redis下,一些重用操作:

列出节点 cluster nodes

192.168.112.136:7000> CLUSTER NODES
578367da301f9d795854ce2ee3daf56d5971e7de 192.168.112.138:7003@17003 slave f2690645620ad4c4042536108e576158dec751b3 0 1535304518521 5 connected
0ff8984070960a56f204d992d176ca7275e06c1d 192.168.112.138:7001@17001 master - 0 1535304516000 4 connected 5461-10922
25cff1f2c0d7e296b8af969ac8c1de535e8ddf6c 192.168.112.136:7000@17000 myself,master - 0 1535304516000 1 connected 0-5460
0e107e02f89ef282470174bfa6bcf6cdfebc8271 192.168.112.138:7005@17005 slave 25cff1f2c0d7e296b8af969ac8c1de535e8ddf6c 0 1535304518000 6 connected
022afc487ced1c543ee85c4f9ba591b377d5e9e1 192.168.112.136:7004@17004 slave 0ff8984070960a56f204d992d176ca7275e06c1d 0 1535304517513 4 connected
f2690645620ad4c4042536108e576158dec751b3 192.168.112.136:7002@17002 master - 0 1535304519527 2 connected 10923-16383


查看集群的信息 cluster info

192.168.112.136:7000> CLUSTER INFO
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:1135
cluster_stats_messages_pong_sent:1094
cluster_stats_messages_sent:2229
cluster_stats_messages_ping_received:1089
cluster_stats_messages_pong_received:1135
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:2229


添加节点 cluster meet ip port

在ying02机器上,新建一个7007的配置文件

[root@ying02 etc]# vim redis_7007.conf

port 7007
bind 192.168.133.132
daemonize yes
pidfile /var/run/redis_7007.pid
dir /data/redis_data/7007
cluster-enabled yes
cluster-config-file nodes_7007.conf
cluster-node-timeout 10100
appendonly yes

创建目录,并启动

[root@ying02 etc]# mkdir /data/redis_data/7007
[root@ying02 etc]# redis-server /etc/redis_7007.conf
6060:C 27 Aug 01:37:20.129 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
6060:C 27 Aug 01:37:20.129 # Redis version=4.0.9, bits=64, commit=00000000, modified=0, pid=6060, just started
6060:C 27 Aug 01:37:20.129 # Configuration loaded
[root@ying02 etc]# ps aux |grep redis
root      2974  0.1  0.1 147352  2516 ?        Ssl  8月26   0:09 redis-server 127.0.0.1:6380
root      4536  0.0  0.1 147356  3184 ?        Ssl  00:22   0:04 redis-server 192.168.112.138:7001 [cluster]
root      4545  0.0  0.1 147356  3068 ?        Ssl  00:22   0:04 redis-server 192.168.112.138:7003 [cluster]
root      4553  0.0  0.1 147356  3064 ?        Ssl  00:23   0:04 redis-server 192.168.112.138:7005 [cluster]
root      6061  0.2  0.1 145308  2648 ?        Ssl  01:37   0:00 redis-server 192.168.112.138:7007 [cluster]
root      6071  0.0  0.0 112720   984 pts/0    S+   01:37   0:00 grep --color=auto redis

再回到ying01上,添加这个节点

192.168.112.136:7000> CLUSTER MEET 192.168.112.138 7007
OK
192.168.112.136:7000> CLUSTER NODES  //发现7007为master
7bacdb18381ac0101abad973180a890cd2da2d39 192.168.112.138:7007@17007 master - 0 1535305180270 0 connected
578367da301f9d795854ce2ee3daf56d5971e7de 192.168.112.138:7003@17003 slave f2690645620ad4c4042536108e576158dec751b3 0 1535305182000 5 connected
0ff8984070960a56f204d992d176ca7275e06c1d 192.168.112.138:7001@17001 master - 0 1535305179263 4 connected 5461-10922
25cff1f2c0d7e296b8af969ac8c1de535e8ddf6c 192.168.112.136:7000@17000 myself,master - 0 1535305179000 1 connected 0-5460
0e107e02f89ef282470174bfa6bcf6cdfebc8271 192.168.112.138:7005@17005 slave 25cff1f2c0d7e296b8af969ac8c1de535e8ddf6c 0 1535305183291 6 connected
022afc487ced1c543ee85c4f9ba591b377d5e9e1 192.168.112.136:7004@17004 slave 0ff8984070960a56f204d992d176ca7275e06c1d 0 1535305182285 4 connected
f2690645620ad4c4042536108e576158dec751b3 192.168.112.136:7002@17002 master - 0 1535305182000 2 connected 10923-16383
192.168.112.136:7000>

在ying01上新建7006配置文件

[root@ying01 etc]# vim redis_7006.conf

port 7006
bind 192.168.112.136
daemonize yes
pidfile /var/run/redis_7006.pid
dir /data/redis_data/7006
cluster-enabled yes
cluster-config-file nodes_7006.conf
cluster-node-timeout 10100
appendonly yes

创建相应的数据目录,并开启7006的redis服务

[root@ying01 etc]# mkdir /data/redis_data/7006
[root@ying01 etc]# redis-server /etc/redis_7006.conf
29220:C 27 Aug 01:52:30.488 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
29220:C 27 Aug 01:52:30.488 # Redis version=4.0.9, bits=64, commit=00000000, modified=0, pid=29220, just started
29220:C 27 Aug 01:52:30.488 # Configuration loaded

再次登录到集群下,增加7006的节点,此时7006也为master

[root@ying01 etc]# redis-cli -c -h 192.168.112.136 -p 7000
192.168.112.136:7000> CLUSTER MEET 192.168.112.136 7006
OK
192.168.112.136:7000> CLUSTER NODES
7bacdb18381ac0101abad973180a890cd2da2d39 192.168.112.138:7007@17007 master - 0 1535306149035 0 connected
578367da301f9d795854ce2ee3daf56d5971e7de 192.168.112.138:7003@17003 slave f2690645620ad4c4042536108e576158dec751b3 0 1535306148026 5 connected
0ff8984070960a56f204d992d176ca7275e06c1d 192.168.112.138:7001@17001 master - 0 1535306147000 4 connected 5461-10922
25cff1f2c0d7e296b8af969ac8c1de535e8ddf6c 192.168.112.136:7000@17000 myself,master - 0 1535306142000 1 connected 0-5460
0e107e02f89ef282470174bfa6bcf6cdfebc8271 192.168.112.138:7005@17005 slave 25cff1f2c0d7e296b8af969ac8c1de535e8ddf6c 0 1535306147000 6 connected
022afc487ced1c543ee85c4f9ba591b377d5e9e1 192.168.112.136:7004@17004 slave 0ff8984070960a56f204d992d176ca7275e06c1d 0 1535306146000 4 connected
288a9bcba1d561ae4bdb016794b46b098c52ebb5 192.168.112.136:7006@17006 master - 0 1535306147000 0 connected
f2690645620ad4c4042536108e576158dec751b3 192.168.112.136:7002@17002 master - 0 1535306147018 2 connected 10923-16383
192.168.112.136:7000>


将当前节点设置为指定节点的从: cluster replicate node_id

[root@ying01 etc]# redis-cli -c -h 192.168.112.136 -p 7006 //以7006端口登录到集群
192.168.112.136:7006> CLUSTER REPLICATE 7bacdb18381ac0101abad973180a890cd2da2d39  //把7006设置7007的从,此id是7007的
OK
192.168.112.136:7006> CLUSTER NODES
25cff1f2c0d7e296b8af969ac8c1de535e8ddf6c 192.168.112.136:7000@17000 master - 0 1535306375000 1 connected 0-5460
0e107e02f89ef282470174bfa6bcf6cdfebc8271 192.168.112.138:7005@17005 slave 25cff1f2c0d7e296b8af969ac8c1de535e8ddf6c 0 1535306374000 1 connected
578367da301f9d795854ce2ee3daf56d5971e7de 192.168.112.138:7003@17003 slave f2690645620ad4c4042536108e576158dec751b3 0 1535306376198 2 connected
f2690645620ad4c4042536108e576158dec751b3 192.168.112.136:7002@17002 master - 0 1535306377505 2 connected 10923-16383
288a9bcba1d561ae4bdb016794b46b098c52ebb5 192.168.112.136:7006@17006 myself,slave 7bacdb18381ac0101abad973180a890cd2da2d39 0 1535306372000 7 connected
0ff8984070960a56f204d992d176ca7275e06c1d 192.168.112.138:7001@17001 master - 0 1535306376500 4 connected 5461-10922
7bacdb18381ac0101abad973180a890cd2da2d39 192.168.112.138:7007@17007 master - 0 1535306374484 0 connected
022afc487ced1c543ee85c4f9ba591b377d5e9e1 192.168.112.136:7004@17004 slave 0ff8984070960a56f204d992d176ca7275e06c1d 0 1535306375492 4 connected
192.168.112.136:7006>


移除某个节点:cluster forget node_id

不能移走master,也不能移走当前节点的

192.168.112.136:7006> CLUSTER FORGET 288a9bcba1d561ae4bdb016794b46b098c52ebb5    //不能够在7006下移走7006
(error) ERR I tried hard but I can't forget myself...
192.168.112.136:7006>
[root@ying01 etc]# redis-cli -c -h 192.168.112.136 -p 7000      //换一个节点登录集群
192.168.112.136:7000> CLUSTER FORGET 288a9bcba1d561ae4bdb016794b46b098c52ebb5
OK
192.168.112.136:7000> CLUSTER NODES            //此时就能移动7006
7bacdb18381ac0101abad973180a890cd2da2d39 192.168.112.138:7007@17007 master - 0 1535306852959 0 connected
578367da301f9d795854ce2ee3daf56d5971e7de 192.168.112.138:7003@17003 slave f2690645620ad4c4042536108e576158dec751b3 0 1535306851954 5 connected
0ff8984070960a56f204d992d176ca7275e06c1d 192.168.112.138:7001@17001 master - 0 1535306851000 4 connected 5461-10922
25cff1f2c0d7e296b8af969ac8c1de535e8ddf6c 192.168.112.136:7000@17000 myself,master - 0 1535306847000 1 connected 0-5460
0e107e02f89ef282470174bfa6bcf6cdfebc8271 192.168.112.138:7005@17005 slave 25cff1f2c0d7e296b8af969ac8c1de535e8ddf6c 0 1535306850000 6 connected
022afc487ced1c543ee85c4f9ba591b377d5e9e1 192.168.112.136:7004@17004 slave 0ff8984070960a56f204d992d176ca7275e06c1d 0 1535306850000 4 connected
f2690645620ad4c4042536108e576158dec751b3 192.168.112.136:7002@17002 master - 0 1535306850947 2 connected 10923-16383
192.168.112.136:7000>


保存配置文件: cluster saveconfig

192.168.112.136:7000> CLUSTER SAVECONFIG
OK
192.168.112.136:7000>

在ying02机器上,在端口下的nodes_700x的文件下,都保存了之前的设置

[root@ying02 etc]# vim /data/redis_data/7003/nodes_7003.conf

022afc487ced1c543ee85c4f9ba591b377d5e9e1 192.168.112.136:7004@17004 slave 0ff8984070960a56f204d992d176ca7275e06c1d 0 1535306360718 4 connected
7bacdb18381ac0101abad973180a890cd2da2d39 192.168.112.138:7007@17007 master - 0 1535306359000 0 connected
0e107e02f89ef282470174bfa6bcf6cdfebc8271 192.168.112.138:7005@17005 slave 25cff1f2c0d7e296b8af969ac8c1de535e8ddf6c 0 1535306359710 6 connected
578367da301f9d795854ce2ee3daf56d5971e7de 192.168.112.138:7003@17003 myself,slave f2690645620ad4c4042536108e576158dec751b3 0 1535306358000 5 connected
288a9bcba1d561ae4bdb016794b46b098c52ebb5 192.168.112.136:7006@17006 slave 7bacdb18381ac0101abad973180a890cd2da2d39 0 1535306361121 7 connected
f2690645620ad4c4042536108e576158dec751b3 192.168.112.136:7002@17002 master - 0 1535306361120 2 connected 10923-16383
25cff1f2c0d7e296b8af969ac8c1de535e8ddf6c 192.168.112.136:7000@17000 master - 0 1535306358100 1 connected 0-5460
0ff8984070960a56f204d992d176ca7275e06c1d 192.168.112.138:7001@17001 master - 0 1535306360000 4 connected 5461-10922
vars currentEpoch 7 lastVoteEpoch 0
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  NoSQL Redis f2c F2