目录 一、redis数据类型 5. sorted sets类型和操作 二、Redis常用命令 1、键值相关命令 2、服务器相关命令 三、 redis高级应用 1、 给redis服务器设置密码 2、持久化 3、主从备份
AI 代码解读
一、redis数据类型
5. sorted sets类型和操作
sorted set是set的一个升级版本,它给集合中每个元素都定义一个分数,集合中的元素按照其分数排序。
1) zadd 键 分数1 值1 [分数2 值2…]
该命令添加指定的成员到key对应的有序集合中,每个成员都有一个分数。你可以指定多个分数/成员组合。如果一个指定的成员已经在对应的有序集合中了,那 么其分数就会被更新成最新的,并且该成员会重新调整到正确的位置,以确保集合有序。分数的值必须是一个表示数字的字符串,并且可以是double类型的浮 点数。
2) zrange 集合 起始下标 截止下标 [withscores]127.0.0.1:6379>zadd zset1 1 lm 2 sc 3 glf (integer) 3 127.0.0.1:6379>zadd zset1 1 ymj (integer) 1
AI 代码解读
返回有序集合中,指定区间内的成员。其中成员按照score(分数)值从小到大排序。具有相同score值的成员按照字典顺序来排列。
起始下标与截止下标和list类型一致: 0代表队列中第一个元素,1代表第二个元素,依次类推 -1代表队列中最后一个元素,-2代表倒数第二个元素 withscores:返回集合中元素的同时,返回其分数(score)
AI 代码解读
3) zrevrange 集合 起始下标 截止下标 [withscores]127.0.0.1:6379>zrange zset1 0 -1 withscores 1) "lm" 2) "1" 3) "ymj" 4) "1" 5) "sc" 6) "2" 7) "glf" 8) "3"
AI 代码解读
返回有序集合中,指定区间的成员。其成员按照score从大到小来排列。
127.0.0.1:6379>zrevrange zset1 0 -1 withscores 1) "glf" //下标为0 2) "3" 3) "sc" //下标为1 4) "2" 5) "ymj" //下标为2 6) "1" 7) "lm" //下标为3 8) "1" 127.0.0.1:6379>zrevrange zset1 1 2 withscores //查看集合中下标是1-2的值 1) "sc" 2) "2" 3) "ymj" 4) "1"
AI 代码解读
4) zrangebyscore 集合 起始分数 截止分数 withscores(不包含截止分数)
返回有序集合中score(分数)在指定区间的值
127.0.0.1:6379>zadd zset2 1 one 2 two 3 three 4 four (integer) 4 127.0.0.1:6379>zrange zset2 0 -1 withscores //按照下标区间返回值 1) "one" 2) "1" 3) "two" 4) "2" 5) "three" 6) "3" 7) "four" 8) "4" 127.0.0.1:6379>zrangebyscore zset2 2 3 withscores //按照分数区间返回值 1) "two" 2) "2" 3) "three" 4) "3"
AI 代码解读
5) zrem 集合 值1 [值2…]
删除有序集合中指定的值
127.0.0.1:6379>zrem zset1 lm (integer) 1 127.0.0.1:6379>zrange zset1 0 -1 withscores 1) "ymj" 2) "1" 3) "sc" 4) "2" 5) "glf" 6) "3"
AI 代码解读
6) zincrby 集合 增量 值
给有序集合中指定值的成员的分数(score)值加上增量(increment)。如果集合中没有这个值,则给添加一个分数是increment的值。
127.0.0.1:6379>zincrby zset1 2 ymj //如果值存在,则在其分数上加增量 "3" 127.0.0.1:6379>zrange zset1 0 -1 withscores 1) "sc" 2) "2" 3) "glf" 4) "3" 5) "ymj" 6) "3" 127.0.0.1:6379>zincrby zset1 4 bro //如果值不存在,则加入值。并指定分数为增"4" 量 127.0.0.1:6379>zrange zset1 0 -1 withscores 1) "sc" 2) "2" 3) "glf" 4) "3" 5) "ymj" 6) "3" 7) "bro" 8) "4"
AI 代码解读
7) zrank 集合 值
返回有序集合中指定值的下标。
127.0.0.1:6379>zrank zset1 sc (integer) 0 127.0.0.1:6379>zrank zset1 ymj (integer) 2
AI 代码解读
8) zrevrank 集合 值
返回有序集合中指定值的下标
9) zcount 集合 起始分数 截止分数127.0.0.1:6379>zrange zset1 0 -1 withscores 1) "sc" 2) "2" 3) "glf" 4) "3" 5) "ymj" 6) "3" 7) "bro" 8) "4" 127.0.0.1:6379>zrevrank zset1 ymj (integer) 1 127.0.0.1:6379>zrevrank zset1 sc (integer) 3
AI 代码解读
返回有序集合中,score值在起始分数与截止分数之间的个数
127.0.0.1:6379>zrange zset2 0 -1 withscores 1) "one" 2) "1" 3) "two" 4) "2" 5) "three" 6) "3" 7) "four" 8) "4" 127.0.0.1:6379>zcount zset2 2 4 (integer) 3
AI 代码解读
10) zcard 集合
返回有序集合元素的个数
127.0.0.1:6379>zcard zset2 (integer) 4
AI 代码解读
11) zremrangebyrank 集合 起始下标 结束下标
删除有序集合中,下标在指定区间的元素
127.0.0.1:6379>zrange zset2 0 -1 withscores 1) "one" 2) "1" 3) "two" 4) "2" 5) "three" 6) "3" 7) "four" 8) "4" 127.0.0.1:6379> ZREMRANGEBYRANK zset2 0 1 (integer) 2 127.0.0.1:6379>zrange zset2 0 -1 withscores 1) "three" 2) "3" 3) "four" 4) "4"
AI 代码解读
12) zremrangebyscore 集合 起始分数 截止分数
删除有序集合中,分数在指定区间的元素
127.0.0.1:6379>zrange zset1 0 -1 withscores 1) "sc" 2) "2" 3) "glf" 4) "3" 5) "ymj" 6) "3" 7) "bro" 8) "4" 127.0.0.1:6379> ZREMRANGEBYSCORE zset1 2 3 (integer) 3 127.0.0.1:6379>zrange zset1 0 -1 withscores 1) "bro" 2) "4"
AI 代码解读
13)zinterstore 新集合 取交集的集合个数 集合1 集合2
取集合1和集合2的交集,并把结果保存到新集合中。在计算交集之前,需要指定计算交集的集合的个数。交集中,值的分数是多个集合中分数的和。
127.0.0.1:6379>zadd zset1 1 one 2 two 3 three 4 four (integer) 4 127.0.0.1:6379>zaddzset2 2 two 3 three 4 four 5 five (integer) 4 127.0.0.1:6379> ZINTERSTORE zset3 2 zset1 zset2 //有两个集合计算交集,所以集合个数是2 (integer) 3 127.0.0.1:6379> ZRANGE zset3 0 -1 withscores 1) "two" 2) "4" //分数是两个集合中two值的分数和 3) "three" 4) "6" 5) "four" 6) "8"
AI 代码解读
14) zunionstore 新集合 取并集的集合个数 集合1 集合2
取集合1和集合2的并集,并把结果保存到新集合中。在计算并集之前,需要指定计算并集的集合的个数。并集中,值的分数是多个集合中分数的和。
127.0.0.1:6379>zadd zset1 1 one 2 two 3 three 4 four (integer) 4 127.0.0.1:6379>zaddzset2 2 two 3 three 4 four 5 five (integer) 4 127.0.0.1:6379> ZUNIONSTORE zset4 2 zset1 zset2 (integer) 5 127.0.0.1:6379> ZRANGE zset4 0 -1 withscores 1) "one" 2) "1" 3) "two" 4) "4" 5) "five" 6) "5" 7) "three" 8) "6" 9) "four" 10) "8"
AI 代码解读
二、Redis常用命令
(一) 键值相关命令
1、 keys 键名
按照键名查找指定的键。支持通配符
127.0.0.1:6379> set hello 1 OK 127.0.0.1:6379> set hallo 1 OK 127.0.0.1:6379> set heeeello 1 OK 127.0.0.1:6379> keys h?llo 1) "hallo" 2) "hello" 127.0.0.1:6379> keys h*llo 1) "hallo" 2) "heeeello" 3) "hello"
AI 代码解读
2、 exists 键名
确认一个键是否存在
127.0.0.1:6379> EXISTS name (integer) 1 //name键存在 127.0.0.1:6379> EXISTS age (integer) 0 //age键不存在
AI 代码解读
3、 del 键名
删除一个键
4、 expire 键 秒127.0.0.1:6379>del hello (integer) 1 127.0.0.1:6379> EXISTS hello (integer) 0
AI 代码解读
设置一个键的过期时间,如果键已经过期,将会被自动删除
127.0.0.1:6379> set age 18 OK 127.0.0.1:6379> EXPIRE age 20 (integer) 1 127.0.0.1:6379>ttl age (integer) 18 127.0.0.1:6379>ttl age (integer) -2 127.0.0.1:6379> EXISTS age (integer) 0
AI 代码解读
5、 ttl 键
以秒为单位,返回键的剩余生存时间。
当键不存在时,返回值为-2
当键存在,但没有设置剩余生存时间时,返回-1
6、 select 数据库号127.0.0.1:6379>ttl name (integer) -1
AI 代码解读
选择一个数据库。
默认连接的数据库是0,可以支持共16个数据库。
在配置文件中,通过databases 16 关键字定义
127.0.0.1:6379> select 1 OK 127.0.0.1:6379[1]>
AI 代码解读
7、 move 键 数据库号
将当前数据库的键移动到指定的数据空中
127.0.0.1:6379> set age 18 OK 127.0.0.1:6379> move age 1 (integer) 1 127.0.0.1:6379> get age (nil) 127.0.0.1:6379> select 1 OK 127.0.0.1:6379[1]> get age "18"
AI 代码解读
8、 randomkey
从当前数据库返回一个随机的键。如果当前库没有任何键,则返回nil
9、 rename 旧名 新名
重命名键
127.0.0.1:6379> rename name name_new OK 127.0.0.1:6379> get name_new "sc"
AI 代码解读
10、 type 键
返回键类型。
返回值
none (key不存在)
string (字符串)
list (列表)
set (集合)
zset (有序集)
hash (哈希表)
(二) 服务器相关命令
1、 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被停止,连接拒绝
AI 代码解读
2、 echo 字符串
在命令行输出字符串
127.0.0.1:6379> echo "test message" "test message"
AI 代码解读
3、 quit
退出redis数据库
4、 save
保存所有的数据。很少在生产环境直接使用SAVE 命令,因为它会阻塞所有的客户端的请求,可以使用BGSAVE
命令代替. 如果在BGSAVE
命令的保存数据的子进程发生错误的时,用SAVE
命令保存最新的数据是最后的手段
5、 dbsize
返回当前库中键的数量
127.0.0.1:6379>dbsize (integer) 6
AI 代码解读
6、 info
获取服务器的详细信息
7、 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"
AI 代码解读
8、 flushdb
删除当前数据库中所有的数据
127.0.0.1:6379>dbsize (integer) 6 127.0.0.1:6379>flushdb OK 127.0.0.1:6379>dbsize (integer) 0
AI 代码解读
9、 flushall
删除所有数据库中所有的数据
三、 redis高级应用
1、 给redis服务器设置密码
1)修改redis服务器的配置文件
[root@localhostredis]# vi /usr/local/redis/etc/redis.conf # requirepass foobared (大概391行) #找到这句话,requirepass后面就是登录redis的密码,改为自定义密码 requirepass flzx_3QC
AI 代码解读
2)重启redis
3)连接redis[root@localhostredis]# pkill redis [root@localhostredis]#/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf
AI 代码解读
[root@localhostredis]# /usr/local/redis/bin/redis-cli 127.0.0.1:6379> keys * //可以正常连接redis (error) NOAUTH Authentication required. //但因为没有密码,提示操作拒绝 127.0.0.1:6379>auth flzx_3QC //利用auth命令输入密码 OK 127.0.0.1:6379> keys * //才可以正常使用 1) "name"
AI 代码解读
或
[root@localhostredis]# /usr/local/redis/bin/redis-cli -a flzx_3QC #在登录的同时指定密码 #注意历史命令中会明文保存此密码 127.0.0.1:6379> keys * 1) "name"
AI 代码解读
2、持久化
Redis 提供了不同级别的持久化方式:
1)RDB持久化方式能够在指定的时间间隔能对你的数据进行快照存储。是默认的持久化方式。这种方式是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb。这种持久化方式被称为快照 snapshotting(快照)。
save 900 1 #900秒内,最少有1个键被改动。则自动保存一次数据集 save 300 10 #300秒内,最少有10个键被改动。则自动保存一次数据集 save 60 10000 #60秒内,最少有10000个键被改动。则自动保存一次数据集
AI 代码解读
实验:验证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@localhostredis]# pkill -9 redis [root@localhostredis]# /usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf #在/usr/local/redis/库中重启redis [root@localhostredis]# ls [root@localhostredis]# /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@localhostredis]# ls bin dump.rdbetc #在redis目录中也生成dump.rdb文件
AI 代码解读
结论:
2) 使用AOF 会让你的Redis更加耐久: 你可以使用不同的持久化策略:无备份,每秒备份,每次写的时候备份。使用默认的每秒备份策略,Redis的性能依然很好(备份是由后台线程进行处理的,主线程会尽力处理客户端请求),一旦出现故障,你最多丢失1秒的数据。[root@localhostredis]# vi /usr/local/redis/etc/redis.conf dir ./ #定义了dump.rdb数据库文件保存在当前位置。所以每次重启redis服务的所在位置不同,导致生成新的dump.rdb文件 #将数据库保存目录写为绝对路径(注意只能是目录) dir /usr/local/redis/
AI 代码解读
appendonly no #默认不使用AOF持久化(450行) appendonly yes #开启AOF持久化 # appendfsync always #有写操作,就马上写入磁盘。效率最慢,最安全 appendfsync everysec #默认,每秒钟写入磁盘一次。 # appendfsync no #不进行AOF备份,将数据交给操作系统处理。最快,最不安全
AI 代码解读
3、主从备份
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将此文件保存到硬盘上
1) 不同服务器配置主从
A)克隆一台linux作为从服务器 克隆机需要进行如下操作: ① vi /etc/sysconfig/network-scripts/ifcfg-eth0 删除MAC地址行 ② rm -rf /etc/udev/rules.d/70-persistent-net.rules 删除网卡和MAC地址绑定文件 ③ 注意关闭防火墙和SELinux ④ 重启动系统 B)在从服务器上配置
AI 代码解读
[root@localhost ~]# vi /usr/local/redis/etc/redis.conf # slaveof<masterip><masterport> #把此句开启,并指定主服务器ip和端口 (196行) masterauth flzx_3QC #设定主服���器密码
AI 代码解读
C)重启从服务器上redis
AI 代码解读
2) 同一台服务器实现主从配置
这里我们以本机配置 1台Master + 1台Slave 为例子,其中:
Master IP:127.0.0.1 PORT:6379 Slave1 IP:127.0.0.1 PORT:63791
AI 代码解读
A) 复制出从服务器目录
AI 代码解读
[root@localhost ~]# cp -r /usr/local/redis/ /usr/local/redis-slave1
AI 代码解读
B) 修改redis-slave1配置文件
AI 代码解读
[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 #指定主服务器密码
AI 代码解读
C) 启动服务
AI 代码解读
/usr/local/redis-slave1/bin/redis-server /usr/local/redis-slave1/etc/redis.conf #启动从服务器,并调用从服务器配置文件 [root@localhost ~]# netstat -tlun tcp0 0 :::6379 :::* LISTEN tcp 0 0 :::63791 :::* LISTEN #验证两个端口是否都启动
AI 代码解读
D)验证
AI 代码解读
[root@localhost ~]# /usr/local/redis/bin/redis-cli -a flzx_3QC #启动主服务器,并建立一个键 127.0.0.1:6379> set bb 234 OK 127.0.0.1:6379> keys * 1) "sex" 2) "aa" 3) "name" 4) "age" 5) "bb" [root@localhost ~]# /usr/local/redis-slave1/bin/redis-cli -a flzx_3QC -p 63791 #启动从服务器,发现键已经同步 127.0.0.1:63791> keys * 1) "aa" 2) "sex" 3) "age" 4) "name" 5) "bb"
AI 代码解读