当前位置: 首页 > 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)}
}
http://www.lryc.cn/news/437061.html

相关文章:

  • 21. 什么是MyBatis中的N+1问题?如何解决?
  • 天空卫士项目荣获“2024 IDC 中国20大杰出安全项目 ”奖项 ,实力见证安全守护
  • Android生成Java AIDL
  • 嵌入式数据库sqlite和rocksdb的介绍以及对比
  • 数据结构之抽象数据类型(c语言版)
  • 《ChatTTS一键安装详细教程》
  • 物联网之ESP32配网方式、蓝牙、WiFi
  • golang 字符串浅析
  • jantic/DeOldify部署(图片上色)附带Dockerfile和镜像
  • 2024年9月9日--9月15日(freex源码抄写+ue5肉鸽视频一节调节)
  • CLIP官方github代码详解
  • ElementUI 布局——行与列的灵活运用
  • Docker快速部署Apache Guacamole
  • C++学习笔记----7、使用类与对象获得高性能(一)---- 书写类(1)
  • es6中set和map的区别
  • 高级实时通信:基于 Python 的 WebSocket 实现与异步推送解决方案
  • 大二上学期详细学习计划
  • Kafka【十四】生产者发送消息时的消息分区策略
  • SQL优化:执行计划详细分析
  • Android Studio -> Android Studio 获取release模式和debug模式的APK
  • 基于 SpringBoot 的实习管理系统
  • vmware workstation 17 linux版
  • Windows环境本地部署Oracle 19c及卸载实操手册
  • MapStruct介绍
  • 35天学习小结
  • 【iOS】UIViewController的生命周期
  • ELK在Linux服务器下使用docker快速部署(超详细)
  • unity导入半透明webm + AE合成半透明视频
  • 力扣: 四数相加II
  • 径向基函数神经网络RBFNN案例实操