Skip to content

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 If

HGetAll - 获取所有 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 Sub

2. 购物车

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 Sub

3. 文章元数据

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 Sub

4. 配置管理

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 Sub

5. 在线用户状态

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 Sub

Hash vs String 的选择

场景推荐类型原因
存储单个值String简单高效
存储对象多个字段Hash更节省内存,支持单独字段操作
频繁更新单个字段Hash只更新需要修改的字段
需要批量获取部分字段Hash使用 HMGet 更高效
简单缓存String实现简单

VB6及其LOGO版权为微软公司所有