百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

Redis系列-数据类型hash(redis里面的hash数据结构是用什么实现的)

wptr33 2025-07-19 23:05 4 浏览

电商在如今的生活中可是说到处可见,拼团买,限时抢购,提前加购有优惠等等的营销方式层出不穷。但你有没有想过怎么可以用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的各种操作的。大家自己动手亲自实践一下会印象更深。有任何问题可以私信我或在下方发表评论。

相关推荐

面试官:MySQL的自增ID用完了,怎么办?

来自:Java技术驿站既然这块知识点不清楚,那回头就自己动手实践下。首先,创建一个最简单的表,只包含一个自增id,并插入一条数据。create table t0(id i...

SQL 开发必学:深度解析 NULL 值处理的 6 大核心规则与避坑指南

在数据库开发中,NULL值处理是极易引发逻辑错误的技术难点。本文从SQL标准规范出发,系统梳理NULL值的底层逻辑与工程实践要点,帮助开发者建立完整的NULL值处理知识体系。一、三值逻辑...

SQL查找是否"存在",别再用count了

根据某一条件从数据库表中查询『有』与『没有』,只有两种状态,那为什么在写SQL的时候,还要SELECTCOUNT(*)呢?无论是刚入道的程序员新星,还是精湛沙场多年的程序员老白,都是一如既往...

一文带你掌握shell脚本中的if条件语句,轻松搞定工作需求

#shell编程##linux#...

一文搞懂MySQL的左、右、内、外连接

一、前言1、MySQL中的左连接...

性能测试:Mysql中的空值陷阱(mysql中空值怎么表示)

SQL是一种声明式的语言,我们只需要描述想要的结果(WHAT),而不关心数据库如何实现(HOW);虽然SQL比较容易学习,但是仍然有一些容易混淆和出错的概念。今天我们就来说说SQL中的空值陷阱...

MySQL--常用函数(MySQL常用函数汇总)

介绍MySQL函数,是一种控制流程函数,属于数据库用语言。MySQL数据库中提供了很丰富的函数。MySQL函数包括数学函数、字符串函数、日期和时间函数、条件判断函数、系统信息函数、加密函数、格式化函数...

MySQL函数详解:IF()、IFNULL()、NULLIF()、ISNULL()、CASE

2025年3月27日,MySQL作为最流行的关系型数据库管理系统之一,其丰富的函数库为开发者提供了强大的数据处理能力。本文将详细解析MySQL中常用的条件判断函数:IF()、IFNULL()、NULL...

java迭代器iterator(java迭代器iterator增加一条记录)

/***iterator迭代器Collection接口继承了Iterable接口iterable可迭代的在Iterable接口中定义了iterator()方法用于生成迭代器...

说说Redis的数据类型(redis中的数据类型)

一句话总结Redis核心数据类型包括:String:存储文本、数字或二进制数据。List:双向链表,支持队列和栈操作。Hash:字段-值映射,适合存储对象。Set:无序唯一集合,支持交并差运算。...

一网打尽-HashMap面试题(hashmap数据结构面试)

全文4896字。读完五分钟,即可获得HashMap理解全部面经和原理。坚持就是胜利1、实现原理...

本地缓存GuavaCache(一)(本地缓存caffeine)

在并发量、吞吐量越来越大的情况下往往是离不开缓存的,使用缓存能减轻数据库的压力,临时存储数据。根据不同的场景选择不同的缓存,分布式缓存有Redis,Memcached、Tair、EVCache、Aer...

想月薪过万吗?计算机安卓开发之"集合"

集合的总结:/***Collection*List(存取有序,有索引,可以重复)*ArrayList*底层是数组实现的,线程不安全,查找和修改快,增和删比较慢...

Spring Boot 控制 Controller 接口的4种方式,哪种更适合你?

环境:SpringBoot3.4.2...

这些Java基础知识,诸佬们都还记得嘛(学习,复习,面试均可)

方法重载和方法重写的区别方法重写重写体现在继承关系上。在Java中,子类继承父类,子类就会具备父类所以的特征,以及父类的方法和变量比如动物类有“叫”的方法,小狗小猫分别继承了动物类,重写方法时就可以...