第2讲 Redis常用命令与高级应用

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介:

目录

一、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类型的浮 点数。

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 代码解读
2) zrange 集合 起始下标 截止下标 [withscores]
返回有序集合中,指定区间内的成员。其中成员按照score(分数)值从小到大排序。具有相同score值的成员按照字典顺序来排列。
起始下标与截止下标和list类型一致:
    0代表队列中第一个元素,1代表第二个元素,依次类推
    -1代表队列中最后一个元素,-2代表倒数第二个元素

withscores:返回集合中元素的同时,返回其分数(score)
AI 代码解读

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 代码解读
3) zrevrange 集合 起始下标 截止下标 [withscores]
返回有序集合中,指定区间的成员。其成员按照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 集合 值
返回有序集合中指定值的下标
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 代码解读
9) zcount 集合 起始分数 截止分数
返回有序集合中,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 键名
删除一个键
127.0.0.1:6379>del hello
(integer) 1
127.0.0.1:6379> EXISTS hello
(integer) 0
AI 代码解读
4、 expire 键 秒
设置一个键的过期时间,如果键已经过期,将会被自动删除
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
127.0.0.1:6379>ttl name
(integer) -1
AI 代码解读
6、 select 数据库号
选择一个数据库。
默认连接的数据库是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

[root@localhostredis]# pkill redis
[root@localhostredis]#/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf
AI 代码解读
3)连接redis
[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 代码解读

结论:
[root@localhostredis]# vi /usr/local/redis/etc/redis.conf
dir ./
#定义了dump.rdb数据库文件保存在当前位置。所以每次重启redis服务的所在位置不同,导致生成新的dump.rdb文件

#将数据库保存目录写为绝对路径(注意只能是目录)
dir /usr/local/redis/
AI 代码解读
2) 使用AOF 会让你的Redis更加耐久: 你可以使用不同的持久化策略:无备份,每秒备份,每次写的时候备份。使用默认的每秒备份策略,Redis的性能依然很好(备份是由后台线程进行处理的,主线程会尽力处理客户端请求),一旦出现故障,你最多丢失1秒的数据。
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 代码解读

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
打赏
0
0
0
0
33
分享
相关文章
Redis应用—2.在列表数据里的应用
本文介绍了基于数据库和缓存双写的分享贴功能设计,包括:基于数据库 + 缓存双写的分享贴功能、查询分享贴列表缓存时的延迟构建、分页列表惰性缓存方案、用户分享贴列表数据按页缓存实现精准过期控制、用户分享贴列表的分页缓存异步更新、数据库与缓存的分页数据一致性方案、热门用户分享贴列表的分页缓存失效时消除并发线程串行等待锁的影响。总结:该设计通过合理的缓存策略和异步处理机制,有效提升了系统性能,降低了内存占用,并确保了数据的一致性和高可用性。
Redis应用—2.在列表数据里的应用
Redis游戏积分排行榜项目中通义灵码的应用实战
Redis游戏积分排行榜项目中通义灵码的应用实战
118 4
Redis是如何建立连接和处理命令的
本文主要讲述 Redis 是如何监听客户端发出的set、get等命令的。
1121 150
java连接redis和基础操作命令
通过以上内容,您可以掌握在Java中连接Redis以及进行基础操作的基本方法,进而在实际项目中灵活应用。
106 30
Redis应用—1.在用户数据里的应用
本文主要介绍了社区电商的业务闭环及Redis缓存架构中遇到的典型生产问题及其解决方案。通过介绍的设计和优化,社区电商平台能够在高并发读取和少量写入的情况下,保持高性能和数据一致性。
Redis应用—1.在用户数据里的应用
|
27天前
|
Redis哈希结构在提升数据检索速度中的实践应用
本文详细介绍了 Redis 哈希结构的特点、常见使用场景以及如何在实际应用中利用哈希结构提升数据检索速度。通过合理使用 Redis 哈希结构,可以显著提高系统的性能和响应速度。在实际开发中,结合具体业务需求,灵活运用 Redis 提供的多种数据结构,构建高效的缓存和数据存储解决方案。希望本文能帮助您更好地理解和应用 Redis 哈希结构,提升数据检索速度。
49 18
Redis应用—3.在购物车里的应用
本文详细介绍了社区电商购物车的设计与实现,涵盖多个关键方面:读多写多场景分析、复杂缓存与异步落库、异步落库问题处理、阈值检查与重复加入逻辑、多线程并发问题解决、查询更新功能、选中提交功能。
Vue.js应用结合Redis数据库:实践与优化
将Vue.js应用与Redis结合,可以实现高效的数据管理和快速响应的用户体验。通过合理的实践步骤和优化策略,可以充分发挥两者的优势,提高应用的性能和可靠性。希望本文能为您在实际开发中提供有价值的参考。
63 11
Redis深度解析:解锁高性能缓存的终极武器,让你的应用飞起来
【8月更文挑战第29天】本文从基本概念入手,通过实战示例、原理解析和高级使用技巧,全面讲解Redis这一高性能键值对数据库。Redis基于内存存储,支持多种数据结构,如字符串、列表和哈希表等,常用于数据库、缓存及消息队列。文中详细介绍了如何在Spring Boot项目中集成Redis,并展示了其工作原理、缓存实现方法及高级特性,如事务、发布/订阅、Lua脚本和集群等,帮助读者从入门到精通Redis,大幅提升应用性能与可扩展性。
130 0
【Azure Redis】部署在AKS中的应用,连接Redis高频率出现timeout问题
查看Redis状态,没有任何异常,服务没有更新,Service Load, CPU, Memory, Connect等指标均正常。在排除Redis端问题后,转向了AKS中。 开始调查AKS的网络状态。最终发现每次Redis客户端出现超时问题时,几乎都对应了AKS NAT Gateway的更新事件,而Redis服务端没有任何异常。因此,超时问题很可能是由于NAT Gateway更新事件导致TCP连接被重置。
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等