第23章 Redis入门必备:快速上手常用命令与应用示例【散列和列表】

1,454 阅读5分钟

引言

Redis是一种高性能的键值存储数据库,以其快速的读取和写入速度受到广泛欢迎。由于其简单易用的特性,Redis不仅适用于缓存、会话管理,还可以用于消息队列、实时分析等多种场景。本文旨在为Redis入门者提供一个实用的指南,通过介绍常用命令和应用实例,帮助读者快速上手并掌握Redis的基本操作,无论是开发新项目还是优化现有系统,Redis都将成为您不可或缺的利器。让我们一起探索Redis的强大功能,开启高效数据管理的旅程!

哈希操作

散列类型采用了字典结构(k-v)进行存储。散列类型适合存储对象。可以采用这样的命名方式:对象类别和 ID 构成键名,使用字段表示对象的属性,而字段值则存储属性值。如:存储 ID 为 2 的汽车对象。

例如文章内容存储:

hset 设置哈希field域的值

hset key field value
# 把key中 filed域的值设为value
# 注:如果没有field域,直接添加,如果有,则覆盖原field域的值

# 示例
127.0.0.1:6379> hset user name zhangsan
(integer) 1
127.0.0.1:6379> hset user age 25
(integer) 1
127.0.0.1:6379> hset user gender male
(integer) 1

hmset 设置哈希多个field域的值

hmset key field1 value1 [field2 value2 field3 value3 ......fieldn valuen]
# 一次设置多个field和对应的value

# 示例
127.0.0.1:6379> hmset user name lisi age 26 gender male
OK

hget 获取field域的值

hget key field
# 获取field域的值

# 示例
127.0.0.1:6379> hmset user name lisi age 26 gender male
OK
127.0.0.1:6379> hget user age
"26

hmget 获取多个field域的值

hget key field
# 获取多个field域的值

# 示例
127.0.0.1:6379> hmset user name lisi age 26 gender male
OK
127.0.0.1:6379> hmget user name age
1) "lisi"
2) "26"

hgetall 获取所有field域和值

hgetall key
# 获取哈希key的所有field域和值

# 示例
127.0.0.1:6379> hmset user name lisi age 26 gender male
127.0.0.1:6379> hgetall user
1) "name"
2) "lisi"
3) "age"
4) "26"
5) "gender"
6) "male"

hlen 获取field的数量

hlen key
# 获取field的数量

# 示例
127.0.0.1:6379> hmset user name lisi age 26 gender male
127.0.0.1:6379> hlen user
(integer) 3

hdel 删除field域

hdel key field
# 删除key中 field域

# 示例
127.0.0.1:6379> hmset user name lisi age 26 gender male
127.0.0.1:6379> hdel user age
(integer) 1
127.0.0.1:6379> hgetall user
1) "name"
2) "lisi"
3) "gender"
4) "male"

hexists 判断field域是否存在

hexists key field
# 判断key中有没有field域

# 示例
127.0.0.1:6379> hmset user name lisi age 26 gender male
OK
127.0.0.1:6379> hexists user age
(integer) 1
127.0.0.1:6379> hexists user height
(integer) 0

hincrby 使field域的值加上整数

hincrby key field value
# 使key中的field域的值加上整型值value

# 示例
127.0.0.1:6379> hmset user name zhangsan height 158
OK
127.0.0.1:6379> hincrby user height 2
(integer) 160

hincrbyfloat 使field域的值加上浮点数

hincrbyfloat key field value
# 使key中的field域的值加上浮点值value

# 示例
127.0.0.1:6379> hmset user name zhangsan height 158
OK
127.0.0.1:6379> hincrbyfloat user height 5.5
"165.5"

hkeys 获取所有所有field域的名字

hkeys key
# 获取key中所有的field

# 示例
127.0.0.1:6379> hmset user name zhangsan age 25 gender male
OK
127.0.0.1:6379> hkeys user
1) "name"
2) "age"
3) "gender"

kvals 获取所有所有field域的值

kvals key
# 返回key中所有的value

# 示例
127.0.0.1:6379> hmset user name zhangsan age 25 gender male
OK
127.0.0.1:6379> hvals user
1) "zhangsan"
2) "25"
3) "male"

列表类型

