Redis常用命令与高级应用
附:
127.0.0.1:6379> set xiaofei 小飞
OK
127.0.0.1:6379> get xiaofei
"\xe5\xb0\x8f\xe9\xa3\x9e"
127.0.0.1:6379> quit
[root@localhost redis-2.8.6]# redisc --raw
127.0.0.1:6379> get xiaofei
小飞
127.0.0.1:6379>
5. sorted sets类型和操作
sorted set是set的一个升级版本,它给集合中每个元素都定义一个分数,集合中的元素按照其分数排序。也不允许有重复值
1) zadd 键 分数1 值1 [分数2 值2…]
该命令添加指定的成员到key对应的有序集合中,每个成员都有一个分数。你可以指定多个分数/成员组合。如果一个指定的成员已经在对应的有序集合中了,那么其分数就会被更新成最新的,并且该成员会重新调整到正确的位置,以确保集合有序。分数的值必须是一个表示数字的字符串,并且可以是double类型的浮点数。
127.0.0.1:6379> ZADD testcom 101 1234 100 1235 99 1236 100 1237 101 1238
(integer) 5
127.0.0.1:6379> -----分数可以重复---id不可以重复
2) zrange 集合 起始下标 截止下标 [withscores]
返回有序集合中,指定区间内的成员。其中成员按照score(分数)值从小到大排序。具有相同score值的成员按照字典顺序来排列。
起始下标与截止下标和list类型一致:
0代表队列中第一个元素,1代表第二个元素,依次类推
-1代表队列中最后一个元素,-2代表倒数第二个元素
withscores:返回集合中元素的同时,返回其分数(score)
127.0.0.1:6379> ZADD testcom 101 1234 100 1235 99 1236 100 1237 101 1238
(integer) 5
127.0.0.1:6379> zrange testcom 0 -1
1) "1236"
2) "1235"
3) "1237"
4) "1234"
5) "1238"
127.0.0.1:6379> zrange testcom 0 -1 withscores
1) "1236"
2) "99"
3) "1235"
4) "100"
5) "1237"
6) "100"
7) "1234"
8) "101"
9) "1238"
10) "101"
127.0.0.1:6379>
3) zrevrange 集合 起始下标 截止下标 [withscores]
返回有序集合中,指定区间的成员。其成员按照score从大到小来排列。
127.0.0.1:6379> zrevrange testcom 0 -1 withscores
1) "1238"
2) "101"-------------------------下标为0
3) "1234"
4) "101"-------------------------下标为1
5) "1237"
6) "100"-------------------------下标为2
7) "1235"
8) "100"
9) "1236"
10) "99"
127.0.0.1:6379>
127.0.0.1:6379> zrevrange testcom 1 2 withscores ---返回1和2的下标id
1) "1234"
2) "101"-------------------------下标为1
3) "1237"
4) "100"-------------------------下标为2
4) zrangebyscore 集合 起始分数 截止分数 withscores
返回有序集合中score(分数)在指定区间的值
127.0.0.1:6379> zrangebyscore testcom 100 101 withscores
1) "1235"
2) "100"
3) "1237"
4) "100"
5) "1234"
6) "101"
7) "1238"
8) "101"
127.0.0.1:6379>
5) zrem 集合 值1 [值2…]
删除有序集合中指定的值
127.0.0.1:6379> zrem testcom 1238
(integer) 1
127.0.0.1:6379> zrange testcom 0 -1 withscores
1) "1236"
2) "99"
3) "1235"
4) "100"
5) "1237"
6) "100"
7) "1234"
8) "101"
127.0.0.1:6379>
6) zincrby 集合 增量 值
给有序集合中指定值的成员的分数(score)值加上增量(increment)。如果集合中没有这个值,则给添加一个分数是increment的值。
127.0.0.1:6379> zincrby testcom 100 1236
"199"
127.0.0.1:6379> zrange testcom 0 -1 withscores
1) "1235"
2) "100"
3) "1237"
4) "100"
5) "1234"
6) "101"
7) "1236"
8) "199"
127.0.0.1:6379>
127.0.0.1:6379> zincrby testcom 100 66666 值不存在,则加入值。并指定分数为增"4"量
"100"
127.0.0.1:6379> zrange testcom 0 -1 withscores
1) "1235"
2) "100"
3) "1237"
4) "100"
5) "66666"
6) "100"
7) "1234"
8) "101"
9) "1236"
10) "199"
127.0.0.1:6379>
7) zrank 集合 值 返回有序集合中指定值的下标。值按照score从小到大排序
127.0.0.1:6379> zrank testcom 66666
(integer) 2
127.0.0.1:6379> zrange testcom 0 -1
1) "1235"
2) "1237"
3) "66666"
4) "1234"
5) "1236"
127.0.0.1:6379>
8) zrevrank 集合 值 返回有序集合中指定值的下标,值按照score从大到小排序
127.0.0.1:6379> zrange testcom 0 -1
1) "1235"
2) "1237"
3) "66666"
4) "1234"
5) "1236"
127.0.0.1:6379> zrevrank testcom 1236
(integer) 0
127.0.0.1:6379> zrevrank testcom 1235
(integer) 4
127.0.0.1:6379>
9) zcount 集合 起始分数 截止分数返回有序集合中,score值在起始分数与截止分数之间的个数
127.0.0.1:6379> zrange testcom 0 -1 withscores
1) "1235"
2) "100"
3) "1237"
4) "100"
5) "66666"
6) "100"
7) "1234"
8) "101"
9) "1236"
10) "199"
127.0.0.1:6379> ZCOUNT testcom 0 100
(integer) 3
127.0.0.1:6379>
10) zcard 集合 返回有序集合元素的个数
127.0.0.1:6379> zcard testcom
(integer) 5
127.0.0.1:6379>
11) zremrangebyrank 集合 起始下标 结束下标 删除有序集合中,下标在指定区间的元素
127.0.0.1:6379> ZREMRANGEBYRANK testcom 0 3
(integer) 4
127.0.0.1:6379> zrange testcom 0 -1 withscores
1) "1236"
2) "199"
127.0.0.1:6379>
12) zremrangebyscore 集合 起始分数 截止分数 删除有序集合中,分数在指定区间的元素
127.0.0.1:6379> zrange testpc 0 -1 withscores
1) "aa"
2) "11"
3) "bb"
4) "22"
5) "cc"
6) "33"
7) "dd"
8) "44"
9) "ee"
10) "55"
11) "ff"
12) "66"
127.0.0.1:6379> ZREMRANGEBYSCORE testpc 0 23
(integer) 2
127.0.0.1:6379> zrange testpc 0 -1 withscores
1) "cc"
2) "33"
3) "dd"
4) "44"
5) "ee"
6) "55"
7) "ff"
8) "66"
127.0.0.1:6379>
13)zinterstore 新集合 取交集的集合个数 集合1 集合2
取集合1和集合2的交集,并把结果保存到新集合中。在计算交集之前,需要指定计算交集的集合的个数。交集中,值的分数是多个集合中分数的和。
127.0.0.1:6379> zadd atest1 1 a 2 b 3 c 4 d
(integer) 4
127.0.0.1:6379> zadd atest2 2 b 3 c 4 d 5 e
(integer) 4
127.0.0.1:6379> ZINTERSTORE atest3 2 atest1 atest2
(integer) 3
127.0.0.1:6379> zrange atest3 0 -1 withscores
1) "b"
2) "4"
3) "c"
4) "6"
5) "d"
6) "8"
127.0.0.1:6379>
14) zunionstore 新集合 取并集的集合个数 集合1 集合2
取集合1和集合2的并集,并把结果保存到新集合中。在计算并集之前,需要指定计算并集的集合的个数。并集中,值的分数是多个集合中分数的和。
127.0.0.1:6379> ZUNIONSTORE atest4 2 atest1 atest2
(integer) 5
127.0.0.1:6379> zrange atest4 0 -1 withscores
1) "a"
2) "1"
3) "b"
4) "4"
5) "e"
6) "5"
7) "c"
8) "6"
9) "d"
10) "8"
127.0.0.1:6379>
6. Redis常用命令
1) 键值相关命令
A) keys 键名 按照键名查找指定的键。支持通配符
127.0.0.1:6379> keys j*--------------通配符
1) "jihe2"
2) "jihe1"
3) "jihe"
127.0.0.1:6379>
B)exists 键名 确认一个键是否存在
127.0.0.1:6379> EXISTS list
(integer) 1
127.0.0.1:6379> EXISTS list1111
(integer) 0
127.0.0.1:6379>
C)del 键名 删除一个键
D)expire 键 秒 设置一个键的过期时间,如果键已经过期,将会被自动删除
127.0.0.1:6379> set aaa test
OK
127.0.0.1:6379> get aaa
"test"
127.0.0.1:6379> EXPIRE aaa 10
(integer) 1
127.0.0.1:6379> ttl aaa
(integer) 4--------------------以秒为单位,返回键的剩余生存时间
127.0.0.1:6379> ttl aaa
(integer) 2
127.0.0.1:6379> ttl aaa
(integer) 0
127.0.0.1:6379> ttl aaa
(integer) ---------------------当键不存在时,返回值为-2
127.0.0.1:6379> ttl aaa
(integer) -2
127.0.0.1:6379> get aaa
(nil)
127.0.0.1:6379>
E)127.0.0.1:6379> ttl name
(integer) -1--------------当键存在,但没有设置剩余生存时间时,返回-1
127.0.0.1:6379>
127.0.0.1:6379> ttl name
(integer) -1
F) select 数据库号 选择一个数据库。
默认连接的数据库是0,可以支持共16个数据库。 在配置文件中,databases 16 关键字定义
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]>
G) move 键 数据库号 将当前数据库的键移动到指定的数据空中
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> set select1 machong
OK
127.0.0.1:6379[1]> keys *
1) "select1"
127.0.0.1:6379[1]> move select1 2
(integer) 1
127.0.0.1:6379[1]> keys *
(empty list or set)
127.0.0.1:6379[1]> select 2
OK
127.0.0.1:6379[2]> keys *
1) "select1"
127.0.0.1:6379[2]>
H)randomkey 从当前数据库返回一个随机的键。如果当前库没有任何键,则返回nil
127.0.0.1:6379> RANDOMKEY
"atest2"
127.0.0.1:6379> RANDOMKEY
"str"
127.0.0.1:6379> RANDOMKEY
"atest4"
127.0.0.1:6379>
I)rename 旧名 新名 重命名键
127.0.0.1:6379> set aaaaaa 188
OK
127.0.0.1:6379> rename aaaaaa bbbbbb
OK
127.0.0.1:6379> keys bbb*
1) "bbbbbb"
127.0.0.1:6379> keys aaa*
(empty list or set)
127.0.0.1:6379>
J)type 键 返回键类型。
127.0.0.1:6379> type bbbbbb
string
127.0.0.1:6379>
返回值:none (key不存在):string (字符串):list (列表):set (集合):zset (有序集):hash (哈希表)
2) 服务器相关命令
A)ping 测试服务器是否可以连接
127.0.0.1:6379> ping
PONG //连接正常
127.0.0.1:6379> ping
Could not connect to Redis at 127.0.0.1:6379: Connection refused
//redis被停止,连接拒绝
[root@localhost ~]# ping 192.168.3.3
PING 192.168.3.3 (192.168.3.3) 56(84) bytes of data.
64 bytes from 192.168.3.3: icmp_seq=1 ttl=128 time=0.262 ms
64 bytes from 192.168.3.3: icmp_seq=2 ttl=128 time=0.188 ms
64 bytes from 192.168.3.3: icmp_seq=3 ttl=128 time=0.206 ms
64 bytes from 192.168.3.3: icmp_seq=4 ttl=128 time=0.186 ms
^C
--- 192.168.3.3 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3665ms
B)echo 字符串 在命令行输出字符串
[root@localhost ~]# echo aaaaaaaaaa
aaaaaaaaaa
[root@localhost ~]#
C)quit 退出redis数据库
[root@localhost ~]# redisc
127.0.0.1:6379>
127.0.0.1:6379>
127.0.0.1:6379> quit
[root@localhost ~]#
D)save
保存所有的数据。很少在生产环境直接使用SAVE 命令,因为它会阻塞所有的客户端的请求,可以使用BGSAVE 命令代替. 如果在BGSAVE命令的保存数据的子进程发生错误的时,用 SAVE命令保存最新的数据是最后的手段
E) dbsize 返回当前库中键的数量
127.0.0.1:6379> dbsize
(integer) 28
127.0.0.1:6379>
F)info 获取服务器的详细信息
127.0.0.1:6379> info
# Memory
used_memory:634744
G)config get 参数 获取redis服务器配置文件中的参数。支持通配符
127.0.0.1:6379> config get * //查询配置文件中所有的参数
1) "dbfilename"
2) "dump.rdb"
45) "port"
46) "6379"
99) "save"
100) "900 1 300 10 60 10000"
H) flushdb 删除当前数据库中所有的数据
127.0.0.1:6379[2]> keys *
1) "select1"
127.0.0.1:6379[2]> flushdb
OK
127.0.0.1:6379[2]> keys *
(empty list or set)
127.0.0.1:6379[2]>
I)flushall 删除所有数据库中所有的数据
7. redis高级应用
1) 给redis服务器设置密码
A)修改redis服务器的配置文件
[root@localhost ~]# vi /usr/local/redis/etc/redis.conf
#
# requirepass foobared
#
requirepass 123456
B)重启redis
[root@localhost ~]# pkill redis
[root@localhost ~]# netstat -lunt
...........
[root@localhost ~]# /usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf
[root@localhost ~]# netstat -lunt
tcp 0 0 :::6379 :::* LISTEN
C)连接redis
[root@localhost ~]# /usr/local/redis/bin/redis-cli
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)
127.0.0.1:6379>
注意 redis会自动向硬盘中备份数据 只有在数据备份的位置重启redis才能够显示出内存数据库中保存的数据
[root@localhost bin]# ls /usr/local/redis/bin
dump.rdb redis-benchmark redis-check-aof redis-check-dump redis-cli redis-server
[root@localhost bin]# redisc
127.0.0.1:6379> auth 123456
OK
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> quit
[root@localhost bin]# pkill redis
[root@localhost bin]# /usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf
[root@localhost bin]# /usr/local/redis/bin/redis-cli
127.0.0.1:6379> auth 123456
OK
127.0.0.1:6379> keys *
1) "jihe1"
2) "list3"
3) "testcom"
4) "list4"
.......................
24) "user1"
25) "age"
26) "atest1"
27) "xiaofei"
28) "list"
127.0.0.1:6379>
----------------------------------------------
[root@localhost bin]# vi /usr/local/redis/etc/redis.conf
# The filename where to dump the DB
dbfilename dump.rdb
# The working directory.
#
# The DB will be written inside this directory, with the filename specified
# above using the 'dbfilename' configuration directive.
#
# The Append Only File will also be created inside this directory.
#
# Note that you must specify a directory here, not a file name.
dir ./ ------数据备份的位置是相对于redis重启的位置下
#dir ./
dir /usr/local/redis/bin-------------此处用的话一定要改为绝对路径
或
[root@localhost redis]# /usr/local/redis/bin/redis-cli -a flzx_3QC
#在登录的同时指定密码
#注意历史命令中会明文保存此密码
127.0.0.1:6379> keys *
1) "name"
2)持久化
A)Redis 提供了不同级别的持久化方式:----------一般不用此种方式保存备份文件
RDB持久化方式能够在指定的时间间隔能对你的数据进行快照存储。是默认的持久化方式。这种方式是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb。这种持久化方式被称为快照 snapshotting(快照)。
save 900 1
#900秒内,最少有1个键被改动。则自动保存一次数据集
save 300 10
#300秒内,最少有10个键被改动。则自动保存一次数据集
save 60 10000
#60秒内,最少有10000个键被改动。则自动保存一次数据集
实验:验证dump.rdb数据保存文件
[root@localhost ~]# ls
anaconda-ks.cfg dump.rdb install.log install.log.syslog
#root目录下有dump.rdb文件
[root@localhost ~]# /usr/local/redis/bin/redis-server \
/usr/local/redis/etc/redis.conf
#在root目录中启动redis
[root@localhost ~]# /usr/local/redis/bin/redis-cli
127.0.0.1:6379> auth 123
OK
127.0.0.1:6379> keys *
1) "name2"
2) "name"
3) "name1"
#0库中有键
[root@localhost ~]# cd /usr/local/redis/
[root@localhost redis]# pkill -9 redis
[root@localhost redis]# /usr/local/redis/bin/redis-server \
/usr/local/redis/etc/redis.conf
#在/usr/local/redis/库中重启redis,
[root@localhost redis]# ls
[root@localhost redis]# /usr/local/redis/bin/redis-cli
127.0.0.1:6379> keys *
(empty list or set)
#0库中没有键
127.0.0.1:6379> save
OK
#保存
127.0.0.1:6379> quit
[root@localhost redis]# ls
bin dump.rdb etc
#在redis目录中也生成dump.rdb文件
结论:
[root@localhost redis]# vi /usr/local/redis/etc/redis.conf
dir ./
#定义了dump.rdb数据库文件保存在当前位置。所以每次重启redis服务的所在位置不同,导致生成新的dump.rdb文件
dir /usr/local/redis/
#将数据库保存目录写为绝对路径(注意只能是目录)
B)使用AOF 会让你的Redis更加耐久:
你可以使用不同的持久化策略:无备份,每秒备份,每次写的时候备份。使用默认的每秒备份策略,Redis的性能依然很好(备份是由后台线程进行处理的,主线程会尽力处理客户端请求),一旦出现故障,你最多丢失1秒的数据。
appendonly no 改为yes
#默认不使用AOF持久化(450行)
#开启AOF持久化
# appendfsync always #有写操作,就马上写入磁盘。效率最慢,到那时最按
appendfsync everysec #默认,每秒钟写入磁盘一次。
# appendfsync no #不进行AOF备份,将数据交给操作系统处理。最快,最不 安全
appendonly yes---------只要AOF方式已开启 快照方式保存马上失效
# The name of the append only file (default: "appendonly.aof")
appendfilename "appendonly.aof"------AOF方式默认保存在此文件中/bin下
不存在RDB的备份文件路径问题
3)主从备份--------------------心跳监控--keep alive
Redis主从复制特点:
a.Master可以拥有多个slave
b.多个slave可以连接同一个master外,还可以连接到其它slave
c.主从复制不会阻塞master,在同步数据时,master可以继续处理client请求
d.提高系统的伸缩性
Redis主从复制过程:
a.Slave与master建立连接,发送sync同步命令
b.Master会启动一个后台进程,将数据库快照保存到文件中,同时master主进程会开始收集新的写命令并缓存。
c.后台完成保存后,就将此文件发送给slave
d.Slave将此文件保存到硬盘上
A) 不同服务器配置主从
a)克隆一台linux作为从服务器 UUID
克隆机需要进行如下操作:
① vi /etc/sysconfig/network-scripts/ifcfg-eth0
删除MAC地址行
② rm -rf /etc/udev/rules.d/70-persistent-net.rules
删除网卡和MAC地址绑定文件
③ 注意关闭防火墙和SELinux
④ 重启动系统
b)在从服务器上配置
[root@localhost ~]# vi /usr/local/redis/etc/redis.conf
# slaveof <masterip> <masterport>
#把此句开启,并指定主服务器ip和端口 (196行)
masterauth flzx_3QC
#设定主服务器密码
c)重启从服务器上redis
B) 同一台服务器实现主从配置
这里我们以本机配置 1台Master + 1台Slave 为例子,其中:
Master IP:127.0.0.1 PORT:6379
Slave1 IP:127.0.0.1 PORT:63791
Iptables -F
Iptables -L
a) 复制出从服务器目录
[root@localhost www]# cp -r /usr/local/redis/ /usr/local/redis-slave1
[root@localhost www]#
b) 修改redis-slave1配置文件
[root@localhost ~]# vi /usr/local/redis-slave1/etc/redis.conf
pidfile /usr/local/redis-slave1/redis.pid
#指定pid文件
port 63791
#指定端口号
dir /usr/local/redis-slave1/
#指定服务器目录
slaveof 127.0.0.1 6379
#指定主服务器IP和端口
masterauth flzx_3QC
#指定主服务器密码
c) 启动服务
[root@localhost www]# /usr/local/redis-slave1/bin/redis-server /usr/local/redis-slave1/etc/redis.conf
#启动从服务器,并调用从服务器配置文件
[root@localhost ~]# netstat -tlun
tcp 0 0 :::6379 :::* LISTEN
tcp 0 0 :::63791 :::* LISTEN
#验证两个端口是否都启动
d)验证
[root@localhost www]# /usr/local/redis/bin/redis-cli -a 123456
127.0.0.1:6379> set zhucong test
OK
127.0.0.1:6379> get zhucong
"test"
127.0.0.1:6379> quit
[root@localhost www]# /usr/local/redis-slave1/bin/redis-cli -a 123456 -p 63791
127.0.0.1:63791> keys *
1) "zhucong"
2) "zhucongtest"
127.0.0.1:63791> get zhucong
"test"
127.0.0.1:63791> quit
[root@localhost www]#