Redis 基本命令和使用

HYF Lv3

Redis(REmote DIctionary Server)是一个开源的内存数据存储系统,常用作数据库、缓存和消息中间件。它具有高性能、灵活性和可扩展性,被广泛应用于各种应用程序和系统中。

1 Redis 和 MySQL 的区别

相较于关系型数据库 (SQL) MySQL,Redis 是非关系型数据库 (NoSQL) 它们在数据存储、数据模型、性能和适用场景等方面有一些异同点。

Redis 是一个基于键值存储的内存数据库,它将数据存储在内存中,以实现快速的读写操作。Redis 支持多种数据结构,包括字符串、哈希、列表、集合和有序集合,每个数据结构都有对应的操作和功能。Redis 适用于需要高性能和低延迟的应用场景,例如缓存、会话存储、实时应用程序和消息队列等。此外,Redis 还支持发布订阅模式,允许消息的发布者将消息广播给多个订阅者。而 MySQL 是一个关系型数据库管理系统,它使用表格来组织和存储数据。MySQL 支持 SQL 查询语言,并提供丰富的功能,如事务处理、索引、复制和高可用性等。MySQL 适用于需要结构化数据存储和复杂查询的应用场景,例如企业应用、电子商务和大规模数据处理。

另一个重要的区别是数据模型。Redis 是一个键值存储系统,其中每个键都与一个值相关联,值可以是字符串、哈希、列表、集合或有序集合。这种灵活的数据模型使得 Redis 能够处理多种数据类型和复杂的数据结构。而 MySQL 是一个关系型数据库,数据以表格的形式组织,每个表格包含多个列和行,每行代表一个记录,每列代表一个字段。

2 Redis 常用服务端管理命令

2.1 PING

检测连接是否存活

1
2
47.120.5.13:6379> ping
PONG

2.2 ECHO

在命令行打印一些内容

1
2
47.120.5.13:6379> echo test
"test"

2.3 EXIT/QUIT

退出客户端

1
2
3
4
5
6
7
8
9
C:\Users\A>redis-cli -h 47.120.5.13
47.120.5.13:6379> quit

C:\Users\A>

C:\Users\A>redis-cli -h 47.120.5.13
47.120.5.13:6379> exit

C:\Users\A>

2.4 INFO

查看服务器信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
47.120.5.13:6379> info
# Server
redis_version:7.0.11
redis_git_sha1:00000000
redis_git_dirty:0
......

# Clients
......

# Memory
......

# Persistence
......

# Stats
......

# Replication
......

# CPU
......

# Modules
......

# Errorstats
......

# Cluster
......

# Keyspace
db0:keys=3,expires=0,avg_ttl=0
47.120.5.13:6379>

2.5 DBSIZE

统计当前库下key的数量

1
2
47.120.5.13:6379> dbsize
(integer) 3

2.6 SELECT

Redis 默认使用16个库,从0到15。可以试用select db 进行切换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
47.120.5.13:6379>  set test1 test1
OK
47.120.5.13:6379> set test2 test2
OK
47.120.5.13:6379> set test3 test3
OK
47.120.5.13:6379> select 1
OK
47.120.5.13:6379[1]> keys *
(empty list or set)
47.120.5.13:6379[1]> select 0
OK
47.120.5.13:6379> keys *
1) "test3"
2) "test2"
3) "test1"
47.120.5.13:6379>

2.7 FLUSHDB

清空当前数据库中的键值对

1
2
47.120.5.13:6379> flushdb
OK

2.8 FLUSHALL

清空所有数据库的键值对

1
2
47.120.5.13:6379> flushall
OK

2.9 SHUTDOWN

退出服务器端

1
2
47.120.5.13:6379> shutdown
not connected>

2.10 MOVE key n

不同数据库之间数据是不能互通的,move移动键到指定数据库

1
2
3
4
5
6
7
8
9
10
11
47.120.5.13:6379> set test1 test1
OK
47.120.5.13:6379> move test1 1
(integer) 1
47.120.5.13:6379> keys *
(empty list or set)
47.120.5.13:6379> select 1
OK
47.120.5.13:6379[1]> keys *
1) "test1"
47.120.5.13:6379[1]>

3 Redis 常用的 Key 相关命令

3.1 keys patternd

*表示通配符,表示匹配任意字符,会遍历所有键。

1
2
3
4
5
47.120.5.13:6379> keys *
1) "test3"
2) "test2"
3) "test1"
47.120.5.13:6379>

