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

Redis系列-数据类型hash(redis数据类型对应的数据结构)

mhr18 2024-11-14 16:25 21 浏览 0 评论

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

相关推荐

一文读懂Prometheus架构监控(prometheus监控哪些指标)

介绍Prometheus是一个系统监控和警报工具包。它是用Go编写的,由Soundcloud构建,并于2016年作为继Kubernetes之后的第二个托管项目加入云原生计算基金会(C...

Spring Boot 3.x 新特性详解:从基础到高级实战

1.SpringBoot3.x简介与核心特性1.1SpringBoot3.x新特性概览SpringBoot3.x是建立在SpringFramework6.0基础上的重大版...

「技术分享」猪八戒基于Quartz分布式调度平台实践

点击原文:【技术分享】猪八戒基于Quartz分布式调度平台实践点击关注“八戒技术团队”,阅读更多技术干货1.背景介绍1.1业务场景调度任务是我们日常开发中非常经典的一个场景,我们时常会需要用到一些不...

14. 常用框架与工具(使用的框架)

本章深入解析Go生态中的核心开发框架与工具链,结合性能调优与工程化实践,提供高效开发方案。14.1Web框架(Gin,Echo)14.1.1Gin高性能实践//中间件链优化router:=...

SpringBoot整合MyBatis-Plus:从入门到精通

一、MyBatis-Plus基础介绍1.1MyBatis-Plus核心概念MyBatis-Plus(简称MP)是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提...

Seata源码—5.全局事务的创建与返回处理

大纲1.Seata开启分布式事务的流程总结2.Seata生成全局事务ID的雪花算法源码3.生成xid以及对全局事务会话进行持久化的源码4.全局事务会话数据持久化的实现源码5.SeataServer创...

Java开发200+个学习知识路线-史上最全(框架篇)

1.Spring框架深入SpringIOC容器:BeanFactory与ApplicationContextBean生命周期:实例化、属性填充、初始化、销毁依赖注入方式:构造器注入、Setter注...

OpenResty 入门指南:从基础到动态路由实战

一、引言1.1OpenResty简介OpenResty是一款基于Nginx的高性能Web平台,通过集成Lua脚本和丰富的模块,将Nginx从静态反向代理转变为可动态编程的应用平台...

你还在为 Spring Boot3 分布式锁实现发愁?一文教你轻松搞定!

作为互联网大厂后端开发人员,在项目开发过程中,你有没有遇到过这样的问题:多个服务实例同时访问共享资源,导致数据不一致、业务逻辑混乱?没错,这就是分布式环境下常见的并发问题,而分布式锁就是解决这类问题的...

近2万字详解JAVA NIO2文件操作,过瘾

原创:小姐姐味道(微信公众号ID:xjjdog),欢迎分享,转载请保留出处。从classpath中读取过文件的人,都知道需要写一些读取流的方法,很是繁琐。最近使用IDEA在打出.这个符号的时候,一行代...

学习MVC之租房网站(十二)-缓存和静态页面

在上一篇<学习MVC之租房网站(十一)-定时任务和云存储>学习了Quartz的使用、发邮件,并将通过UEditor上传的图片保存到云存储。在项目的最后,再学习优化网站性能的一些技术:缓存和...

Linux系统下运行c++程序(linux怎么运行c++文件)

引言为什么要在Linux下写程序?需要更多关于Linux下c++开发的资料请后台私信【架构】获取分享资料包括:C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,fastdf...

2022正确的java学习顺序(文末送java福利)

对于刚学习java的人来说,可能最大的问题是不知道学习方向,每天学了什么第二天就忘了,而课堂的讲解也是很片面的。今天我结合我的学习路线为大家讲解下最基础的学习路线,真心希望能帮到迷茫的小伙伴。(有很多...

一个 3 年 Java 程序员 5 家大厂的面试总结(已拿Offer)

前言15年毕业到现在也近三年了,最近面试了阿里集团(菜鸟网络,蚂蚁金服),网易,滴滴,点我达,最终收到点我达,网易offer,蚂蚁金服二面挂掉,菜鸟网络一个月了还在流程中...最终有幸去了网易。但是要...

多商户商城系统开发全流程解析(多商户商城源码免费下载)

在数字化商业浪潮中,多商户商城系统成为众多企业拓展电商业务的关键选择。这类系统允许众多商家在同一平台销售商品,不仅丰富了商品种类,还为消费者带来更多样的购物体验。不过,开发一个多商户商城系统是个复杂的...

取消回复欢迎 发表评论: