首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

【Redis】散列表(Hash)和列表(List)的运用和理解以及Hash和List应用场景对比详解

  • 25-02-18 09:00
  • 3078
  • 8163
blog.csdn.net

文章目录

  • 一. 散列表(hash)
    • 1.1 基本操作
    • 1.2 当value字符串的内容是数字时
  • 二.列表(List)
    • 2.1 基本操作
  • 三.Hash和List的应用场景
    • 3.1Hash的应用场景
    • 3.2List的应用场景
  • 总结

一. 散列表(hash)

在这里插入图片描述

Redis哈希是字符串类型字段和值的映射表。哈希特别适合存储对象。
Redis中的每个哈希可以存储232-1个键值对(超过40亿)。

image-20221029130442831

1.1 基本操作

image-20221029130541652

image-20221029130754388

Redis Hset 命令用于为哈希表中的字段赋值 。如果哈希表不存在,一个新的哈希表被创建并进行 HSET 操作。如果字段已经存在于哈希表中,旧值将被覆盖。

Redis Hget 命令用于返回哈希表中指定字段的值。

hmget命令用于返回哈希表中指定多个的字段的值。

hgetall命令用于返回哈希表中所有的字段和值。

我的实操过程如下:

127.0.0.1:6379> hset h1 f1 v1 f2 v2
(integer) 2
127.0.0.1:6379> hget h1 f1
"v1"
127.0.0.1:6379> hmget h1 f1 f2
1) "v1"
2) "v2"
127.0.0.1:6379> hgetall h1
1) "f1"
2) "v1"
3) "f2"
4) "v2"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

Redis Hkeys 命令用于获取哈希表中的所有域(field)。包含哈希表中所有域(field)列表。 当 key 不存在时,返回一个空列表。

Redis Hexists 命令用于查看哈希表的指定字段是否存在。如果哈希表含有给定字段,返回 1 。 如果哈希表不含有给定字段,或 key 不存在,返回 0 。

我的实操过程如下:

127.0.0.1:6379> hkeys h1
1) "f1"
2) "f2"
127.0.0.1:6379> hexists h1 f3
(integer) 0
127.0.0.1:6379> hstrlen h1 f1
(integer) 2
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

1.2 当value字符串的内容是数字时

image-20221029131302089

上篇文章里提到的字符串里也是可以加小数的。

如下,这个例子是增加一个f1字段的值为123,让其增加1.23,观察得知,最后的结果为"124.23"。

我的实操过程如下:

127.0.0.1:6379> hset h2 f1 123
(integer) 1
127.0.0.1:6379> hincrbyfloat h2 f1 1.23
"124.23"
  • 1
  • 2
  • 3
  • 4

二.列表(List)

Redis列表是一个简单的字符串列表,根据插入顺序排序。您可以将元素添加到列表的头部(左侧)或尾部(右侧)
一个列表最多可以包含232-1个元素(4294967295,每个列表超过40亿个元素)。

image-20221029131844892

2.1 基本操作

image-20221029132818387

Redis Rpush 命令用于将一个或多个值插入到列表的尾部(最右边)。如果列表不存在,一个空列表会被创建并执行 RPUSH 操作。 当列表存在但不是列表类型时,返回一个错误。**注意:**在 Redis 2.4 版本以前的 RPUSH 命令,都只接受单个 value 值。

Redis Lrange 返回列表中指定区间内的元素,区间以偏移量 START 和 END 指定。 其中 0 表示列表的第一个元素, 1 表示列表的第二个元素,以此类推。 你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。

Redis Lpush 命令将一个或多个值插入到列表头部。 如果 key 不存在,一个空列表会被创建并执行 LPUSH 操作。 当 key 存在但不是列表类型时,返回一个错误。**注意:**在Redis 2.4版本以前的 LPUSH 命令,都只接受单个 value 值。

我的实操过程如下:

127.0.0.1:6379> rpush li 1 2 3 4 5
(integer) 5
127.0.0.1:6379> lrange l1 0 -1
(empty array)
127.0.0.1:6379> lrange li 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
127.0.0.1:6379> lpush li a b c d e
(integer) 10
127.0.0.1:6379> lrange li 0 -1
 1) "e"
 2) "d"
 3) "c"
 4) "b"
 5) "a"
 6) "1"
 7) "2"
 8) "3"
 9) "4"
10) "5"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

Redis Rpop 命令用于移除列表的最后一个元素,返回值为移除的元素。

弹出之后,原本的列表里就不存在这个数值了。

我的实操过程如下:

127.0.0.1:6379> lrange li 0 -1
1) "e"
2) "d"
3) "c"
4) "b"
5) "a"
6) "1"
7) "2"
8) "3"
127.0.0.1:6379> rpop li
"3"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

