Redis系列-数据类型hash(redis里面的hash数据结构是用什么实现的)
wptr33 2025-07-19 23:05 25 浏览
电商在如今的生活中可是说到处可见,拼团买,限时抢购,提前加购有优惠等等的营销方式层出不穷。但你有没有想过怎么可以用redis来实现个简单的购物车,实现购物车的总数,单个商品的加减,商品的删除和全选。
下面就开始我们今天的主角hash,文末我会用hash来简单的实现购物车的数据存储。
hash 类型
新的存储需求:对一系列存储的数据进行编组,方便管理,典型应用存储对象信息
需要的存储结构:一个存储空间保存多个键值对数据
hash类型:底层使用哈希表结构实现数据存储
如上图显示在存储空间中,左边一个key,右边对应field,每个field对应一个value,这就是hash的存储结构
hash存储结构优化
如果field数量较少,存储结构优化为类数组结构
如果field数量较多,存储结构使用HashMap结构
hash 类型数据的基本操作
添加/修改数据
hset key field value
获取数据
hget key field
hgetall key 获取全部数据
删除数据
hdel key field1 [field2]
当使用hgetall时会将该key的field和value都展示出来。
添加/修改多个数据
hmset key field1 value1 field2 value2 …
获取多个数据
hmget key field1 field2 …
获取哈希表中字段的数量
hlen key 返回的值为key中有几个field
获取哈希表中是否存在指定的字段
hexists key field
以上为hash的基本操作。
hash 类型数据扩展操作
获取哈希表中所有的字段名或字段值
hkeys key
hvals key
设置指定字段的数值数据增加指定范围的值
hincrby key field increment
hincrbyfloat key field increment
hash 类型数据操作的注意事项
hash类型下的value只能存储字符串,不允许存储其他数据类型,不存在嵌套现象。如果数据未获取到, 对应的值为(nil)
每个 hash 可以存储 2 32 - 1 个键值对
hash类型十分贴近对象的数据存储形式,并且可以灵活添加删除对象属性。但hash设计初衷不是为了存储大量对象而设计的,切记不可滥用,更不可以将hash作为对象列表使用,我们将关键的字段信息存入即可。
hgetall 操作可以获取全部属性,如果内部field过多,遍历整体数据效率就很会低,有可能成为数据访问瓶颈
hash实现购物车
先来分析下购物车的业务场景,购物车是每个人一个,商品有可能是一个或者多个,数量也可能是一个或多个。我们就可以将用户的id作为key,使用用户所有购买的商品的id作为field,value来存储该商品对应的数量。
购物车的操作:
- 1获取商品的数量,可以使用hget key field 返回商品的数量
- 2增加、减少、修改数量,可以使用 hincrby 和hset来实现
- 3删除,hdel
- 4全选,hgetall
- 5商品的种类个数 hlen
以上设计我们存储只有商品的id和数量信息,这样我们查询购物车还是需要在查询数据库,效率在本质上没有提升多少。
下面我们在设计一个优化的方案。来提示访问的性能。
优化一:
每条购物车中的商品记录保存成两条field
field1专用于保存购买数量
命名格式:商品id:nums
保存数据:数值
field2专用于保存购物车中显示的信息,包含文字描述,图片地址,所属商家信息等
命名格式:商品id:info
保存数据:json
以上运行完我们会发现会商品详情会存在大量的重复数据。
优化二:
我们将商品的详情做一个独立的hash存放,当需要查询的时候根据商品的id去找到对应的详情信息。这样就能大量的降低数据的重复性。我们还可以将商品按分类进行存放,这样还可以降低每个hash存的数据量的大小。
优化三:
上诉还会有个问题,商品详情当张三加一次购物车,我们添加一次详情,李四加一次同样的商品我们在加一次,这样就会出现一样的数据添加多次的问题,可以使用以下方式解决。 hsetnx key field value 当该值存在时则不做处理,不存在是再新增。
以上我们用购物车的例子来实现对应hash的各种操作的。大家自己动手亲自实践一下会印象更深。有任何问题可以私信我或在下方发表评论。
相关推荐
- Python字符串终极指南!单引号、双引号、三引号区别全解析
-
导语:Python中字符串(str)是最核心的数据类型!无论你是输出"HelloWorld"还是处理用户数据,都离不开它。今天彻底讲清字符串的三大定义方式及其核心区别,新手必看!...
- python 字符串的定义和表示_python字符串的用法
-
在Python中,字符串是一序列字符的集合。定义一个字符串可以使用单引号或双引号括起来的字符序列。...
- 简单的python-熟悉字符串相关的操作
-
str.py:#-*-coding:utf-8-*-#测试函数deff():#字符串使用单引号定义s1='test'print(s...
- Python初学者:3招搞定长字符串逐行读取,代码超简单
-
刚学Python的小伙伴,是不是遇到过这种尴尬情况?拿到一段老长的多行字符串——比如从文档里复制的日志、一段带换行的文章,想一行一行处理,如果直接打印全堆在一起,手动切又怕漏行,咋整啊?别慌!今天就给...
- Python 字符串_python字符串型怎么表达
-
除了数字,Python还可以操作字符串。字符串的形式是单引号('......')双引号(''.........'')或三个单引号(''&...
- 贴身口语第二关:请求帮忙、道歉、指路、接受礼物
-
02-@askforhelp请求协助1.F:Excuseme.Canyouhelpme?M:Yes,whatcanIdoforyou?...
- NBA赛季盘点之九大装逼&炫技时刻:“歪嘴战神”希罗领衔
-
欢迎大家来到直播吧NBA赛季盘点,历经许多波折,2019-20赛季耗时整整一年才圆满收官。魔幻的一年里有太多的时刻值得我们去铭记,赛场上更是不乏球员们炫技与宣泄情绪的装逼时刻,本期盘点就让我们来回顾一...
- 一手TTS-2语音合成模型安装教程及实际使用
-
语音合成正从云端调用走向本地部署,TTS-2模型作为开源语音生成方案之一,正在被越来越多开发者尝试落地。本篇文章从环境配置到推理调用,详尽拆解TTS-2的安装流程与使用技巧,为语音产品开发者提供...
- 网友晒出身边的巨人 普通人站一旁秒变“霍比特人”
-
当巨人遇到霍比特人,结果就是“最萌身高差”。近日网友们晒出了身边的巨人,和他们站在一起,普通人都变成了“霍比特人”。CanYouTellWho'sRelated?TheDutchGiant...
- 分手后我们还能做朋友吗?_分手后我们还能做朋友吗
-
Fewrelationshipquestionsareaspolarizingaswhetherornotyoushouldstayfriendswithanex.A...
- 如何用C语言实现Shellcode Loader
-
0x01前言之前github找了一个基于go的loader,生成后文件大小6M多,而且细节不够了解,一旦被杀,都不知道改哪里,想来还是要自己写一个loader...
- 微星Z490如何装Windows10系统以及怎么设 BIOS
-
小晨儿今天给大家讲一下msi微星Z490重怎样装系统以及怎么设置BIOS。一、安装前的准备工作1、一、安装前的准备工作1、备份硬盘所有重要的文件(注:GPT分区转化MBR分区时数据会丢失)2...
- 超实用!互联网软件开发人员不可不知的 Git 常用操作命令
-
在互联网软件开发的协作场景中,Git是不可或缺的版本控制工具。掌握其核心命令,能让代码管理效率大幅提升。本文精选Git高频实用命令,结合场景化说明,助你快速上手。仓库初始化与克隆...
- AI项目的持续集成持续部署实践_ai 项目
-
在独立开发AI工具的过程中,笔者逐步实践了一套高效的软件项目持续集成与持续部署(CI/CD)流程。这套流程以Git、GitHub和Vercel为核心,实现了从代码提交到生产环境上线的全链路自动化。这篇...
- 总结几个常用的Git命令的使用方法
-
1、Git的使用越来越广泛现在很多的公司或者机构都在使用Git进行项目和代码的托管,Git有它自身的优势,很多人也喜欢使用Git。...
- 一周热门
- 最近发表
- 标签列表
-
- git pull (33)
- git fetch (35)
- mysql insert (35)
- mysql distinct (37)
- concat_ws (36)
- java continue (36)
- jenkins官网 (37)
- mysql 子查询 (37)
- python元组 (33)
- mybatis 分页 (35)
- vba split (37)
- redis watch (34)
- python list sort (37)
- nvarchar2 (34)
- mysql not null (36)
- hmset (35)
- python telnet (35)
- python readlines() 方法 (36)
- munmap (35)
- docker network create (35)
- redis 集合 (37)
- python sftp (37)
- setpriority (34)
- c语言 switch (34)
- git commit (34)