3.2 exists key [key…]

查询是否存在(一个或多个)key,返回存在的个数。

1
2
3
4
5
6
7
8
9
47.120.5.13:6379> exists test1
(integer) 1
47.120.5.13:6379> exists test1 test1
(integer) 2
47.120.5.13:6379> exists test1 test2 test3
(integer) 3
47.120.5.13:6379> exists test1 test2 test4
(integer) 2
47.120.5.13:6379>

3.3 del key [key…]

删除(一个或多个)key,返回成功删除的个数

1
2
3
4
5
47.120.5.13:6379> del test2 test3
(integer) 2
47.120.5.13:6379> del test4
(integer) 0
47.120.5.13:6379>

3.4 type key

查询并返回 key 所储存的值的类型

1
2
3
47.120.5.13:6379> type test1
string
47.120.5.13:6379>

3.5 (p)expire key seconds

expire: 以秒为单位设置 key 的过期时间

pexpire:以毫秒为单位设置 key 的过期时间

1
2
3
4
5
6
7
# 分别给 test1 和 test2 设置2秒(2000毫秒)的过期时间

47.120.5.13:6379> expire test1 20
(integer) 1
47.120.5.13:6379> pexpire test2 20000
(integer) 1
47.120.5.13:6379>

3.6 (p)ttl key

ttl:以秒为单位返回 key 的剩余过期时间

pttl:以毫秒为单位返回 key 的剩余过期时间

(integer) -1 : 永不过期

1
2
3
4
5
6
7
8
9
10
11
12
13
47.120.5.13:6379> ttl test1
(integer) 17
47.120.5.13:6379> pttl test1
(integer) 15329
47.120.5.13:6379> ttl test2
(integer) 13
47.120.5.13:6379> pttl test2
(integer) 11427
47.120.5.13:6379> ttl test3
(integer) -1
47.120.5.13:6379> pttl test3
(integer) -1
47.120.5.13:6379>

3.7 persist key

设置 key 永不过期

(integer) -1 : 永不过期

1
2
3
4
5
6
7
8
9
10
11
12
13
# 设置 test3 有过期时间

47.120.5.13:6379> expire test3 20
(integer) 1
47.120.5.13:6379> ttl test3
(integer) 16
47.120.5.13:6379> persist test3
(integer) 1
47.120.5.13:6379> ttl test3
(integer) -1
47.120.5.13:6379> pttl test3
(integer) -1
47.120.5.13:6379>

3.8 rename key newKeyName

更改 key 名称

1
2
3
4
5
6
7
47.120.5.13:6379> keys *
1) "test3"
47.120.5.13:6379> rename test3 test
OK
47.120.5.13:6379> keys *
1) "test"
47.120.5.13:6379>

4 String(字符串)基本操作命令

string(字符串)是 Redis 中最基本的数据类型,单个数据能存储的最大空间是512M。

4.1 set key value [EX seconds] [PX milliseconds] [NX|XX]

nx:如果key不存在则建立,xx:如果key存在则修改其值,也可以直接使用setnx/setex命令。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
47.120.5.13:6379> keys *
1) "test"
47.120.5.13:6379>

# 设置一个键值对,并指定过期时间为10秒
47.120.5.13:6379> set test1 test1 EX 10
OK
47.120.5.13:6379>

# 设置一个键值对,并指定过期时间为500毫秒
47.120.5.13:6379> set test2 test2 PX 500
OK
47.120.5.13:6379>

# 设置一个键值对,但只在键不存在时才进行设置(NX选项)
47.120.5.13:6379> set test test NX
(nil)
47.120.5.13:6379> set test3 test3 NX
OK
47.120.5.13:6379>

# 设置一个键值对,但只在键已经存在时才进行设置(XX选项)
47.120.5.13:6379> set test3 3test XX
OK
47.120.5.13:6379> get test3
"3test"
47.120.5.13:6379>

# 设置一个键值对,并同时指定过期时间为30秒,只在键不存在时才进行设置
47.120.5.13:6379> set test4 test4 EX 30 NX
OK
47.120.5.13:6379>
请注意:
EX(Expiration) 和 PX(Expiration in milliseconds) 可以同时出现,这两个选项用于设置键的过期时间,可以根据需要选择以秒或毫秒为单位来指定过期时间。
NX(Not Exists)和XX(Exists)选项不能同时出现。这两个选项是互斥的,意味着在同一个SET命令中不能同时指定NX和XX。如果使用NX选项,表示只有在键不存在的情况下才会进行设置。如果键已经存在,SET命令将不会执行任何操作。如果使用XX选项,表示只有在键已经存在的情况下才会进行设置。如果键不存在,SET命令将不会执行任何操作。即 { SET key value NX XX } 这样的组合是无效的

