Redis常用命令与高级应用

Posted 马冲的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis常用命令与高级应用相关的知识,希望对你有一定的参考价值。

附:

127.0.0.1:6379> set xiaofei 小飞

OK

127.0.0.1:6379> get xiaofei

"xe5xb0x8fxe9xa3x9e"

127.0.0.1:6379> quit

[[email protected] 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被停止,连接拒绝

[[email protected] ~]# 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  字符串 在命令行输出字符串

[[email protected] ~]# echo aaaaaaaaaa

aaaaaaaaaa

[[email protected] ~]#

 

C)quit 退出redis数据库

[[email protected] ~]# redisc

127.0.0.1:6379>

127.0.0.1:6379>

127.0.0.1:6379> quit

[[email protected] ~]#

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服务器的配置文件

[[email protected] ~]# vi /usr/local/redis/etc/redis.conf

#

# requirepass foobared

#

requirepass 123456

 

B)重启redis

[[email protected] ~]# pkill redis

[[email protected] ~]# netstat -lunt

...........

[[email protected] ~]# /usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf

[[email protected] ~]# netstat -lunt

tcp        0      0 :::6379                     :::*                        LISTEN

C)连接redis

[[email protected] ~]# /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才能够显示出内存数据库中保存的数据

[[email protected] bin]# ls  /usr/local/redis/bin

dump.rdb  redis-benchmark  redis-check-aof  redis-check-dump  redis-cli  redis-server

[[email protected] 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

[[email protected] bin]# pkill redis

[[email protected] bin]# /usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf

[[email protected] 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> 

----------------------------------------------

[[email protected] 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-------------此处用的话一定要改为绝对路径

[[email protected] 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数据保存文件

[[email protected] ~]# ls

anaconda-ks.cfg  dump.rdb  install.log  install.log.syslog

#root目录下有dump.rdb文件

[[email protected] ~]# /usr/local/redis/bin/redis-server  

/usr/local/redis/etc/redis.conf

#在root目录中启动redis

[[email protected] ~]# /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库中有键

 

[[email protected] ~]# cd /usr/local/redis/

[[email protected] redis]# pkill -9 redis

[[email protected] redis]# /usr/local/redis/bin/redis-server  

/usr/local/redis/etc/redis.conf

#在/usr/local/redis/库中重启redis,

[[email protected] redis]# ls

[[email protected] 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

[[email protected] redis]# ls

bin  dump.rdb  etc

#在redis目录中也生成dump.rdb文件

 

结论:

[[email protected] 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)在从服务器上配置

[[email protected] ~]# 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) 复制出从服务器目录

[[email protected] www]# cp -r /usr/local/redis/ /usr/local/redis-slave1

[[email protected] www]#

b) 修改redis-slave1配置文件

[[email protected] ~]# 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) 启动服务

[[email protected] www]# /usr/local/redis-slave1/bin/redis-server  /usr/local/redis-slave1/etc/redis.conf

#启动从服务器,并调用从服务器配置文件

[[email protected] ~]# netstat -tlun

tcp     0      0 :::6379                     :::*                        LISTEN      

tcp     0      0 :::63791                    :::*                        LISTEN

#验证两个端口是否都启动

 

d)验证

[[email protected] 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

[[email protected] 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

[[email protected] www]#

 

以上是关于Redis常用命令与高级应用的主要内容,如果未能解决你的问题,请参考以下文章

分布式缓存技术redis学习系列——redis高级应用(主从事务与锁持久化)

Redis学习与总结

Redis:Redis基础知识 01

redis高级应用(集群搭建集群分区原理集群操作)

Redis基础高级特性与性能调优

一文搞定Redis高级特性与性能调优