当前位置: 首页 > news >正文

redis基本数据结构-hash

这里写自定义目录标题

    • 1. redis的数据结构hash
      • 1.1 Hash 数据结构的特点
      • 1.2 常见命令
      • 1.3 适用示例
    • 2. 常见业务场景
      • 2.1 用户信息存储
        • 2.1.1 场景
        • 2.1.2 优势
        • 2.1.3 解决方案
        • 2.1.4 代码实现
      • 2.2 购物车管理
        • 2.2.1 背景
        • 2.2.2 优势
        • 2.2.3 解决方案
        • 2.2.4 代码实现
    • 3. 注意事项:

1. redis的数据结构hash

参考链接:https://mp.weixin.qq.com/s/srkd73bS2n3mjIADLVg72A
Redis 的 Hash 数据结构是一种键值对集合,它非常适合表示对象或实体的属性。每个 Hash 可以存储多个字段,每个字段则对应一个值,这使得 Hash 成为一种高效的存储和查询方式,尤其是在处理对象数据时。

1.1 Hash 数据结构的特点

  • 节省空间: 对于存储多个字段的小对象,Hash 可以节省内存,因为 Redis 会对小的 Hash 结构进行内部优化。
  • 方便操作: 可以单独操作 Hash 中的字段,而不需要序列化整个对象。这个相较于string数据结构而已的显著特点。
  • 快速访问: 通过字段名快速访问对应的值,适合频繁读取和更新的场景。

1.2 常见命令

以下是一些常用的 Redis Hash 命令:
HSET: 设置 Hash 中指定字段的值。
HGET: 获取 Hash 中指定字段的值。
HMSET: 设置多个字段的值。
HMGET: 获取多个字段的值。
HGETALL: 获取 Hash 中所有字段和值。
HDEL: 删除 Hash 中指定字段。
HINCRBY: 对 Hash 中的字段值进行增减。
HEXISTS: 检查 Hash 中是否存在指定字段。

1.3 适用示例

# 创建用户 1000 的 Hash
HSET user:1000 name "Alice" age 30 city "New York"
# 查询用户姓名
HGET user:1000 name
# 返回 "Alice"
# 更新用户城市
HSET user:1000 city "Los Angeles"
# 查询所有用户信息
HGETALL user:1000
# 返回 {"name": "Alice", "age": "30", "city": "Los Angeles"}
# 增加用户年龄
HINCRBY user:1000 age 1
# 查询用户年龄
HGET user:1000 age
# 返回 "31"
# 删除用户年龄字段
HDEL user:1000 age

2. 常见业务场景

  1. 用户信息存储: 在社交网络或电商平台中,每个用户的基本信息(如姓名、地址、年龄等)可以使用 Hash 存储,方便快速读取和更新。
  2. 商品属性管理: 在电商平台中,商品的属性(如名称、价格、库存等)可以存储为 Hash,便于管理和查询。
  3. 会话管理: 在 Web 应用中,可以使用 Hash 来存储用户的会话信息,如登录状态、购物车内容等。
  4. 统计信息: 对于需要频繁更新的统计数据(如访问量、点赞数等),可以使用 Hash 来存储并进行原子性增减操作。
  5. 配置管理: 使用 Hash 存储应用程序的配置项,方便快速修改和读取。

2.1 用户信息存储

2.1.1 场景

在社交网络应用中,每个用户都有一系列属性,如用户名、年龄、兴趣爱好等。使用Hash类型可以方便地存储和查询单个用户的详细信息。

2.1.2 优势
  1. 结构化存储:将用户信息以字段和值的形式存储,易于理解和操作。
  2. 快速读写:Redis的Hash操作提供高速的读写性能。
  3. 灵活更新:可以单独更新用户信息中的某个字段,而无需重新设置整个对象。
2.1.3 解决方案

使用Redis Hash类型来存储和管理用户信息。当用户信息更新时,只更新Hash中的对应字段。
在这里插入图片描述