4.2 get key

获取 key 键相对应的 value 值

1
2
3
47.120.5.13:6379> get test
"test"
47.120.5.13:6379>

4.3 incr(by) key (increment)

incr key : 单次递增,字符串中的值不是数字类型则会报错。

incrby key increment : 单次递增 increment ,如果是浮点型数据可使用 incrbyfloat 命令递增

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
47.120.5.13:6379> set test1 666
OK
47.120.5.13:6379>
47.120.5.13:6379> incr test1
(integer) 667
47.120.5.13:6379> incrby test1 100
(integer) 767
47.120.5.13:6379>

47.120.5.13:6379> set test9 66.6
OK
47.120.5.13:6379> incrbyfloat test9 1
"67.6"
47.120.5.13:6379> incrbyfloat test9 1.1
"68.7"
47.120.5.13:6379>

4.4 mset key value [key value …]

批量存放键值

1
2
3
4
5
6
7
47.120.5.13:6379> mset test2 value2 test3 value3 test4 value4
OK
47.120.5.13:6379> keys *
1) "test2"
2) "test3"
3) "test4"
47.120.5.13:6379>

4.5 mget key [key …]

批量获取键值,Redis接收的是UTF-8的编码,如果是中文一个汉字将占3位返回。

1
2
3
4
47.120.5.13:6379> mget test2 test3
1) "value2"
2) "value3"
47.120.5.13:6379>

4.6 strlen key

获取值的长度

1
2
47.120.5.13:6379> strlen test2
(integer) 6

4.7 append key value

在原键值尾部追加内容

1
2
3
4
5
6
7
47.120.5.13:6379> get test2
"value2"
47.120.5.13:6379> append test2 test2
(integer) 11
47.120.5.13:6379> get test2
"value2test2"
47.120.5.13:6379>

4.8 getrange key start end

获取部分字符键值

1
2
3
4
5
47.120.5.13:6379> get test2
"value2test2"
47.120.5.13:6379> getrange test2 1 3
"alu"
47.120.5.13:6379>

4.9 String(字符串)的一些应用场景

用户会话管理:在一个分布式的网络服务中,用户的会话信息(例如登录状态)被存储在多个不同的服务器上。然而,在负载均衡的情况下,服务器会将用户的请求分散到多个不同的服务器上,以平衡服务器的负载压力。这可能会导致一个问题:用户在刷新页面时可能会被引导到不同的服务器,从而需要重新登录,这对于用户体验来说是无法容忍的。而解决这个问题,我们只需要使用具有高可用性和可扩展性的 Redis,每当用户进行登录操作或者需要验证登录状态时,系统会从Redis中获取相应的会话信息。这种设计可以确保用户的会话状态在不同服务器之间保持一致,从而提供更好的用户体验。
缓存热门数据:当涉及需要频繁读取的数据时,我们可以利用 Redis 缓存的机制,从而避免频繁地访问数据库,从而提高系统的性能表现。以电子商务网站为例,可以将热门商品的信息序列化后存储在 Redis 中,这样就能够有效减轻数据库的负担。这种做法能够在用户频繁请求热门商品信息时,快速地从 Redis 缓存中获取数据,而不必每次都直接查询数据库,从而更有效地提升整个系统的响应速度和性能水平。

5 Hash(哈希)基本操作命令

Hash 适合用来存储类似于对象信息这样的数据。在使用 Hash 类型时,我们需要一个空间来容纳多个键值对数据,这使得我们能够有效地存储和检索这些数据。这种数据类型的背后原理是使用哈希表的数据结构来进行数据存储,这带来了快速的存储和查询操作,因为它们都能在常数时间内完成,从而保证了高效性能。

5.1 hset(nx) key field value

hset:存放键的单个字段值
hsetnx:字段值不存在时才存放字段的值,避免覆盖已经存在的数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 如果字段值存在,使用 hset 会覆盖原值
47.120.5.13:6379> hset user1 name xiaohong
(integer) 1
47.120.5.13:6379> hset user1 name xiaozhang
(integer) 0
47.120.5.13:6379> hget user1 name
"xiaozhang"
47.120.5.13:6379>

