21.1什么是NoSQL?
常见NoSQL数据库
21.2Memcached介绍
- Memcached是国外社区网站LiveJournal团队开发,目的是为了通过缓存数据库查询结果,减少数据库访问次数,从而提高动态web站点性能。
- 官方站点 http://www.memcached.org/
- 数据结构简单(k-v),数据存放在内存里
- 多线程
- 基于c/s架构,协议简单
- 基于libevent的事件处理
- 自主内存存储处理(slab allowcation)
- 数据过期方式:Lazy Expiration 和 LRU
Memcached的数据流向
Slab allocation
Slab Allocation的原理
- 将分配的内存分割成各种尺寸的块(chunk), 并把尺寸相同的块分成组(chunk的集合),每个chunk集合被称为slab。
- Memcached的内存分配以Page为单位,Page默认值为1M,可以在启动时通过-I参数来指定。
- Slab是由多个Page组成的,Page按照指定大小切割成多个chunk。
Growth factor
- Memcached在启动时通过-f选项可以指定 Growth Factor因子。该值控制chunk大小的差异。默认值为1.25。
- 通过memcached-tool命令查看指定Memcached实例的不同slab状态,可以看到各Item所占大小(chunk大小)差距为1.25
- 命令:# memcached-tool 127.0.0.1:11211 display
Memcached的数据过期方式
21.3 安装memcached
- yum install -y memcached libmemcached libevent
- systemctl start memcached
- vim /etc/sysconfig/memcached 可以配置参数
- 比如加上监听的ip,可以把OPTIONS="" 改为OPTIONS="127.0.0.1"
- 其中-m指定memcached分配内存
- -c指定最大并发数
- -u指定运行memcached服务的用户
[root@Dasoncheng ~]# yum install -y memcached libmemcached libevent
##memcached 依赖于libevent,yum安装的时候会顺带安装
[root@Dasoncheng ~]# systemctl start memcached ##启动服务
[root@Dasoncheng ~]# ps aux |grep memcached
##ps查看进程详情,可以通过/usr/bin/memcached 指定参数来启动服务-u 指定用户、-p指定端口、-m指定内存大小、-c指定chunk大小;或者修改配置参数 vim /etc/sysconfig/memcached
memcach+ 3152 0.0 0.1 325568 1184 ? Ssl 10:35 0:00 /usr/bin/memcached -u memcached -p 11211 -m 64 -c 1024
root 3159 0.0 0.0 112660 968 pts/1 S+ 10:35 0:00 grep --color=auto memcached
[root@Dasoncheng ~]# netstat -lntp |grep memcached
tcp 0 0 0.0.0.0:11211 0.0.0.0:* LISTEN 3152/memcached
tcp6 0 0 :::11211 :::* LISTEN 3152/memcached
21.4 查看memcached状态
- memcached-tool 127.0.0.1:11211 stats
- 或者echo stats |nc 127.0.0.1 11211 需要安装nc工具 yum install -y nc
- 若安装libmemcached后,可以使用命令
- memstat --servers=127.0.0.1:11211 查看memcached服务状态
[root@Dasoncheng ~]# memcached-tool 127.0.0.1:11211 stats
#127.0.0.1:11211 Field Value
curr_items 0
get_hits 0
##通过这两个值 来判断是否有数据通过nosql缓存
[root@Dasoncheng ~]# yum install -y nc
[root@Dasoncheng ~]# echo stats |nc 127.0.0.1 11211
STAT pid 3152
##和stats效果差不多
[root@Dasoncheng ~]# memstat --servers=127.0.0.1:11211
Server: 127.0.0.1 (11211)
pid: 3152
uptime: 1357
##三种效果都差不多
三种执行方法:
- [root@Dasoncheng ~]# memcached-tool 127.0.0.1:11211 stats
- [root@Dasoncheng ~]# echo stats |nc 127.0.0.1 11211
- [root@Dasoncheng ~]# memstat --servers=127.0.0.1:11211
21.5 memcached命令行
[root@Dasoncheng ~]# telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
set keyname 0 30 2
ab
STORED
set keyname2 0 30 3
abc
STORED
Memcached语法规则
- <command name> <key> <flags> <exptime> <bytes>\r\n <data block>\r\n
- 注:\r\n在windows下是Enter键
- <command name> 可以是set, add, replace
- set表示按照相应的<key>存储该数据,没有的时候增加,有的时候覆盖
- add表示按照相应的<key>添加该数据,但是如果该<key>已经存在则会操作失败
- replace表示按照相应的<key>替换数据,但是如果该<key>不存在则操作失败。
- <key> 客户端需要保存数据的key
- <flags> 是一个16位的无符号的整数(以十进制的方式表示)。该标志将和需要存储的数据一起存储,并在客户端get数据时返回。客户端可以将此标志用做特殊用途,此标志对服务器来说是不透明的。
- <exptime> 为过期的时间。若为0表示存储的数据永远不过期(但可被服务器算法:LRU 等替换)。如果非0(unix时间或者距离此时的秒数),当过期后,服务器可以保证用户得不到该数据(以服务器时间为标准)。
- <bytes> 需要存储的字节数,当用户希望存储空数据时<bytes>可以为0
- <data block>需要存储的内容,输入完成后,最后客户端需要加上\r\n(直接点击Enter)作为结束标志。
Memcached数据示例
[root@Dasoncheng ~]# telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
set key3 1 100 4
##set是创建,如果存在key3会覆盖(add则会报错,replace若key3不存在则会报错)
1234
STORED
get key3 ##get 查看key3
VALUE key3 1 4
1234
END
replace key3 1 1000 2
ab
STORED
get key3
VALUE key3 1 2
ab
END
delete key3 ##delete删除
DELETED
get key3
END
21.6 memcached数据导出和导入
[root@Dasoncheng ~]# telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
set key1 1 0 1
a
STORED
set key2 1 10 2
ab
STORED
set key3 1 0 3
abc
STORED
set key4 1 0 4
abcd
STORED
^]
telnet> quit
Connection closed.
导出:
[root@Dasoncheng ~]# memcached-tool 127.0.0.1:11211 dump
Dumping memcache contents
Number of buckets: 1
Number of items : 4
Dumping bucket 1 - 4 total items
add key1 1 1507602916 1
a
add key4 1 1507602916 4
abcd
add key3 1 1507602916 3
abc
[root@Dasoncheng ~]# memcached-tool 127.0.0.1:11211 dump >data.txt
Dumping memcache contents
Number of buckets: 1
Number of items : 3
Dumping bucket 1 - 3 total items
[root@Dasoncheng ~]# cat data.txt
add key1 1 1507602916 1
a
add key4 1 1507602916 4
abcd
add key3 1 1507602916 3
abc
[root@Dasoncheng ~]# memcached-tool 127.0.0.1:11211 stats
#127.0.0.1:11211 Field Value
curr_connections 11
curr_items 3
decr_hits 0
decr_misses 0
delete_hits 1
delete_misses 0
evicted_unfetched 0
evictions 0
expired_unfetched 2
get_hits 8
……
导入:
[root@Dasoncheng ~]# nc 127.0.0.1 11211 <data.txt ##这里为什么为失败呢?因为我们用的是add,但nosql里面已经有了这些数据 所以:
NOT_STORED
NOT_STORED
NOT_STORED
[root@Dasoncheng ~]# systemctl restart memcached ##重启服务,清除掉内存里面的数据
[root@Dasoncheng ~]# nc 127.0.0.1 11211 <data.txt
STORED
STORED
STORED
[root@Dasoncheng ~]# telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
get key1
END
get key2
END
^]
##为什么数据都不存在呢?我们查看data.txt 看看有什么猫腻
telnet> quit
Connection closed.
[root@Dasoncheng ~]# cat data.txt
add key1 1 1507602916 1
a
add key4 1 1507602916 4
abcd
add key3 1 1507602916 3
abc
[root@Dasoncheng ~]# date -d @1507602916 ##原来这里面add加上了他们创建的时候带的时间戳(即使我们设定0用不过去),故导入的数据已经过期了
Tue Oct 10 10:35:16 CST 2017
[root@Dasoncheng ~]# date -d "+1 hour" +%s
1507690161
[root@Dasoncheng ~]# vim data.txt ##这里我们修改时间戳推后一小时
[root@Dasoncheng ~]# cat data.txt
add key1 1 1507690161 1 ##修改为后一小时的时间戳
a
add key4 1 1507602916 4
abcd
add key3 1 100 3 ##修改过期时间为100秒
abc
[root@Dasoncheng ~]# nc 127.0.0.1 11211 <data.txt ##成功导入
STORED
STORED
STORED
[root@Dasoncheng ~]# telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
get key1
VALUE key1 1 1
a
END
get key2
END
get key3
VALUE key3 1 3
abc
END
get key4
END
^]
telnet> quit
Connection closed.
21.7 php连接memcached
21.8 memcached中存储session
本实例是在lamp/lnmp环境下实现
- 编辑php.ini添加两行
- session.save_handler = memcache session.save_path = "tcp://192.168.0.9:11211"
- 或者httpd.conf中对应的虚拟主机中添加
- php_value session.save_handler "memcache" php_value session.save_path "tcp://192.168.0.9:11211"
- 或者php-fpm.conf对应的pool中添加
- php_value[session.save_handler] = memcache
- php_value[session.save_path] = " tcp://192.168.0.9:11211 "
- wget http://study.lishiming.net/.mem_se.txt
- mv .mem_se.txt /usr/local/apache2/htdocs/session.php
- 其中session.php内容可以参考https://coding.net/u/aminglinux/p/yuanke_centos7/git/blob/master/21NOSQL/session.php
- curl localhost/session.php
- 类似于1443702394<br><br>1443702394<br><br>i44nunao0g3o7vf2su0hnc5440
- telnet 127.0.0.1 11211
- get i44nunao0g3o7vf2su0hnc5440
21.9 redis介绍
21.10 redis安装
安装redis:
[root@Dasoncheng ~]# cd /usr/local/src/
[root@Dasoncheng src]# wget http://download.redis.io/releases/redis-4.0.1.tar.gz
[root@Dasoncheng src]# ll
-rw-r--r-- 1 root root 1711660 Jul 24 21:59 redis-4.0.1.tar.gz
[root@Dasoncheng src]# tar -zxf redis-4.0.1.tar.gz
[root@Dasoncheng src]# ll
drwxrwxr-x 6 root root 309 Jul 24 21:58 redis-4.0.1
[root@Dasoncheng redis-4.0.1]# yum install -y gcc ##缺少gcc库,安装:
[root@Dasoncheng redis-4.0.1]# make
cd src && make all
make[1]: Entering directory `/usr/local/src/redis-4.0.1/src'
CC adlist.o
In file included from adlist.c:34:0:
zmalloc.h:50:31: fatal error: jemalloc/jemalloc.h: No such file or directory
#include <jemalloc/jemalloc.h>
^
compilation terminated.
make[1]: *** [adlist.o] Error 1
make[1]: Leaving directory `/usr/local/src/redis-4.0.1/src'
make: *** [all] Error 2
[root@Dasoncheng redis-4.0.1]# less README.md ##搜索关键词jemalloc,参考说明 安装:
[root@Dasoncheng redis-4.0.1]# make MALLOC=libc
[root@Dasoncheng redis-4.0.1]# echo $?
0
[root@Dasoncheng redis-4.0.1]# make install
修改配置文件/etc/redis.conf:
[root@Dasoncheng redis-4.0.1]# cp redis.conf /etc/
[root@Dasoncheng redis-4.0.1]# vim /etc/redis.conf
# bind 192.168.1.100 10.0.0.1 设置监听ip,多个用空格分开;
protected-mode yes 打开保护模式;
port 6379 监听的端口;
daemonize yes ##修改为yes,后台启动;no的话就是前台启动;(daemonize中文:守护进程;)
pidfile /var/run/redis_6379.pid 指定运行的pid文件;
loglevel notice 指定日志级别;
logfile "/var/log/redis.log" ##定义日志文件;(这里我们定义一下)
databases 16 redis的库数量默认总共16个;默认在0 库里面;
save 900 1
save 300 10
save 60 10000 这三个都是用来设置rdb的持久化的;
rdbcompression yes 是否压缩rdb文件;
dbfilename dump.rdb 定义rdb文件名;
dir /data/redis ##定义rdb文件存放的目录(包括aof文件也会放到这里);
slave-serve-stale-data yes 配置主从的参数;
appendonly yes ##开启aof的日志;
appendfilename "appendonly.aof" 定义文件名;
# appendfsync always
appendfsync everysec
# appendfsync no 这三个是什么时候记录日志;1、总是;2、每second秒一次;3、隔一段时间记录(是Linux系统默认定时同步内存到磁盘);
启动redis:
[root@Dasoncheng redis-4.0.1]# mkdir /data/redis
[root@Dasoncheng redis-4.0.1]# redis-server /etc/redis.conf
[root@Dasoncheng redis-4.0.1]# ps aux |grep redis
root 5395 0.8 0.1 141760 1972 ? Ssl 16:17 0:00 redis-server 127.0.0.1:6379
root 5400 0.0 0.0 112660 968 pts/1 S+ 16:17 0:00 grep --color=auto redis
[root@Dasoncheng redis-4.0.1]# tail /var/log/redis.log
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-'
5395:M 12 Oct 16:17:40.761 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
5395:M 12 Oct 16:17:40.761 # Server initialized
5395:M 12 Oct 16:17:40.762 # 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.
5395:M 12 Oct 16:17:40.765 # 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.
5395:M 12 Oct 16:17:40.766 * Ready to accept connections
##有两条内存报错问题;通过下面两条命令解决 不解决也没什么问题;
[root@Dasoncheng redis-4.0.1]# sysctl vm.overcommit_memory=1
vm.overcommit_memory = 1
[root@Dasoncheng redis-4.0.1]# echo never > /sys/kernel/mm/transparent_hugepage/enabled
[root@Dasoncheng redis-4.0.1]# vim /etc/rc.local ##将这两条命令添加到启动脚本里面;
sysctl vm.overcommit_memory=1
echo never > /sys/kernel/mm/transparent_hugepage/enabled
21.11 redis持久化
相关参数:
21.12 redis数据类型
类型1:string
string为最简单的类型,与Memcached一样的类型,一个key对应一个value,其支持的操作与Memcached的操作类似,它的功能更丰富。设置可以存二进制的对象。
示例:
redis-cli
127.0.0.1:6379> set mykey "aminglinux.com"
OK
127.0.0.1:6379> get mykey
"aminglinux.com"
127.0.0.1:6379> mset key1 1 key2 a key3 c
127.0.0.1:6379> mget key1 key2 key3
1) "1"
2) "a"
3) "c"
[root@Dasoncheng ~]# redis-cli
127.0.0.1:6379> set key1 "100"
OK
127.0.0.1:6379> get key1
"100"
127.0.0.1:6379> set key2 200
OK
127.0.0.1:6379> get key2
"200"
127.0.0.1:6379> MSET k1 1 k2 2 k3 3
OK
127.0.0.1:6379> mget k1 k2
1) "1"
2) "2"
127.0.0.1:6379> mget k1 k2 key1
1) "1"
2) "2"
3) "100"
类型2:list
127.0.0.1:6379> LPUSH l1 "aaa"
(integer) 1
127.0.0.1:6379> LPUSH l1 "bbb"
(integer) 2
127.0.0.1:6379> LPUSH l1 "aming"
(integer) 3
127.0.0.1:6379> LRANGE l1 0 -1
1) "aming"
2) "bbb"
3) "aaa"
127.0.0.1:6379> LPOP l1
"aming"
127.0.0.1:6379> LRANGE l1 0 -1
1) "bbb"
2) "aaa"
类型3:集合set
127.0.0.1:6379> SADD set1 a
(integer) 1
127.0.0.1:6379> SADD set1 b
(integer) 1
127.0.0.1:6379> SADD set1 c
(integer) 1
127.0.0.1:6379> SMEMBERS set1
1) "b"
2) "a"
3) "c"
127.0.0.1:6379> SADD set2 b
(integer) 1
127.0.0.1:6379> SADD set2 c
(integer) 1
127.0.0.1:6379> SADD set2 d
(integer) 1
127.0.0.1:6379> SADD set2 e
(integer) 1
127.0.0.1:6379> SREM set2 e ##删除e
(integer) 1
127.0.0.1:6379> SMEMBERS set2
1) "d"
2) "b"
3) "c"
127.0.0.1:6379> SADD set3 a b c e
(integer) 4
127.0.0.1:6379> SMEMBERS set3
1) "e"
2) "b"
3) "a"
4) "c"
127.0.0.1:6379> SINTER set1 set2
1) "b"
2) "c"
127.0.0.1:6379> SDIFF set1 set2
1) "a"
127.0.0.1:6379> SDIFF set2 set1
1) "d"
127.0.0.1:6379> SUNION set1 set2
1) "a"
2) "b"
3) "c"
4) "d"
类型4:有序集合sort set
127.0.0.1:6379> ZADD s1 100 abc
(integer) 1
127.0.0.1:6379> ZADD s1 80 "abc-123"
(integer) 1
127.0.0.1:6379> ZADD s1 90 "abc 222"
(integer) 1
127.0.0.1:6379> ZADD s1 10 "ab123"
(integer) 1
127.0.0.1:6379> ZRANGE s1 0 -1
1) "ab123"
2) "abc-123"
3) "abc 222"
4) "abc"
127.0.0.1:6379> ZREVRANGE s1 0 -1
1) "abc"
2) "abc 222"
3) "abc-123"
4) "ab123"
类型5:hash
127.0.0.1:6379> HSET hash1 name aming
(integer) 1
127.0.0.1:6379> HGET hash1 name
"aming"
127.0.0.1:6379> hset hash1 age 30
(integer) 1
127.0.0.1:6379> hget hash1 age
"30"
127.0.0.1:6379> hgetall hash1
1) "name"
2) "aming"
3) "age"
4) "30"
##奇行为key,偶行为value
21.13 redis常用操作(string)
1、string
set key1 aminglinux
get key1
set key1 aming//第二次赋值会覆盖
setnx key2 aaa //返回1 如果key2不存在直接创建key
setnx key2 bbb //返回0,如果key2存在,返回0
setex key3 10 1 //给key3设置过期时间为10s,值为1,若key已经存在,会覆盖新的值
mset k1 1 k2 a k3 c
mget k1 k3 k2
[root@Dasoncheng ~]# redis-cli
127.0.0.1:6379> get key1
"100"
127.0.0.1:6379> set key1 1001 ##第二次赋值同一可以,会覆盖
OK
127.0.0.1:6379> get key1
"1001"
127.0.0.1:6379> setnx key1 10001
##使用setnx会检测 是否存在同一key,存在则返回0(不做任何操作) 不存在则返回1 并创建该key
(integer) 0
127.0.0.1:6379> get key10
(nil)
127.0.0.1:6379> setnx key10 100
(integer) 1
127.0.0.1:6379> get key10
"100"
127.0.0.1:6379> set key11 aaa ex 10 ##创建并设定过期时间;
OK
127.0.0.1:6379> setex key11 100 bbb ##setex创建并设定过期时间,若key存在 则覆盖
OK
127.0.0.1:6379> get key11
"bbb"
2、list
lpush lista a //从左侧加入一个元素
lpush lista b
lrange lista 0 -1
lpop lista //从左侧取出第一个元素
rpush lista 1 //从右侧加入一个元素
rpop lista //从右侧取出第一个元素
linsert lista before 2 3 //在2的前面插入一个元素为3
lset lista 4 bbb //把第5个元素修改为bbb
lindex lista 0 //查看第1个元素
lindex lista 3 //查看第4个元素
llen 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> lrange lista 0 -1
1) "222"
2) "111"
127.0.0.1:6379> lpop lista ##向左删除一个元素
"222"
127.0.0.1:6379> lrange lista 0 -1
1) "111"
127.0.0.1:6379> lpush lista 333
(integer) 2
127.0.0.1:6379> lpush lista 444
(integer) 3
127.0.0.1:6379> lrange lista 0 -1
1) "444"
2) "333"
3) "111"
127.0.0.1:6379> rpop lista ##向右删除一个元素
"111"
rpush lista 1 //从右侧加入一个元素
127.0.0.1:6379> linsert lista after 333 aaa ##在333之前 添加一个元素aaa
(integer) 3
127.0.0.1:6379> lrange lista 0 -1
1) "444"
2) "333"
3) "aaa"
127.0.0.1:6379> lset lista 2 bbb ##将第三个元素aaa 修改为bbb
OK
127.0.0.1:6379> lrange lista 0 -1
1) "444"
2) "333"
3) "bbb"
127.0.0.1:6379> lindex lista 0 ##查看第一个元素
"444"
127.0.0.1:6379> lindex lista 2
"bbb"
127.0.0.1:6379> llen lista ##显示所有元素数量;
(integer) 3
3、set
sadd seta aaa //向集合seta中放入元素
smembers seta //查看集合中的所有元素
srem seta aaa //删除元素
spop seta //随机取出一个元素,删除
sdiff seta setb //求差集,以seta为标准
sdiffstore setc seta setb //求差集并且存储,存储到了setc里
sinter seta setb //求交集
sinterstore setd seta setb //将交集存储setd
sunion seta setb //求并集
sunionstore sete seta setb //求并集并存储到sete
sismember seta aaa //判断一个元素是否属于一个集合
srandmember seta //随机取出一个元素,但不删除
127.0.0.1:6379> sadd seta aaa
(integer) 1
127.0.0.1:6379> sadd seta bbb ccc ddd
(integer) 3
127.0.0.1:6379> smembers seta ##查看集合里面的所有元素;
1) "ddd"
2) "aaa"
3) "ccc"
4) "bbb"
127.0.0.1:6379> srem seta aaa ##删除元素aaa
(integer) 1
127.0.0.1:6379> smembers seta
1) "ddd"
2) "ccc"
3) "bbb"
127.0.0.1:6379> spop seta ##随机取出一个元素并删除;接数字 代表取出n个
"ddd"
127.0.0.1:6379> sadd seta aaa
(integer) 1
127.0.0.1:6379> sadd setb bbb ccc ddd
(integer) 3
127.0.0.1:6379> smembers seta
1) "aaa"
2) "ccc"
3) "bbb"
127.0.0.1:6379> smembers setb
1) "ddd"
2) "ccc"
3) "bbb"
127.0.0.1:6379> sdiff seta setb ##以setb为参考对象,求seta的差集;
1) "aaa"
127.0.0.1:6379> sdiffstore setc seta setb ##将seta的差集 保存到集合setc;
(integer) 1
127.0.0.1:6379> smembers setc
1) "aaa"
127.0.0.1:6379> sinter seta setb ##求seta的交集;
1) "ccc"
2) "bbb"
127.0.0.1:6379> sinterstore setd seta setb
(integer) 2
127.0.0.1:6379> sunion seta setb ##求并集;
1) "bbb"
2) "ccc"
3) "ddd"
4) "aaa"
127.0.0.1:6379> sunionstore sete seta setb
(integer) 4
127.0.0.1:6379> sismember seta 1 ##判断1 是否属于seta集合;否则反馈0
(integer) 0
127.0.0.1:6379> sismember seta aaa ##判断aaa 是否属于seta集合;是则反馈1
(integer) 1
127.0.0.1:6379> srandmember seta ##随机取出一个元素,并不删除;
"ccc"
127.0.0.1:6379> srandmember seta 3 ##随机取出3个元素,不删除
1) "aaa"
2) "bbb"
3) "ccc"
4、zset
zadd zseta 11 123 //创建有序集合
zrange zseta 0 -1 //显示所有元素,按顺序显示
zrange zseta 0 -1 withscores //可以带上分值
zrem zseta 222 //删除指定元素
zrank zseta 222 //返回元素的索引值,索引值从0开始,按score正向排序
zrevrank zseta 222 //同上,不同的是,按score反序排序
zrevrange zseta 0 -1 反序显示所有元素,并带分值
zcard zseta //返回集合中所有元素的个数
zcount zseta 1 10 // 返回分值范围1-10的元素个数
zrangebyscore zseta 1 10 // 返回分值范围1-10的元素
zremrangebyrank zseta 0 2 //删除索引范围0-2的元素,按score正向排序
zremrangebyscore zseta 1 10 //删除分值范围1-10的元素
5、hash
hset user1 name aming //建立hash
hset user1 age 30
hset user1 job it
hgetall user1
hmset user2 name aming age 30 job it //批量建立键值对
hmget user2
hmget user2 name age job
hdel user2 job //删除指定filed
hkeys user2 //打印所有的key
hvals user2 //打印所有的values
hlen user2 //查看hash有几个filed
21.16 redis操作键值
keys * //取出所有key
keys my* //模糊匹配
exists name //有name键 返回1 ,否则返回0;
del key1 // 删除一个key //成功返回1 ,否则返回0;
EXPIRE key1 100 //设置key1 100s后过期
ttl key // 查看键 还有多长时间过期,单位是s,当 key 不存在时,返回 -2 。 当 key 存在但没有设置剩余生存时间时,返回 -1 。 否则,返回 key 的剩余生存时间。
select 0 //代表选择当前数据库,默认进入0 数据库
move age 1 // 把age 移动到1 数据库
persist key1 //取消key1的过期时间
randomkey //随机返回一个key
rename oldname newname //重命名key
type key1 //返回键的类型
21.17 redis安全设置
设置监听ip
bind 127.0.0.1 2.2.2.2//可以是多个ip,用空格分隔
设置监听端口
port 16000
设置密码
requirepass aming>com
redis-cli -a 'aming>com'
将config命令改名
rename-command CONFIG aming
禁掉config命令
rename-command CONFIG “”
21.18 redis慢查询日志
##redis慢查询日志默认是开启的:
[root@Dasoncheng ~]# vim /etc/redis.conf
# The following time is expressed in microseconds, so 1000000 is equivalent
# to one second. Note that a negative number disables the slow log, while
# a value of zero forces the logging of every command.
slowlog-log-slower-than 10000
# There is no limit to this length. Just be aware that it will consume memory.
# You can reclaim memory used by the slow log with SLOWLOG RESET.
slowlog-max-len 128
这里我们将执行时常修改为10微秒,看看效果:
# The following time is expressed in microseconds, so 1000000 is equivalent
# to one second. Note that a negative number disables the slow log, while
# a value of zero forces the logging of every command.
slowlog-log-slower-than 10 ##正常实验环境下,查询都会超过10微秒
# There is no limit to this length. Just be aware that it will consume memory.
# You can reclaim memory used by the slow log with SLOWLOG RESET.
slowlog-max-len 128
#保存退出
[root@Dasoncheng ~]# killall redis-server
[root@Dasoncheng ~]# redis-server /etc/redis.conf
[root@Dasoncheng ~]# redis-cli
127.0.0.1:6379> slowlog get ##这里显示0为1条慢查询日志
1) 1) (integer) 0
2) (integer) 1507942013
3) (integer) 899
4) 1) "COMMAND"
5) "127.0.0.1:40790"
6) ""
127.0.0.1:6379> keys *
1) "k3"
2) "key2"
3) "setc"
4) "hash1"
5) "s1"
6) "lista"
7) "set1"
8) "l1"
9) "setd"
10) "set2"
11) "list"
12) "key10"
13) "setb"
14) "key1"
15) "k2"
16) "sete"
17) "k1"
18) "seta"
19) "set3"
127.0.0.1:6379> get k3
"3"
127.0.0.1:6379> get key2
"200"
127.0.0.1:6379> slowlog get
1) 1) (integer) 3
2) (integer) 1507942047
3) (integer) 58
4) 1) "get"
2) "key2"
5) "127.0.0.1:40790"
6) ""
2) 1) (integer) 2
2) (integer) 1507942031
3) (integer) 29
4) 1) "keys"
2) "*"
5) "127.0.0.1:40790"
6) ""
3) 1) (integer) 1
2) (integer) 1507942021
3) (integer) 22
4) 1) "slowlog"
2) "get"
5) "127.0.0.1:40790"
6) ""
4) 1) (integer) 0
2) (integer) 1507942013
3) (integer) 899
4) 1) "COMMAND"
5) "127.0.0.1:40790"
6) ""
127.0.0.1:6379> slowlog get 2 ##只获取最近两条慢查询日志;
1) 1) (integer) 4
2) (integer) 1507942052
3) (integer) 41
4) 1) "slowlog"
2) "get"
5) "127.0.0.1:40790"
6) ""
2) 1) (integer) 3
2) (integer) 1507942047
3) (integer) 58
4) 1) "get"
2) "key2"
5) "127.0.0.1:40790"
6) ""
127.0.0.1:6379> slowlog len ##显示所有慢查询日志条数;
(integer) 6
21.19 php安装redis扩展模块
cd /usr/local/src
wget https://coding.net/u/aminglinux/p/yuanke_centos7/git/raw/master/21NOSQL/phpredis.zip
unzip phpredis.zip
cd phpredis-develop
/usr/local/php-fpm/bin/phpize
./configure --with-php-config=/usr/local/php-fpm/bin/php-config
make
make install
vim /usr/local/php.ini//增加extension=redis.so
/usr/local/php-fpm/bin/php -m|grep redis//看是否有redis模块
重启php-fpm服务
21.20 redis存储session
- vim /usr/local/php-fpm/etc/php.ini//更改或增加
session.save_handler = "redis"
session.save_path = "tcp://127.0.0.1:6379" - 或者apache虚拟主机配置文件中也可以这样配置:
php_value session.save_handler " redis"
php_value session.save_path " tcp://127.0.0.1:6379" - 或者php-fpm配置文件对应的pool中增加:
php_value[session.save_handler] = redis
php_value[session.save_path] = " tcp://127.0.0.1:6379 "
21.21 redis主从配置
[root@Dasoncheng ~]# vim /etc/redis2.conf
[root@Dasoncheng ~]# mkdir /data/redis2
[root@Dasoncheng ~]# redis-server /etc/redis2.conf
[root@Dasoncheng ~]# ps aux |grep redis
root 6411 0.2 0.2 142920 2284 ? Ssl 08:46 0:02 redis-server 127.0.0.1:6379
root 6498 0.1 0.2 142788 2136 ? Ssl 09:06 0:00 redis-server 127.0.0.1:6333
root 6505 0.0 0.0 112660 964 pts/2 S+ 09:06 0:00 grep --color=auto redis
[root@Dasoncheng ~]# redis-cli -h 127.0.0.1 -p 6333
127.0.0.1:6333> keys *
1) "set1"
2) "seta"
3) "key2"
4) "l1"
5) "key10"
6) "lista"
7) "s1"
8) "k1"
9) "k2"
10) "set3"
11) "key1"
12) "k3"
13) "setd"
14) "set2"
15) "sete"
16) "list"
17) "setc"
18) "setb"
19) "hash1"
21.22 redis集群介绍
21.23 redis集群搭建配置(上)
[root@Dasoncheng ~]# ll /etc/redis* ##主上面创建三个配置文件,并创建相应文件夹等
-rw-r--r-- 1 root root 57815 Oct 14 09:06 /etc/redis2.conf
-rw-r--r-- 1 root root 199 Oct 17 09:00 /etc/redis_7000.conf
-rw-r--r-- 1 root root 199 Oct 17 09:01 /etc/redis_7002.conf
-rw-r--r-- 1 root root 199 Oct 17 09:03 /etc/redis_7004.conf
-rw-r--r-- 1 root root 57790 Oct 14 08:46 /etc/redis.conf
[root@Dasoncheng ~]# cat /etc/redis_7000.conf
port 7000
bind 192.168.60.11
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
[root@Dasoncheng ~]# mkdir -p /data/redis_data/{7000,7002,7004}
[root@Dasoncheng ~]# redis-server /etc/redis_7000.conf
18732:C 17 Oct 09:20:54.363 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
18732:C 17 Oct 09:20:54.363 # Redis version=4.0.1, bits=64, commit=00000000, modified=0, pid=18732, just started
18732:C 17 Oct 09:20:54.364 # Configuration loaded
[root@Dasoncheng ~]# ps aux |grep redis
root 18733 0.2 0.2 142280 2524 ? Ssl 09:20 0:00 redis-server 192.168.60.11:7000 [cluster]
root 19915 0.0 0.0 112660 968 pts/0 S+ 09:21 0:00 grep --color=auto redis
[root@Dasoncheng ~]# redis-server /etc/redis_7002.conf
23362:C 17 Oct 09:21:28.212 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
23362:C 17 Oct 09:21:28.212 # Redis version=4.0.1, bits=64, commit=00000000, modified=0, pid=23362, just started
23362:C 17 Oct 09:21:28.212 # Configuration loaded
[root@Dasoncheng ~]# redis-server /etc/redis_7004.conf
23367:C 17 Oct 09:21:31.738 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
23367:C 17 Oct 09:21:31.739 # Redis version=4.0.1, bits=64, commit=00000000, modified=0, pid=23367, just started
23367:C 17 Oct 09:21:31.739 # Configuration loaded
[root@Dasoncheng ~]# echo $?
0
[root@Dasoncheng ~]# ps aux |grep redis
root 18733 0.1 0.2 142280 2524 ? Ssl 09:20 0:00 redis-server 192.168.60.11:7000 [cluster]
root 23363 0.2 0.2 142280 2524 ? Ssl 09:21 0:00 redis-server 192.168.60.11:7002 [cluster]
root 23368 0.1 0.2 142280 2528 ? Ssl 09:21 0:00 redis-server 192.168.60.11:7004 [cluster]
root 23385 0.0 0.0 112660 968 pts/0 S+ 09:29 0:00 grep --color=auto redis
21.24 redis集群搭建配置(下)
安装ruby2.2 (只需要一台机器上运行)
yum -y groupinstall "Development Tools"
yum -y install gdbm-devel libdb4-devel libffi-devel libyaml libyaml-devel ncurses-devel openssl-devel readline-devel tcl-deve
cd /root/
mkdir -p rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}
wget http://cache.ruby-lang.org/pub/ruby/2.2/ruby-2.2.3.tar.gz -P rpmbuild/SOURCES
wget https://raw.githubusercontent.com/tjinjin/automate-ruby-rpm/master/ruby22x.spec -P rpmbuild/SPECS
rpmbuild -bb rpmbuild/SPECS/ruby22x.spec
yum -y localinstall rpmbuild/RPMS/x86_64/ruby-2.2.3-1.el7.centos.x86_64.rpm
gem install redis
cp /usr/local/src/redis-4.0.1/src/redis-trib.rb /usr/bin/
redis-trib.rb create --replicas 1 192.168.133.130:7000 192.168.133.130:7002 192.168.133.130:7004 192.168.133.132:7001 192.168.133.132:7003 192.168.133.132:7005
安装高版本ruby:
yum里面的版本太低,我们这里下载源码包,将其制作成rpm包安装文件!
[root@Dasoncheng ~]# yum -y groupinstall "Development Tools"
##安装拓展工具;
[root@Dasoncheng ~]# yum -y install gdbm-devel libdb4-devel libffi-devel libyaml libyaml-devel ncurses-devel openssl-devel readline-devel tcl-deve
[root@Dasoncheng ~]# cd /root/
[root@Dasoncheng ~]# mkdir -p rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}
[root@Dasoncheng ~]# wget http://cache.ruby-lang.org/pub/ruby/2.2/ruby-2.2.3.tar.gz -P rpmbuild/SOURCES
[root@Dasoncheng ~]# wget https://raw.githubusercontent.com/tjinjin/automate-ruby-rpm/master/ruby22x.spec -P rpmbuild/SPECS
[root@Dasoncheng ~]# rpmbuild -bb rpmbuild/SPECS/ruby22x.spec
[root@Dasoncheng ~]# yum -y localinstall rpmbuild/RPMS/x86_64/ruby-2.2.3-1.el7.centos.x86_64.rpm
[root@Dasoncheng ~]# gem install redis
##安装redis的工具trib;
[root@Dasoncheng ~]# cp /usr/local/src/redis-4.0.1/src/redis-trib.rb /usr/bin/
##拷贝到PATH里面,方便命令直接执行;
[root@Dasoncheng ~]# redis-trib.rb create --replicas 1 192.168.60.11:7000 192.168.60.11:7002 192.168.60.11:7004 192.168.60.12:7001 192.168.60.12:7003 192.168.60.12:7005
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.60.11:7000
192.168.60.12:7001
192.168.60.11:7002
Adding replica 192.168.60.12:7003 to 192.168.60.11:7000
Adding replica 192.168.60.11:7004 to 192.168.60.12:7001
Adding replica 192.168.60.12:7005 to 192.168.60.11:7002
M: 1f39268503aeaf02e2a1d4b81a3d572f71fd389f 192.168.60.11:7000
slots:0-5460 (5461 slots) master
M: 420058045cf5ecfb779f01978606fc25f9271c43 192.168.60.11:7002
slots:10923-16383 (5461 slots) master
S: 166c1180d683b847b69ed4517158aa0845dc6478 192.168.60.11:7004
replicates 7e398f3003d9a2d1bbef32d01cc9d3c62760830d
M: 7e398f3003d9a2d1bbef32d01cc9d3c62760830d 192.168.60.12:7001
slots:5461-10922 (5462 slots) master
S: 3933f911a2f8a8c7da25481189b7b234c24dee5b 192.168.60.12:7003
replicates 1f39268503aeaf02e2a1d4b81a3d572f71fd389f
S: 9f44617279ac675df4df29e54f3fd6f7555fa6bc 192.168.60.12:7005
replicates 420058045cf5ecfb779f01978606fc25f9271c43
Can I set the above configuration? (type 'yes' to accept): 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.60.11:7000)
M: 1f39268503aeaf02e2a1d4b81a3d572f71fd389f 192.168.60.11:7000
slots:0-5460 (5461 slots) master
1 additional replica(s)
M: 420058045cf5ecfb779f01978606fc25f9271c43 192.168.60.11:7002
slots:10923-16383 (5461 slots) master
1 additional replica(s)
S: 3933f911a2f8a8c7da25481189b7b234c24dee5b 192.168.60.12:7003
slots: (0 slots) slave
replicates 1f39268503aeaf02e2a1d4b81a3d572f71fd389f
S: 166c1180d683b847b69ed4517158aa0845dc6478 192.168.60.11:7004
slots: (0 slots) slave
replicates 7e398f3003d9a2d1bbef32d01cc9d3c62760830d
S: 9f44617279ac675df4df29e54f3fd6f7555fa6bc 192.168.60.12:7005
slots: (0 slots) slave
replicates 420058045cf5ecfb779f01978606fc25f9271c43
M: 7e398f3003d9a2d1bbef32d01cc9d3c62760830d 192.168.60.12:7001
slots:5461-10922 (5462 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.
##这里我要说一下:
##生产环境一般不会一台机器多个端口,因为这样没有了集群的意义(一台机器宕机 端口都不能用);
##我们可以看到,主从已经分配了(其实是按端口顺序来的,如果需要指定60.11所有redis都为主的话,我们可以修改端口达到目的)
21.25 redis集群操作
redis-cli -c -h 192.168.133.130 -p 7000//-c说明以集群的方式登录
任意一个节点都可以创建key,或者查看key(演示)
redis-trib.rb check 192.168.133.130:7000//检测集群状态
cluster nodes//列出节点
cluster info//查看集群信息
cluster meet ip port //添加节点
cluster forget node_id //移除某个节点
cluster replicate node_id//将当前节点设置为指定节点的从
cluster saveconfig//保存配置文件
[root@Dasoncheng ~]# redis-cli -c -h 192.168.60.12 -p 7001
##-c是以集群的方式登录,如果没有-c则以单独redis登录;不会有集群效果
192.168.60.12:7001> set key1 123
OK
192.168.60.12:7001> set key2 123 ##操作被定向到60.11的7000端口
-> Redirected to slot [4998] located at 192.168.60.11:7000
OK
192.168.60.11:7000> set key3 123
OK
192.168.60.11:7000> set key4 123
-> Redirected to slot [13120] located at 192.168.60.11:7002
OK
192.168.60.11:7002> get key2 ##查询也是从60.11的7000里面查询;
-> Redirected to slot [4998] located at 192.168.60.11:7000
"123"
192.168.60.11:7000> get key4
-> Redirected to slot [13120] located at 192.168.60.11:7002
"123"
192.168.60.11:7002> quit
[root@Dasoncheng ~]# redis-trib.rb check 192.168.60.11:7000
##检测集群状态;
>>> Performing Cluster Check (using node 192.168.60.11:7000)
M: 1f39268503aeaf02e2a1d4b81a3d572f71fd389f 192.168.60.11:7000
slots:0-5460 (5461 slots) master
1 additional replica(s)
M: 420058045cf5ecfb779f01978606fc25f9271c43 192.168.60.11:7002
slots:10923-16383 (5461 slots) master
1 additional replica(s)
S: 3933f911a2f8a8c7da25481189b7b234c24dee5b 192.168.60.12:7003
slots: (0 slots) slave
replicates 1f39268503aeaf02e2a1d4b81a3d572f71fd389f
S: 166c1180d683b847b69ed4517158aa0845dc6478 192.168.60.11:7004
slots: (0 slots) slave
replicates 7e398f3003d9a2d1bbef32d01cc9d3c62760830d
S: 9f44617279ac675df4df29e54f3fd6f7555fa6bc 192.168.60.12:7005
slots: (0 slots) slave
replicates 420058045cf5ecfb779f01978606fc25f9271c43
M: 7e398f3003d9a2d1bbef32d01cc9d3c62760830d 192.168.60.12:7001
slots:5461-10922 (5462 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@Dasoncheng ~]# redis-cli -c -h 192.168.60.12 -p 7001
##列出节点;
192.168.60.12:7001> cluster nodes
1f39268503aeaf02e2a1d4b81a3d572f71fd389f 192.168.60.11:7000@17000 master - 0 1508208564000 1 connected 0-5460
7e398f3003d9a2d1bbef32d01cc9d3c62760830d 192.168.60.12:7001@17001 myself,master - 0 1508208561000 4 connected 5461-10922
##这一行说明了myself;即本机登录
9f44617279ac675df4df29e54f3fd6f7555fa6bc 192.168.60.12:7005@17005 slave 420058045cf5ecfb779f01978606fc25f9271c43 0 1508208563000 6 connected
420058045cf5ecfb779f01978606fc25f9271c43 192.168.60.11:7002@17002 master - 0 1508208565002 2 connected 10923-16383
3933f911a2f8a8c7da25481189b7b234c24dee5b 192.168.60.12:7003@17003 slave 1f39268503aeaf02e2a1d4b81a3d572f71fd389f 0 1508208562978 5 connected
166c1180d683b847b69ed4517158aa0845dc6478 192.168.60.11:7004@17004 slave 7e398f3003d9a2d1bbef32d01cc9d3c62760830d 0 1508208563996 4 connected
192.168.60.12:7001> 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:4
cluster_stats_messages_ping_sent:1284
cluster_stats_messages_pong_sent:1293
cluster_stats_messages_meet_sent:5
cluster_stats_messages_sent:2582
cluster_stats_messages_ping_received:1293
cluster_stats_messages_pong_received:1289
cluster_stats_messages_received:2582
192.168.60.12:7001> cluster meet 192.168.60.12 7007
##添加节点;下面我们cluster nodes可以看到该节点为主(若再添加一个新节点,也是master那么多和弄slave从呢?)下面有法子设置slave从;
##cluster replicate node_id//将当前节点设置为指定节点的从(登录一个想要成为master的节点,执行命令cluster replicate node_id--节点的node信息 即可)
OK
192.168.60.12:7001> cluster nodes
1f39268503aeaf02e2a1d4b81a3d572f71fd389f 192.168.60.11:7000@17000 master - 0 1508208878187 1 connected 0-5460
daa308972c148b6dc819ee5ba1a17654bdc1c788 192.168.60.12:7007@17007 master - 0 1508208879197 0 connected
7e398f3003d9a2d1bbef32d01cc9d3c62760830d 192.168.60.12:7001@17001 myself,master - 0 1508208875000 4 connected 5461-10922
9f44617279ac675df4df29e54f3fd6f7555fa6bc 192.168.60.12:7005@17005 slave 420058045cf5ecfb779f01978606fc25f9271c43 0 1508208877000 6 connected
420058045cf5ecfb779f01978606fc25f9271c43 192.168.60.11:7002@17002 master - 0 1508208876164 2 connected 10923-16383
3933f911a2f8a8c7da25481189b7b234c24dee5b 192.168.60.12:7003@17003 slave 1f39268503aeaf02e2a1d4b81a3d572f71fd389f 0 1508208877000 5 connected
166c1180d683b847b69ed4517158aa0845dc6478 192.168.60.11:7004@17004 slave 7e398f3003d9a2d1bbef32d01cc9d3c62760830d 0 1508208880210 4 connected
192.168.60.12:7001> cluster forget daa308972c148b6dc819ee5ba1a17654bdc1c788
OK
##cluster forget node_id移除某个节点
##如果移除不了,看看是否为主/主下有没有从,将主设为从即可移除
##无法移除正在登录的节点,先退出 再删除;
192.168.60.12:7001> cluster nodes
1f39268503aeaf02e2a1d4b81a3d572f71fd389f 192.168.60.11:7000@17000 master - 0 1508209442000 1 connected 0-5460
7e398f3003d9a2d1bbef32d01cc9d3c62760830d 192.168.60.12:7001@17001 myself,master - 0 1508209443000 4 connected 5461-10922
9f44617279ac675df4df29e54f3fd6f7555fa6bc 192.168.60.12:7005@17005 slave 420058045cf5ecfb779f01978606fc25f9271c43 0 1508209444209 6 connected
420058045cf5ecfb779f01978606fc25f9271c43 192.168.60.11:7002@17002 master - 0 1508209443000 2 connected 10923-16383
3933f911a2f8a8c7da25481189b7b234c24dee5b 192.168.60.12:7003@17003 slave 1f39268503aeaf02e2a1d4b81a3d572f71fd389f 0 1508209444607 5 connected
166c1180d683b847b69ed4517158aa0845dc6478 192.168.60.11:7004@17004 slave 7e398f3003d9a2d1bbef32d01cc9d3c62760830d 0 1508209443600 4 connected
[root@Dasoncheng ~]# redis-cli -c -h 192.168.60.12 -p 7001
192.168.60.12:7001> cluster saveconfig
OK
##保存配置文件;具体保存在如下文件中!
[root@localhost ~]# ls /data/redis_data/7001/
appendonly.aof dump.rdb nodes_7001.conf
[root@localhost ~]# cat /data/redis_data/7001/nodes_7001.conf
1f39268503aeaf02e2a1d4b81a3d572f71fd389f 192.168.60.11:7000@17000 master - 0 1508209726000 1 connected 0-5460
daa308972c148b6dc819ee5ba1a17654bdc1c788 192.168.60.12:7007@17007 master - 0 1508209726023 0 connected
7e398f3003d9a2d1bbef32d01cc9d3c62760830d 192.168.60.12:7001@17001 myself,master - 0 1508209724000 4 connected 5461-10922
9f44617279ac675df4df29e54f3fd6f7555fa6bc 192.168.60.12:7005@17005 slave 420058045cf5ecfb779f01978606fc25f9271c43 0 1508209723000 6 connected
420058045cf5ecfb779f01978606fc25f9271c43 192.168.60.11:7002@17002 master - 0 1508209725000 2 connected 10923-16383
3933f911a2f8a8c7da25481189b7b234c24dee5b 192.168.60.12:7003@17003 slave 1f39268503aeaf02e2a1d4b81a3d572f71fd389f 0 1508209724998 5 connected
166c1180d683b847b69ed4517158aa0845dc6478 192.168.60.11:7004@17004 slave 7e398f3003d9a2d1bbef32d01cc9d3c62760830d 0 1508209727028 4 connected
vars currentEpoch 6 lastVoteEpoch 0