列表类型(list)可以存储一个有序的字符串列表,常用的操作是向两端添加元素。

列表类型内部是使用双向链表实现的,也就是说,获取越接近两端的元素速度越快,代价是通过索引访问元素比较慢。

应用场景:

(1)显示社交网站的新鲜事、热门评论和新闻等;

(2)当队列使用;

(3)记录日志。

lpush/rpush 在链表头/尾增加一个成员

lpush/rpush key value
# 在链表头/尾增加一个成员,返回链表成员的个数

向列表的左边添加元素“1”,再依次加入“2”、“3”

在列表的右边依次加入两个元素“0”、“-1”:

# 示例实现
127.0.0.1:6379> lpush numbers 1
(integer) 1
127.0.0.1:6379> lpush numbers 2 3
(integer) 3
127.0.0.1:6379> rpush numbers 0 -1
(integer) 5

lrange 获取链表成员

lrange key start stop
# 返回链表中[start,stop]范围的成员
# 规律: 左数从0开始,右数从-1开始

# 示例
127.0.0.1:6379> lrange letters 0 -1
1) "A"
2) "B"
3) "C"
4) "D"
127.0.0.1:6379> lrange letters 1 2
1) "B"
2) "C"

lpop/rpop 弹出链表中头/尾的成员

lpop/rpop key
# 弹出链表中头/尾的成员

# 示例
127.0.0.1:6379> lrange letters 0 -1
1) "A"
2) "B"
3) "C"
4) "D"
127.0.0.1:6379> lpop letters
"A"
127.0.0.1:6379> rpop letters
"D"
127.0.0.1:6379> lrange letters 0 -1
1) "B"
2) "C"

lrem 删除链表成员

lrem key count value
# 从key链表中删除 value值
# 删除count的绝对值个value后结束
# count>0 从表头删除
# count<0 从表尾删除

# 示例
127.0.0.1:6379> rpush letters A B C D A B C D A B C D
(integer) 12
127.0.0.1:6379> lrem letters 2 A
(integer) 2
127.0.0.1:6379> lrange letters 0 -1
 1) "B"
 2) "C"
 3) "D"
 4) "B"
 5) "C"
 6) "D"
 7) "A"
 8) "B"
 9) "C"
10) "D"
127.0.0.1:6379> lrem letters -3 D
(integer) 3
127.0.0.1:6379> lrange letters 0 -1
1) "B"
2) "C"
3) "B"
4) "C"
5) "A"
6) "B"
7) "C"

lindex 获取链表索引对应的值

lindex key index
# 获取链表索引index对应的值

# 示例
127.0.0.1:6379> rpush letters A B C D
(integer) 4
127.0.0.1:6379> lindex letters 1
"B"
127.0.0.1:6379> lindex letters 2
"C"

llen key 获取链表成员个数

BASHllen key
# 获取链表成员个数

# 示例
127.0.0.1:6379> rpush letters A B C D
(integer) 4
127.0.0.1:6379> llen letters
(integer) 4

linsert 在链表中指定位置插入成员

linsert key after|before search value
# 在key链表中寻找"search",并在search值之前|之后插入value
# 如果没有找到,不插入值
# 如果找到一个search后,命令就结束了,因此不会插入多个value

# 示例
127.0.0.1:6379> rpush id 1 3 5 7
(integer) 4
127.0.0.1:6379> linsert id before 3 2
(integer) 5
127.0.0.1:6379> lrange id 0 -1
1) "1"
2) "2"
3) "3"
4) "5"
5) "7"
127.0.0.1:6379> linsert id after 5 6
(integer) 6
127.0.0.1:6379> lrange id 0 -1
1) "1"
2) "2"
3) "3"
4) "5"
5) "6"
6) "7"

blpop/brpop 一直等待弹出头/尾成员

blpop/brpop key timeout
# 等待弹出key的头/尾成员
# Timeout为等待超时时间
# 如果timeout为0,则一直等待
# 应用s场景: 长轮询Ajax,在线聊天时,能够用到

# 示例
# 第一个终端操作:
127.0.0.1:6379> brpop chat 0
1) "chat"
2) "hello"
(40.97s)

# 第二个终端操作:
127.0.0.1:6379> rpush chat "hello"
(integer) 1