# 如果字段值存在,使用 hset 原值不会被覆盖
47.120.5.13:6379> hsetnx user2 name xiaoming
(integer) 1
47.120.5.13:6379> hsetnx user2 name xiaoli
(integer) 0
47.120.5.13:6379> hget user2 name
"xiaoming"
47.120.5.13:6379>

5.2 hmset key field value [field value …]

存储一个键的多个字段值

1
2
3
4
5
6
7
8
9
10
47.120.5.13:6379> hmset user name zhangsan age 15 address xiamen
OK
47.120.5.13:6379> hgetall user
1) "name"
2) "zhangsan"
3) "age"
4) "15"
5) "address"
6) "xiamen"
47.120.5.13:6379>

5.3 h[m]get key field [field …]

hget key field:获取单个字段值
hmget key field [field …]:获取多个字段值

1
2
3
4
5
6
7
8
9
10
11
# 获取单个字段值
47.120.5.13:6379> hget user name
"zhangsan"
47.120.5.13:6379>

# 获取多个字段值
47.120.5.13:6379> hmget user name age address
1) "zhangsan"
2) "15"
3) "xiamen"
47.120.5.13:6379>

5.4 hgetall key

获取该键中所有的字段与值

1
2
3
4
5
6
7
8
47.120.5.13:6379> hgetall user
1) "name"
2) "zhangsan"
3) "age"
4) "15"
5) "address"
6) "xiamen"
47.120.5.13:6379>

5.5 hkeys key

获取所有的字段

1
2
3
4
5
47.120.5.13:6379> hkeys user
1) "name"
2) "age"
3) "address"
47.120.5.13:6379>

5.6 hvals key

获取所有字段值

1
2
3
4
5
47.120.5.13:6379> hvals user
1) "zhangsan"
2) "15"
3) "xiamen"
47.120.5.13:6379>

5.7 hexists key field

判断键的字段是否存在

1
2
3
4
5
47.120.5.13:6379> hexists user name
(integer) 1
47.120.5.13:6379> hexists user gender
(integer) 0
47.120.5.13:6379>

5.8 hlen key

获取键的字段数量

1
2
3
47.120.5.13:6379> hlen user
(integer) 3
47.120.5.13:6379>

5.9 hincrby key field increment

单次递增/递减 increment

1
2
3
4
5
6
7
47.120.5.13:6379> hget user age
"15"
47.120.5.13:6379> hincrby user age 10
(integer) 25
47.120.5.13:6379> hincrby user age -30
(integer) -5
47.120.5.13:6379>

5.10 hash(哈希)的一些应用场景

购物车功能实现:购物车功能的核心在于用户在前端点击商品后,将商品添加到购物车中。前端会传递商品的唯一标识(商品 ID)以及购买所需的数量等数据到后端。在 Java 环境下,通过接收这些前端传递的参数,我们可以实现购物车的一系列操作,例如添加商品、增加或减少购买数量,移除特定商品或清空整个购物车等功能。而如果我们选择使用Redis来实现购物车功能,我们可以巧妙地利用 Redis 的 Hash 类型。在这种情况下,我们以每个用户的唯一标识(用户 ID)作为主键(key),然后以商品的唯一标识(商品 ID)作为字段(field),将购买数量作为对应的值(value)。这样的数据结构正好满足了购物车所需的三个重要元素,从而非常适合构建购物车功能。
实时统计与计数: 如果你需要实时地统计和计数不同事件或指标,例如网站的页面访问次数、用户点击次数等,可以使用 Redis 的 Hash 来存储这些统计数据。每个事件的唯一标识作为Hash的键,不同统计指标作为字段,对应的值存储具体的计数。

6 List(列表)基本操作命令

List 数据类型可以容纳多个数据项,并且能够按照数据进入的顺序进行有序存储。每个 List 存储空间可以保存多个数据,同时数据项的插入顺序也会在其中得以体现。List 数据类型的实现基于双向链表的存储结构,这使得数据的插入和删除操作更加高效且灵活。

6.1 lpush key value [value …]

从左端存值

1
2
3
4
5
6
7
8
9
47.120.5.13:6379> lpush list1 zhangsan
(integer) 1
47.120.5.13:6379> lpush list1 lisi wangwu
(integer) 3
47.120.5.13:6379> lrange list1 0 -1
1) "wangwu"
2) "lisi"
3) "zhangsan"
47.120.5.13:6379>

