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

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 main

import (
    "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 main

import (
    "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)
    }
}

http://www.kler.cn/a/301342.html

相关文章:

  • 4.STM32之通信接口《精讲》之USART通信---实验串口发送程序
  • WebSocket实战,后台修改订单状态,前台实现数据变更,提供前端和后端多种语言
  • 3. langgraph中的react agent使用 (在react agent添加系统提示)
  • UNI-APP小程序答题功能开发(左右滑动,判断,填空,问答,答题卡,纠错,做题倒计时等)
  • ubuntu 安装kafka-eagle
  • MySQL中Flashback(闪回)技术
  • 数据分析-11-时间序列分析的概念任务和主要方法
  • 第R2周:LSTM-火灾温度预测
  • C语言——希尔排序
  • Qt什么时候触发paintEvent事件
  • 【论文笔记】NDT: Neural Data Transformers (NBDT, 2022)
  • 一些深度学习相关指令
  • 【Qt】按钮样式--按钮内部布局(调整按钮文本和图标放置在任意位置)
  • 上海亚商投顾:沪指探底回升 华为产业链午后爆发
  • 【深度学习讲解笔记】第1章-机器学习基础(3)
  • Oracle Data Guard:Oracle数据库的高可用性和灾难恢复解决方案
  • 最近试用了FunHPC-AI宝箱-ComfyUI-Plus,使用了dreamshaperXL全能模型,生成了几张国风图,效果真的让人惊叹!
  • 安装MongoDB
  • 企业数字化转型、建设和升级面临的主要难题和解决之道(2)
  • 【机器学习】模型性能与可解释性的矛盾以及如何提高可解释性和模型性能
  • Java设计模式之命令模式介绍和案例示范
  • Chainlit集成Langchain并使用通义千问实现文生图网页应用
  • 20240912日报
  • Unity界面、组件以及脚本
  • 【人工智能学习笔记】4_1 深度学习基础之深度学习概述
  • 【区块链通用服务平台及组件】数字城市元宇宙平台 | FISCO BCOS应用案例