Hash 操作
Redis Hash 是一个键值对集合,适合存储对象。每个 Hash 可以包含多个字段-值对。
HSet - 设置 Hash 字段
设置单个字段
vb
oRedis.HSet "user:1", "name", "张三"
oRedis.HSet "user:1", "age", "25"
oRedis.HSet "user:1", "email", "zhangsan@example.com"批量设置字段
vb
oRedis.HSet "user:1", "name", "李四"
oRedis.HSet "user:1", "age", "30"
oRedis.HSet "user:1", "city", "上海"
oRedis.HSet "user:1", "email", "lisi@example.com"HGet - 获取 Hash 字段
vb
Dim sValue As String
sValue = oRedis.HGet("user:1", "name")
Debug.Print sValue ' 输出: 张三HMGet - 批量获取 Hash 字段
vb
' 批量获取字段
Dim vValues As Variant
vValues = oRedis.HMGet("user:1", "name", "age", "email")
If IsArray(vValues) Then
Dim i As Long
For i = 0 To UBound(vValues)
Debug.Print vValues(i)
Next
End IfHGetAll - 获取所有 Hash 字段
获取 Hash 中所有字段和值,返回 Scripting.Dictionary 对象:
vb
' 获取所有字段和值
Dim oDict As Scripting.Dictionary
Set oDict = oRedis.HGetAll("user:1")
' 遍历字典
Dim vKey As Variant
For Each vKey In oDict.Keys
Debug.Print vKey & ": " & oDict(vKey)
Next返回值类型: Scripting.Dictionary
注意: 使用前需要添加对 "Microsoft Scripting Runtime" 的引用。
HDel - 删除 Hash 字段
vb
' 删除单个字段
oRedis.HDel "user:1", "email"
' 删除多个字段
oRedis.HDel "user:1", "age", "email"HExists - 检查 Hash 字段是否存在
vb
If oRedis.HExists("user:1", "name") Then
Debug.Print "字段存在"
Else
Debug.Print "字段不存在"
End If应用场景
1. 用户信息存储
vb
Sub StoreUserInfo()
Dim oRedis As New cRedisClient
If Not oRedis.Connect() Then Exit Sub
Dim lUserId As Long
lUserId = 1001
' 存储用户信息
oRedis.HSet "user:" & lUserId, "name", "张三"
oRedis.HSet "user:" & lUserId, "age", "25"
oRedis.HSet "user:" & lUserId, "email", "zhangsan@example.com"
oRedis.HSet "user:" & lUserId, "phone", "13800138000"
oRedis.HSet "user:" & lUserId, "city", "北京"
' 获取用户姓名
Debug.Print "用户姓名: " & oRedis.HGet("user:" & lUserId, "name")
' 获取用户邮箱
Debug.Print "用户邮箱: " & oRedis.HGet("user:" & lUserId, "email")
' 获取所有用户信息
Dim oDict As Scripting.Dictionary
Set oDict = oRedis.HGetAll("user:" & lUserId)
Debug.Print vbCrLf & "用户详细信息:"
Dim vKey As Variant
For Each vKey In oDict.Keys
Debug.Print " " & vKey & ": " & oDict(vKey)
Next
oRedis.DisConnect
End Sub2. 购物车
vb
Sub ShoppingCart()
Dim oRedis As New cRedisClient
If Not oRedis.Connect() Then Exit Sub
Dim sUserId As String
sUserId = "cart:user123"
' 添加商品到购物车
oRedis.HSet sUserId, "product:1001", "2" ' 商品ID: 数量
oRedis.HSet sUserId, "product:1002", "1"
oRedis.HSet sUserId, "product:1003", "3"
' 获取购物车中某商品的数量
Debug.Print "商品 1001 的数量: " & oRedis.HGet(sUserId, "product:1001")
' 更新商品数量
oRedis.HSet sUserId, "product:1001", "5"
' 获取购物车中所有商品
Dim oCart As Scripting.Dictionary
Set oCart = oRedis.HGetAll(sUserId)
Debug.Print vbCrLf & "购物车内容:"
Dim vProductId As Variant
Dim lTotal As Long
lTotal = 0
For Each vProductId In oCart.Keys
Dim lCount As Long
lCount = CLng(oCart(vProductId))
Debug.Print " " & vProductId & ": " & lCount & " 件"
lTotal = lTotal + lCount
Next
Debug.Print "总件数: " & lTotal
' 从购物车删除商品
oRedis.HDel sUserId, "product:1002"
oRedis.DisConnect
End Sub3. 文章元数据
vb
Sub ArticleMetadata()
Dim oRedis As New cRedisClient
If Not oRedis.Connect() Then Exit Sub
Dim sArticleId As String
sArticleId = "article:12345"
' 存储文章元数据
oRedis.HSet sArticleId, "title", "Redis 入门教程"
oRedis.HSet sArticleId, "author", "张三"
oRedis.HSet sArticleId, "views", "1000"
oRedis.HSet sArticleId, "likes", "50"
oRedis.HSet sArticleId, "comments", "20"
oRedis.HSet sArticleId, "created_at", "2024-01-01"
' 获取文章标题
Debug.Print "文章标题: " & oRedis.HGet(sArticleId, "title")
' 获取作者和浏览数
Dim vInfo As Variant
vInfo = oRedis.HMGet(sArticleId, "author", "views")
If IsArray(vInfo) Then
Debug.Print "作者: " & vInfo(0)
Debug.Print "浏览数: " & vInfo(1)
End If
' 增加浏览数
Dim lViews As Long
lViews = CLng(oRedis.HGet(sArticleId, "views"))
oRedis.HSet sArticleId, "views", CStr(lViews + 1)
Debug.Print "更新后浏览数: " & oRedis.HGet(sArticleId, "views")
' 检查文章是否有评论
If oRedis.HExists(sArticleId, "comments") Then
Debug.Print "评论数: " & oRedis.HGet(sArticleId, "comments")
End If
oRedis.DisConnect
End Sub4. 配置管理
vb
Sub ConfigManager()
Dim oRedis As New cRedisClient
If Not oRedis.Connect() Then Exit Sub
Dim sConfigKey As String
sConfigKey = "config:app"
' 加载配置
oRedis.HSet sConfigKey, "appname", "MyApp"
oRedis.HSet sConfigKey, "version", "1.0.0"
oRedis.HSet sConfigKey, "debug", "false"
oRedis.HSet sConfigKey, "timeout", "30"
oRedis.HSet sConfigKey, "max_users", "1000"
' 获取单个配置
Debug.Print "应用名称: " & oRedis.HGet(sConfigKey, "appname")
' 批量获取配置
Dim vConfigs As Variant
vConfigs = oRedis.HMGet(sConfigKey, "debug", "timeout")
If IsArray(vConfigs) Then
Debug.Print "调试模式: " & vConfigs(0)
Debug.Print "超时时间: " & vConfigs(1) & " 秒"
End If
' 更新配置
oRedis.HSet sConfigKey, "debug", "true"
oRedis.HSet sConfigKey, "version", "1.1.0"
' 获取所有配置
Dim oAllConfig As Scripting.Dictionary
Set oAllConfig = oRedis.HGetAll(sConfigKey)
Debug.Print vbCrLf & "所有配置:"
Dim vKey As Variant
For Each vKey In oAllConfig.Keys
Debug.Print " " & vKey & " = " & oAllConfig(vKey)
Next
oRedis.DisConnect
End Sub5. 在线用户状态
vb
Sub OnlineUserStatus()
Dim oRedis As New cRedisClient
If Not oRedis.Connect() Then Exit Sub
Dim sUserId As String
sUserId = "user:123"
' 更新用户在线状态
oRedis.HSet sUserId, "status", "online"
oRedis.HSet sUserId, "last_seen", CStr(Now())
oRedis.HSet sUserId, "ip", "192.168.1.100"
' 检查用户是否在线
Dim sStatus As String
sStatus = oRedis.HGet(sUserId, "status")
Debug.Print "用户状态: " & sStatus
' 获取用户最后活跃时间
Debug.Print "最后活跃: " & oRedis.HGet(sUserId, "last_seen")
' 用户下线
oRedis.HSet sUserId, "status", "offline"
oRedis.DisConnect
End Sub完整示例
vb
Sub Example_HashOperations()
Dim oRedis As New cRedisClient
If Not oRedis.Connect() Then
Debug.Print "连接失败: " & oRedis.LastError
Exit Sub
End If
' 设置用户信息
oRedis.HSet "user:1001", "name", "李四"
oRedis.HSet "user:1001", "age", "30"
oRedis.HSet "user:1001", "city", "上海"
oRedis.HSet "user:1001", "email", "lisi@example.com"
' 获取单个字段
Debug.Print "用户姓名: " & oRedis.HGet("user:1001", "name")
' 获取所有字段
Dim oDict As Scripting.Dictionary
Set oDict = oRedis.HGetAll("user:1001")
Debug.Print vbCrLf & "用户详细信息:"
Dim vKey As Variant
For Each vKey In oDict.Keys
Debug.Print " " & vKey & ": " & oDict(vKey)
Next
' 检查字段是否存在
If oRedis.HExists("user:1001", "name") Then
Debug.Print vbCrLf & "姓名字段存在"
End If
' 删除字段
oRedis.HDel "user:1001", "email"
Debug.Print "已删除邮箱字段"
oRedis.DisConnect
End SubHash vs String 的选择
| 场景 | 推荐类型 | 原因 |
|---|---|---|
| 存储单个值 | String | 简单高效 |
| 存储对象多个字段 | Hash | 更节省内存,支持单独字段操作 |
| 频繁更新单个字段 | Hash | 只更新需要修改的字段 |
| 需要批量获取部分字段 | Hash | 使用 HMGet 更高效 |
| 简单缓存 | String | 实现简单 |