6.2 rpush key value [value …]

从右端存值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
47.120.5.13:6379> lrange list1 0 -1
1) "wangwu"
2) "lisi"
3) "zhangsan"
47.120.5.13:6379> rpush list1 zhaoliu
(integer) 4
47.120.5.13:6379> rpush list1 sunqi zhouba
(integer) 6
47.120.5.13:6379> lrange list1 0 -1
1) "wangwu"
2) "lisi"
3) "zhangsan"
4) "zhaoliu"
5) "sunqi"
6) "zhouba"
47.120.5.13:6379>

6.3 lset key index value

按索引存值

1
2
3
4
5
6
7
8
9
10
47.120.5.13:6379> lset list1 2 wujiu
OK
47.120.5.13:6379> lrange list1 0 -1
1) "wangwu"
2) "lisi"
3) "wujiu"
4) "zhaoliu"
5) "sunqi"
6) "zhouba"
47.120.5.13:6379>

6.4 lpop key

左端弹出元素

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
47.120.5.13:6379> lrange list1 0 -1
1) "wangwu"
2) "lisi"
3) "wujiu"
4) "zhaoliu"
5) "sunqi"
6) "zhouba"
47.120.5.13:6379> lpop list1
"wangwu"
47.120.5.13:6379> lrange list1 0 -1
1) "lisi"
2) "wujiu"
3) "zhaoliu"
4) "sunqi"
5) "zhouba"
47.120.5.13:6379>

6.5 rpop key

右端弹出元素

1
2
3
4
5
6
7
8
9
10
11
12
13
14
47.120.5.13:6379> lrange list1 0 -1
1) "lisi"
2) "wujiu"
3) "zhaoliu"
4) "sunqi"
5) "zhouba"
47.120.5.13:6379> rpop list1
"zhouba"
47.120.5.13:6379> lrange list1 0 -1
1) "lisi"
2) "wujiu"
3) "zhaoliu"
4) "sunqi"
47.120.5.13:6379>

6.6 llen key

获取元素个数

1
2
3
4
5
6
7
8
47.120.5.13:6379> lrange list1 0 -1
1) "lisi"
2) "wujiu"
3) "zhaoliu"
4) "sunqi"
47.120.5.13:6379> llen list1
(integer) 4
47.120.5.13:6379>

6.7 lrange key start stop

截取 list 中的部分元素

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
47.120.5.13:6379> lpush list1 zhangsan wangwu
(integer) 6
# 从左端开始截取
47.120.5.13:6379> lrange list1 1 4
1) "zhangsan"
2) "lisi"
3) "wujiu"
4) "zhaoliu"

# 截取所有
47.120.5.13:6379> lrange list1 0 -1
1) "wangwu"
2) "zhangsan"
3) "lisi"
4) "wujiu"
5) "zhaoliu"
6) "sunqi"

# 从右端开始截取
47.120.5.13:6379> lrange list1 -3 -1
1) "wujiu"
2) "zhaoliu"
3) "sunqi"
47.120.5.13:6379>

6.8 lindex key index

通过索引获取值

1
2
3
4
5
6
7
8
9
10
11
12
47.120.5.13:6379> lrange list1 0 -1
1) "wangwu"
2) "zhangsan"
3) "lisi"
4) "wujiu"
5) "zhaoliu"
6) "sunqi"
47.120.5.13:6379> lindex list1 3
"wujiu"
47.120.5.13:6379> lindex list1 -2
"zhaoliu"
47.120.5.13:6379>

6.9 lrem key count value

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
47.120.5.13:6379> lpush userids 111 222 333 111 222 222 333 222 222 333
(integer) 10
# count=0 删除所有
47.120.5.13:6379> lrem userids 0 111
(integer) 2
47.120.5.13:6379> lrange userids 0 -1
1) "333"
2) "222"
3) "222"
4) "333"
5) "222"
6) "222"
7) "333"
8) "222"
# count > 0 从左端删除前count个
47.120.5.13:6379> lrem userids 3 222
(integer) 3
47.120.5.13:6379> lrange userids 0 -1
1) "333"
2) "333"
3) "222"
4) "333"
5) "222"
# count < 0 从右端删除前count个
47.120.5.13:6379> lrem userids -1 333
(integer) 1
47.120.5.13:6379> lrange userids 0 -1
1) "333"
2) "333"
3) "222"
4) "222"
47.120.5.13:6379>