2.1.4 代码实现
package mainimport ("context""fmt""github.com/go-redis/redis/v8""log"
)var ctx = context.Background()// Redis 客户端初始化
var rdb = redis.NewClient(&redis.Options{Addr:     "",  // Redis 服务器地址Password: "", // 密码DB:       0,                  // 使用默认 DB
})// 存储用户信息到 Redis Hash
func storeUserInfo(userID string, userInfo map[string]interface{}) {hashKey := "user:" + userID// 将用户信息存储到 Redis 的 Hash 中err := rdb.HSet(ctx, hashKey, userInfo).Err()if err != nil {log.Fatalf("Error storing user info: %v", err)}
}// 从 Redis Hash 获取用户信息
func getUserInfo(userID string) map[string]string {hashKey := "user:" + userID// 从 Redis 获取用户信息fields, err := rdb.HGetAll(ctx, hashKey).Result()if err != nil {log.Fatalf("Error getting user info: %v", err)return nil}return fields
}func main() {// 示例用户信息userID := "12345"userInfo := map[string]interface{}{"username":  "john_doe","age":       30,"interests": "coding, hiking, reading",}// 存储用户信息storeUserInfo(userID, userInfo)// 获取并显示用户信息retrievedUserInfo := getUserInfo(userID)fmt.Printf("Retrieved User Info: %+v\n", retrievedUserInfo)
}

在这里插入图片描述

2.2 购物车管理

2.2.1 背景

在电商平台中,用户的购物车需要记录用户选择的商品及其数量。使用Hash类型可以有效地管理每个用户的购物车。

2.2.2 优势
  1. 快速添加和修改:可以快速添加商品到购物车或更新商品数量。
  2. 批量操作:可以一次性获取或更新购物车中的多个商品。
2.2.3 解决方案

使用Redis Hash类型来实现购物车功能,每个用户的购物车作为一个独立的Hash存储。
在这里插入图片描述

2.2.4 代码实现
package mainimport ("context""fmt""github.com/go-redis/redis/v8""log""strconv"
)var ctx = context.Background()// Redis 客户端初始化
var rdb = redis.NewClient(&redis.Options{Addr:     "",  // Redis 服务器地址Password: "", // 密码DB:       0,                  // 使用默认 DB
})// 添加商品到购物车
func addToCart(cartID string, productID string, quantity int) {cartKey := "cart:" + cartID// 使用 HINCRBY 命令增加商品数量err := rdb.HIncrBy(ctx, cartKey, productID, int64(quantity)).Err()if err != nil {log.Fatalf("Error adding to cart: %v", err)}
}// 获取购物车中的商品和数量
func getCart(cartID string) map[string]int {cartKey := "cart:" + cartID// 从 Redis 获取购物车内容items, err := rdb.HGetAll(ctx, cartKey).Result()if err != nil {log.Fatalf("Error getting cart: %v", err)return nil}// 将商品 ID 和数量转换为映射cart := make(map[string]int)for productID, quantity := range items {qty, err := strconv.Atoi(quantity)if err != nil {log.Printf("Error converting quantity for product %s: %v", productID, err)continue}cart[productID] = qty}return cart
}func main() {// 示例购物车 ID 和商品cartID := "user:123:cart"addToCart(cartID, "product:1", 2)addToCart(cartID, "product:2", 3)addToCart(cartID, "product:1", 1) // 增加产品 1 的数量// 获取并显示购物车内容cart := getCart(cartID)fmt.Println("Shopping Cart Contents:")for productID, quantity := range cart {fmt.Printf("Product ID: %s, Quantity: %d\n", productID, quantity)}
}

在这里插入图片描述
也可以根据hash的命令扩展功能。

3. 注意事项:

  • Hash类型的字段值可以是字符串,最大容量为512MB。
  • 在并发环境下,应确保对Hash的操作是线程安全的,可以使用事务或Lua脚本来保证。
  • 存储较大的Hash时,应注意性能和内存使用情况,合理设计数据结构以避免过度膨胀。
  • 定期清理和维护Hash数据,避免数据冗余和失效数据的累积。
    简单用lua脚本的形式:
// 添加商品到购物车(使用 Lua 脚本)
func addToCartWithLua(cartID string, productID string, quantity int) {cartKey := "cart:" + cartID// Lua 脚本:增加购物车中商品的数量   luaScript := `local cartKey = KEYS[1]local productID = ARGV[1]local quantity = tonumber(ARGV[2])return redis.call('HINCRBY', cartKey, productID, quantity)`// 执行 Lua 脚本   _, err := rdb.Eval(ctx, luaScript, []string{cartKey}, productID, quantity).Result()if err != nil {log.Fatalf("Error executing Lua script: %v", err)}
}

相关文章:

redis基本数据结构-hash