image-20221029133409386

Redis Lset 通过索引来设置元素的值。当索引参数超出范围,或对一个空列表进行 LSET 时,返回一个错误。

这里的例子将li的值从e改为了aa。

我的实操过程如下:

127.0.0.1:6379> lset li 0 aa
OK
127.0.0.1:6379> lrange li 0 -1
1) "aa"
2) "d"
3) "c"
4) "b"
5) "a"
6) "1"
7) "2"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

Redis Linsert 命令用于在列表的元素前或者后插入元素。当指定元素不存在于列表中时,不执行任何操作。当列表不存在时,被视为空列表,不执行任何操作。如果 key 不是列表类型,返回一个错误。

如果命令执行成功,返回插入操作完成之后,列表的长度。 如果没有找到指定元素 ,返回 -1 。 如果 key 不存在或为空列表,返回 0 。

我的实操过程如下:

127.0.0.1:6379> linsert li after c cc
(integer) 8
127.0.0.1:6379> lrange li 0 -1
1) "aa"
2) "d"
3) "c"
4) "cc"
5) "b"
6) "a"
7) "1"
8) "2"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

Redis Lrem 根据参数 COUNT 的值,移除列表中与参数 VALUE 相等的元素。

COUNT 的值可以是以下几种:

  • count > 0 : 从表头开始向表尾搜索,移除与 VALUE 相等的元素,数量为 COUNT 。
  • count < 0 : 从表尾开始向表头搜索,移除与 VALUE 相等的元素,数量为 COUNT 的绝对值。
  • count = 0 : 移除表中所有与 VALUE 相等的值。
127.0.0.1:6379> lrem li 2 c
(integer) 1
  • 1
  • 2

Redis Lrange 返回列表中指定区间内的元素,区间以偏移量 START 和 END 指定。 其中 0 表示列表的第一个元素, 1 表示列表的第二个元素,以此类推。 你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。

我的实操过程如下:

127.0.0.1:6379> lrange li 0 -1
1) "aa"
2) "d"
3) "cc"
4) "b"
5) "a"
6) "1"
7) "2"
127.0.0.1:6379> ltrim li 1 -2
OK
127.0.0.1:6379> lrange li 0 -1
1) "d"
2) "cc"
3) "b"
4) "a"
5) "1"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

三.Hash和List的应用场景

3.1Hash的应用场景

1.对象缓存
哈希类型(键、字段、值)的结构类似于对象(对象id、属性、值),也可以用于存储对象。string+json也是一种存储对象的方法,

2. 购物车

3.2List的应用场景

  • 堆栈:LPUSH+LPOP–>FILO

    先入后出原则:LPUSH从队列左侧进入d、c、b、a,LPOP从队列左侧离开a、b、c、d

  • 队列:LPUSH+RPOP
    先进先出原则:LPUSH从队列左侧进入d、c、b、a,RPOP从队列右侧离开d、c,b、a

  • 阻塞队列:LPUSH+BRPOP
    LPUSH+BRPOP在LPUSH+RPOP的基础上增加了阻塞和等待功能,
    BRPOP实际上等于阻塞+RPOP。当队列中的数据为空时,
    它将侦听消息队列,直到收到消息

总结

本文深入介绍了 Redis 中的几种常见数据结构,包括哈希(Hash)、列表(List)和集合(Set),并通过具体的命令和实操示例展示了它们的基本操作和应用场景。

  • 哈希(Hash):哈希是 Redis 中非常有用的数据类型,它适合用于存储对象类型的数据结构,通过字段和值的映射关系,支持高效的键值操作,常用于缓存和用户信息存储等场景。

  • 列表(List):Redis 列表是一个有序字符串集合,支持从两端插入和删除元素。通过具体命令如 RPUSH、LPUSH、LPOP 等,用户可以实现栈和队列等数据结构,适合用于任务队列、消息队列等应用。

  • 集合(Set):Redis 集合是无序且唯一的字符串集合,能够高效处理去重操作,常用于标签管理、社交网络的好友列表等场景。集合支持交集、并集、差集等操作,特别适合需要进行集合运算的应用。

此外,文中还结合实际操作场景进行了详细展示,包括哈希表操作、列表操作以及集合操作等,使得读者能够更直观地理解 Redis 数据结构的实际应用。

总的来说,Redis 提供了非常丰富的数据类型和操作方法,能够满足各种业务需求,理解和掌握这些数据结构的使用技巧,对于开发高效、可靠的应用系统至关重要。

注:本文转载自blog.csdn.net的一键难忘的文章"https://blog.csdn.net/weixin_52908342/article/details/145447047"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

112
数据库
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top