6.10 ltrim key start stop

按索引删除部分值

1
2
3
4
5
6
7
8
9
10
11
47.120.5.13:6379> lrange userids 0 -1
1) "333"
2) "333"
3) "222"
4) "222"
47.120.5.13:6379> ltrim userids 1 2
OK
47.120.5.13:6379> lrange userids 0 -1
1) "333"
2) "222"
47.120.5.13:6379>

6.11 List(列表)的一些应用场景

微信朋友圈点赞:在这个场景中,需要根据顺序展示点赞好友的信息,并且在取消点赞时,需要移除相关好友的信息。使用 Redis 的 List 数据结构。可以将朋友圈内容作为 Key,将点赞的用户信息作为 Value。在点赞时,可以通过使用 RPUSH 命令将用户信息添加到 List 中,这样可以维持点赞的顺序。而在取消点赞后,可以使用 LREM 命令从 List 中移除相应的用户信息,从而实现移除取消点赞的好友信息的操作。
实时数据流: List 也可以用于存储实时数据流,如日志信息或用户活动记录。新数据可以追加到 List 中,同时旧数据可以通过控制List的长度进行自动清理,以保持最近的数据。
聊天应用: List 可以用于存储聊天应用中的聊天消息。新消息可以追加到 List 中,而聊天历史可以通过 LRANGE 命令进行获取。
历史记录: List 还可以用于存储用户活动的历史记录,如用户浏览记录、搜索记录等。新的活动可以添加到 List 中,而过期的历史可以通过控制 List 的长度进行管理。
任务队列: 除了简单的消息队列,List 还可以用作更复杂的任务队列,例如在任务处理系统中,任务可以以 JSON 格式存储在 List 中,然后工作进程可以从 List 中获取并执行任务。

7 Set(集合)基本操作命令

Set 是一种无序的、不重复元素集合。每个 Set 中的元素都是唯一的,且没有特定的顺序。Redis 的 Set 数据结构内部使用哈希表来存储元素,这使得添加、删除和查找操作都可以在平均常数时间内完成。

7.1 sadd key member [member …]

添加 set 集合,顺序随机且不重复

1
2
3
4
5
6
7
8
9
10
47.120.5.13:6379> sadd user zhangsan lisi wangwu zhaoliu zhangsan sunqi
(integer) 5
(0.75s)
47.120.5.13:6379> smembers user
1) "zhaoliu"
2) "lisi"
3) "zhangsan"
4) "sunqi"
5) "wangwu"
47.120.5.13:6379>

7.2 smembers key

获取全部元素

1
2
3
4
5
6
7
47.120.5.13:6379> smembers user
1) "zhaoliu"
2) "lisi"
3) "zhangsan"
4) "sunqi"
5) "wangwu"
47.120.5.13:6379>

7.3 srandmember langs count

随机获取 count 个元素

1
2
3
4
5
6
7
8
47.120.5.13:6379> srandmember user 3
1) "lisi"
2) "zhangsan"
3) "zhaoliu"
47.120.5.13:6379> srandmember user 3
1) "sunqi"
2) "wangwu"
3) "zhaoliu"

7.4 sismember key member

判断集合是否存在元素 member

1
2
3
4
5
47.120.5.13:6379> sismember user zhangsan
(integer) 1
47.120.5.13:6379> sismember user wujiu
(integer) 0
47.120.5.13:6379>

7.5 scard key

获取集合元素个数

1
2
3
4
5
6
7
8
9
47.120.5.13:6379> smembers user
1) "sunqi"
2) "zhangsan"
3) "lisi"
4) "wangwu"
5) "zhaoliu"
47.120.5.13:6379> scard user
(integer) 5
47.120.5.13:6379>

7.6 srem key member [member …]

删除集合元素

1
2
3
4
5
6
7
8
9
10
11
12
13
47.120.5.13:6379> smembers user
1) "sunqi"
2) "zhangsan"
3) "lisi"
4) "wangwu"
5) "zhaoliu"
47.120.5.13:6379> srem user zhaoliu sunqi
(integer) 2
47.120.5.13:6379> smembers user
1) "zhangsan"
2) "lisi"
3) "wangwu"
47.120.5.13:6379>

7.7 spop key count

随机弹出 count 个元素