这里写自定义目录标题 1. redis的数据结构hash1.1 Hash 数据结构的特点1.2 常见命令1.3 适用示例 2. 常见业务场景2.1 用户信息存储2.1.1 场景2.1.2 优势2.1.3 解决方案2.1.4 代码实现 2.2 购物车管理2.2.1 背景2.2.2 优势2.2.3 解决方案2.2.4 代码实现 3. 注意事项&#xff1a…...

21. 什么是MyBatis中的N+1问题?如何解决?

N1 问题是指在进行一对多查询时,应用程序首先执行一条查询语句获取结果集(即 1),然后针对每一条结果,再执行 N 条额外的查询语句以获取关联数据。这个问题通常出现在 ORM 框架(如 MyBatis 或 Hibernate&…...

天空卫士项目荣获“2024 IDC 中国20大杰出安全项目 ”奖项 ,实力见证安全守护

9月11日, IDC在上海圆满举办安全风险管控峰会,并现场官宣“2024 IDC中国20大杰出安全项目(CSO20) ”和“2024 IDC中国 CSO名人堂 (十大人物) ” 奖项名单。联通软研院申报的联通邮件系统安全合规建设项目被评为“2024 IDC中国20大杰出安全项目(CSO20) ”…...

Android生成Java AIDL

AIDL:Android Interface Definition Language AIDL是为了实现进程间通信而设计的Android接口语言 Android进程间通信有多种方式,Binder机制是其中最常见的一种 AIDL的本质就是基于对Binder的运用从而实现进程间通信 这篇博文从实战出发,用一个尽可能…...

嵌入式数据库sqlite和rocksdb的介绍以及对比

SQLite 和 RocksDB 都是非常流行的嵌入式数据库系统,但它们的设计理念和应用场景有所不同。下面是对这两个数据库系统的详细介绍以及它们之间的主要区别。 SQLite 简介 SQLite 是一个轻量级的关系数据库管理系统,完全由 C 语言编写而成。它以单一文件…...

数据结构之抽象数据类型(c语言版)

抽象数据类型的定义格式如下&#xff1a; ADT 抽象数据类型名{数据对象&#xff1a;<数据对象的定义>数据关系&#xff1a;<数据关系的定义>基本操作&#xff1a;<基本操作的定义> }ADT 抽象数据类型名 下面以复数为例给出完整的抽象数据类型的定义 ADT C…...

《ChatTTS一键安装详细教程》

ChatTTS 属于一种依托深度学习的文本转语音技术&#xff0c;能够把文本内容转换成自然且流畅&#xff0c;宛如真人发声的语音。ChatTTS 可以更出色地领会&#xff0c;理解文本所蕴含的情感、语调和语义&#xff0c;进而在语音输出时展现出更为精准和鲜活的各种情感。借助对大规…...

物联网之ESP32配网方式、蓝牙、WiFi

MENU 前言SmartConfig(智能配网)AP模式(Access Point模式)蓝牙配网Web Server模式WPS配网(Wi-Fi Protected Setup)Provisioning(配网服务)静态配置(硬编码)总结 前言 ESP32配网(Wi-Fi配置)的方式有多种&#xff0c;每种方式都有各自的优缺点。 根据具体项目需求&#xff0c;可以…...

golang 字符串浅析

go的字符串是只读的 测试源代码 package mainimport ("fmt""unsafe" )func swap(x, y string) (string, string) {return y, x }func print_string(obj *string, msg string) {string_ptr : (*[2]uintptr)(unsafe.Pointer(obj))first_obj_addr : string_…...

jantic/DeOldify部署(图片上色)附带Dockerfile和镜像

1. 克隆代码到DeOldify git clone https://github.com/jantic/DeOldify.git DeOldifyDeOldify源码 2. 安装依赖 这里会安装python以及创建deoldify环境 cd DeOldify conda env create -f environment.yml(base) rootDESKTOP-1FOD6A8:~/DeOldify# conda env create -f environm…...

2024年9月9日--9月15日(freex源码抄写+ue5肉鸽视频一节调节)

现在以工作为中心&#xff0c;其他可以不做硬性要求。周一到周四&#xff0c;晚上每天300行freex源码抄写&#xff0c;周六日每天1000行。每周3200行&#xff0c;每天完成该完成的即可&#xff0c;早上有时间时进行一小节独立游戏相关的视频教程作为调节即可&#xff0c;不影响…...

CLIP官方github代码详解

系列文章目录 文章目录 系列文章目录一、Usage1、conda install --yes -c pytorch pytorch1.7.1 torchvision cudatoolkit11.02、代码3、 二、1、2、3、 三、1、2、3、 四、1、2、3、 五、1、2、3、 六、1、2、3、 七、1、2、3、 八、1、2、3、 一、Usage 1、conda install --…...

ElementUI 布局——行与列的灵活运用

ElementUI 布局——行与列的灵活运用 一 . 使用 Layout 组件1.1 注册路由1.2 使用 Layout 组件 二 . 行属性2.1 栅格的间隔2.2 自定义元素标签 三 . 列属性3.1 列的偏移3.2 列的移动 在现代网页设计中&#xff0c;布局是构建用户界面的基石。Element UI 框架通过其强大的 <e…...

Docker快速部署Apache Guacamole

Docker快速部署Apache Guacamole ,实现远程访问 git clone "https://github.com/boschkundendienst/guacamole-docker-compose.git" cd guacamole-docker-compose ./prepare.sh docker-compose up -dhttps://IP地址:8443/ 用户名:guacadmin 密码:guacadmin docker …...

C++学习笔记----7、使用类与对象获得高性能(一)---- 书写类(1)

1、表格处理程序示例 表格处理程序是一个二维的“细胞”网格&#xff0c;每个格子包含了一个数字或者字符串。专业的表格处理程序比如微软的Excel提供了执行数学运算的能力&#xff0c;比如计算格子中的值的和。表格处理程序示例无意挑战微软的市场地位&#xff0c;但是对于演示…...

es6中set和map的区别

在ES6&#xff08;ECMAScript 2015&#xff09;中&#xff0c;Set 和 Map 是两种新的集合类型&#xff0c;它们提供了更高级的数据结构来存储唯一值或键值对集合。尽管它们在功能上有些相似&#xff0c;但它们在用途和内部机制上存在一些关键区别。 1. 基本概念 Set&#xff1…...

高级实时通信:基于 Python 的 WebSocket 实现与异步推送解决方案

高级实时通信&#xff1a;基于 Python 的 WebSocket 实现与异步推送解决方案 目录 &#x1f7e2; WebSocket 协议概述&#x1f535; 在 FastAPI 中实现 WebSocket&#x1f7e3; Django Channels 实现异步实时通信&#x1f534; 使用 Redis 实现实时推送 &#x1f7e2; 1. WebS…...

大二上学期详细学习计划

本学习完成目标&#xff1a; 项目&#xff1a; 书籍&#xff1a;《mysql必知必会》《java核心技术卷》&#xff08;暂时&#xff09;加强JavaSE的学习&#xff0c;掌握Java核心Mysqlsql&#xff08;把牛客上的那50道sql语句题写完&#xff09;gitmaven完成springboot项目&…...

Kafka【十四】生产者发送消息时的消息分区策略

【1】分区策略 Kafka中Topic是对数据逻辑上的分类&#xff0c;而Partition才是数据真正存储的物理位置。所以在生产数据时&#xff0c;如果只是指定Topic的名称&#xff0c;其实Kafka是不知道将数据发送到哪一个Broker节点的。我们可以在构建数据传递Topic参数的同时&#xff…...

SQL优化:执行计划详细分析

视频讲解&#xff1a;SQL优化&#xff1a;SQL执行计划详细分析_哔哩哔哩_bilibili 1.1 执行计划详解 id select_type table partitions type possible_keys key key_len ref rows filtered Extra 1.1.1 ID 【概…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生&#xff0c;我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要&#xff0c;而您认真负责的教学态度&#xff0c;让课程的每一部分都充满了实用价值。 尤其让我…...

深度学习习题2

1.如果增加神经网络的宽度&#xff0c;精确度会增加到一个特定阈值后&#xff0c;便开始降低。造成这一现象的可能原因是什么&#xff1f; A、即使增加卷积核的数量&#xff0c;只有少部分的核会被用作预测 B、当卷积核数量增加时&#xff0c;神经网络的预测能力会降低 C、当卷…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版

7种色调职场工作汇报PPT&#xff0c;橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版&#xff1a;职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

DingDing机器人群消息推送

文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人&#xff0c;点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置&#xff0c;详见说明文档 成功后&#xff0c;记录Webhook 2 API文档说明 点击设置说明 查看自…...