1
2
3
4
5
6
7
8
9
10
47.120.5.13:6379> sadd user zhangsan lisi wangwu zhaoliu zhangsan sunqi
(integer) 2
47.120.5.13:6379> spop user 3
1) "sunqi"
2) "zhangsan"
3) "lisi"
47.120.5.13:6379> smembers user
1) "wangwu"
2) "zhaoliu"
47.120.5.13:6379>

7.8 set(集合)的一些应用场景

获取共同好友:当涉及共同好友、社交关系等功能时,Redis 的 Set 数据结构非常适用。在微信朋友圈的点赞、评论等情境中,这一数据结构能够发挥重要作用。实现的思路是,首先将每个用户的好友列表存储在以 “friend_{userId}” 为键的 Set 集合中。例如,用户1的好友为2、3、4;用户2的好友为1、3、4;用户3的好友为1、4、5。在这种情况下,如果用户1和用户2是好友,那么他们的共同好友可以通过计算他们好友集合的交集来获取。这种方法在社交网络应用中得到广泛应用,因为 Redis 的高效 Set 数据结构能够迅速处理好友关系、共同好友等复杂的关联操作。
投票系统:Set可用于投票系统,例如针对某个主题或选项的投票。对于每个主题或选项,你可以创建一个对应的 Set,其中每个用户的 ID 作为 Set 的一个元素。用户在投票时,可以使用 SADD 命令将其 ID 添加到特定的主题或选项 Set 中,表示他们的投票。你可以使用 SCARD 命令计算 Set 的大小来统计投票数。
用户兴趣:在用户兴趣的情景中,可以使用 Set 来存储每个用户的兴趣标签。每个用户可以有一个对应的 Set,其中每个兴趣标签作为 Set 的元素。这样,可以通过 Set 的交集操作找到共同拥有相似兴趣的用户。例如,通过计算两个用户的兴趣标签集合的交集,可以找到他们之间的兴趣相似度

8 ZSet(有序集合)基本操作命令

Redis的 ZSet(有序集合)是一种特殊的数据结构,它与 Set 类似,但每个元素都关联了一个分数(score),使得元素在集合中保持有序状态。ZSet 允许你根据分数范围、分数排序等进行查询和操作,因此非常适合需要排序和范围查询的场景。
有序集合在内部使用散列表和跳跃表(skiplist)的混合结构,这使得它在执行查找、插入、删除操作时都能获得较好的性能。

8.1 zadd key [NX|XX] [CH] [INCR] score member [score member …]

将一个或多个成员添加到有序集合中,并设置它们的分数。以下是各个参数的解释:

key:有序集合的键名。
[NX|XX]:可选参数,用于指定行为。NX表示只在成员不存在时执行添加操作,XX表示只在成员已存在时执行更新操作。
[CH]:可选参数,表示将操作返回的结果是修改了多少个元素的数量。
[INCR]:可选参数,表示如果设置了这个选项,命令会将分数作为增量操作处理。
score:成员的分数,用于决定成员在有序集合中的排序位置。
member:要添加的成员。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 将成员"John"添加到名为"leaderboard"的有序集合中,分数为100:
47.120.5.13:6379> zadd leaderboard 100 John
(integer) 1
# 如果成员"Sarah"不存在,则将其添加到"leaderboard",分数为150:
47.120.5.13:6379> zadd leaderboard NX 150 Sarah
(integer) 1
## 如果成员"Jane"已经存在于"leaderboard",则更新其分数为120:
47.120.5.13:6379> zadd leaderboard XX 120 Jane
(integer) 0
# 添加成员"Mike""David""Emily""leaderboard",分别分数为110、105和125。如果成员已存在,则更新分数:
47.120.5.13:6379> zadd leaderboard CH 110 Mike 105 David 125 Emily
(integer) 3
# 将成员"Sam"添加到"scoreboard",并将其分数增加10。如果"Sam"不存在,则创建新成员并设置分数为10。
47.120.5.13:6379> zadd scoreboard incr 10 Sam
"10"
47.120.5.13:6379> zrange leaderboard 0 -1 withscores
1) "John"
2) "100"
3) "David"
4) "105"
5) "Mike"
6) "110"
7) "Emily"
8) "125"
9) "Sarah"
10) "150"
47.120.5.13:6379> zrange scoreboard 0 -1 withscores
1) "Sam"
2) "10"
47.120.5.13:6379>

8.2 zscore key member

获取元素分数

1
2
3
47.120.5.13:6379> zscore leaderboard David
"105"
47.120.5.13:6379>

8.3 zrange key start stop [WITHSCORES]

获取有序集合中指定排名范围内的成员
[WITHSCORES]:是否包含分数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 获取所有元素
47.120.5.13:6379> zrange leaderboard 0 -1
1) "John"
2) "David"
3) "Mike"
4) "Emily"
5) "Sarah"

# 获取所有元素及分数
47.120.5.13:6379> zrange leaderboard 0 -1 withscores
1) "John"
2) "100"
3) "David"
4) "105"
5) "Mike"
6) "110"
7) "Emily"
8) "125"
9) "Sarah"
10) "150"
47.120.5.13:6379>

8.4 zrangebyscore key min max [WITHSCORES] [LIMIT offset count]

按照成员的分数范围从有序集合中获取成员。以下是各个参数的解释:

key:有序集合的键名。
min:分数范围的最小值。
max:分数范围的最大值。
[WITHSCORES]:可选参数,如果指定该选项,命令会同时返回成员的分数。
[LIMIT offset count]:可选参数,用于限制返回的成员数量,offset 表示从哪个位置开始,count 表示要返回的成员数量。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# 获取在"leaderboard"中分数在100到200之间的所有成员:
47.120.5.13:6379> zrangebyscore leaderboard 100 200
1) "John"
2) "David"
3) "Mike"
4) "Emily"
5) "Sarah"
# 获取在"leaderboard"中分数在100到120之间的所有成员及其分数:
47.120.5.13:6379> zrangebyscore leaderboard 100 120 withscores
1) "John"
2) "100"
3) "David"
4) "105"
5) "Mike"
6) "110"
# 获取在"leaderboard"中分数在100到120之间的前2个成员(从排名第2开始):
47.120.5.13:6379> zrangebyscore leaderboard 100 120 limit 1 2
1) "David"
2) "Mike"
# 获取在"leaderboard"中分数在100到120之间的成员,但只返回前3个成员及其分数:
47.120.5.13:6379> zrangebyscore leaderboard 100 120 withscores limit 0 3
1) "John"
2) "100"
3) "David"
4) "105"
5) "Mike"
6) "110"
# 获取在"leaderboard"中分数在100到120之间的所有成员,并按照分数从高到低的顺序返回:
47.120.5.13:6379> zrevrangebyscore leaderboard 120 100
1) "Mike"
2) "David"
3) "John"
47.120.5.13:6379>

8.5 zincrby key increment member

增加指定元素分数

1
2
3
47.120.5.13:6379> zincrby leaderboard 5 John
"105"
47.120.5.13:6379>

8.6 zcard key

获取集合元素个数

1
2
3
47.120.5.13:6379> zcard leaderboard
(integer) 5
47.120.5.13:6379>

8.7 zcount key min max

获取指定范围分数个数

1
2
3
47.120.5.13:6379> zcount leaderboard 100 110
(integer) 3
47.120.5.13:6379>

8.8 zrank key member

获取元素排名

1
2
3
47.120.5.13:6379> zrank leaderboard Mike
(integer) 2
47.120.5.13:6379>

8.9 ZSet(有序集合)的一些应用场景

排行榜:在排行榜应用中,可以使用 ZSet 来管理用户的得分、积分、点击量等。每个用户被视为一个有序集合的元素,其分数表示其排名。通过使用 ZADD 命令将用户添加到 ZSet 中,同时设置其分数。你可以使用 ZRANK 命令获取用户在排行榜中的排名,也可以使用 ZREVRANGE 命令获取排行榜的前若干名。
实时热门内容:在需要实时获取热门内容的应用中,ZSet 可用于存储内容的热度或点击量。每个内容项被视为一个元素,其分数表示热度或点击量。当内容受到点击或访问时,你可以使用 ZINCRBY 命令增加其分数。使用 ZREVRANGE 命令可以获取当前的热门内容,从高分到低分。
带权重的抽奖:如果实现带权重的抽奖活动,可以将抽奖选项作为 ZSet 的元素,设置权重作为元素的分数。权重越高,被选中的概率越大。使用 ZRANDMEMBER 命令可以根据权重进行随机抽奖,选中的元素即为获胜选项。
  • 标题: Redis 基本命令和使用
  • 作者: HYF
  • 创建于 : 2023-08-05 23:26:32
  • 更新于 : 2024-07-27 21:21:50
  • 链接: https://youfeng.ink/redis-c5527684e4a2/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
此页目录
Redis 基本命令和使用