Skip to content

Set 操作

Redis Set 是无序的字符串集合,不允许重复元素。适合存储唯一值。

SAdd - 添加集合成员

添加单个成员

vb
oRedis.SAdd "myset", "apple"

添加多个成员

vb
oRedis.SAdd "myset", "banana", "orange", "grape"

注意: 集合会自动去重,重复添加相同元素只会保留一个。

SMembers - 获取所有集合成员

vb
' 获取所有成员
Dim vMembers As Variant
vMembers = oRedis.SMembers("myset")

If IsArray(vMembers) Then
    Dim i As Long
    For i = 0 To UBound(vMembers)
        Debug.Print vMembers(i)
    Next
End If

SCard - 获取集合成员数量

vb
Dim lCount As Long
lCount = oRedis.SCard("myset")
Debug.Print "集合成员数: " & lCount

SIsMember - 检查成员是否存在

vb
If oRedis.SIsMember("myset", "apple") Then
    Debug.Print "成员存在"
Else
    Debug.Print "成员不存在"
End If

SRem - 删除集合成员

vb
' 删除单个成员
oRedis.SRem "myset", "apple"

' 删除多个成员
oRedis.SRem "myset", "banana", "orange"

应用场景

1. 文章标签

vb
Sub ArticleTags()
    Dim oRedis As New cRedisClient

    If Not oRedis.Connect() Then Exit Sub

    Dim sArticleId As String
    sArticleId = "post:1:tags"

    ' 添加标签
    oRedis.SAdd sArticleId, "技术", "编程", "Redis", "VB6", "数据库"

    ' 检查标签数量
    Debug.Print "文章标签数: " & oRedis.SCard(sArticleId)

    ' 检查特定标签是否存在
    If oRedis.SIsMember(sArticleId, "Redis") Then
        Debug.Print "这篇文章包含 Redis 标签"
    End If

    ' 获取所有标签
    Dim vTags As Variant
    vTags = oRedis.SMembers(sArticleId)

    Debug.Print vbCrLf & "所有标签:"
    Dim i As Long
    If IsArray(vTags) Then
        For i = 0 To UBound(vTags)
            Debug.Print "  - " & vTags(i)
        Next
    End If

    ' 删除某个标签
    oRedis.SRem sArticleId, "VB6"
    Debug.Print vbCrLf & "删除标签后,剩余标签数: " & oRedis.SCard(sArticleId)

    oRedis.DisConnect
End Sub

2. 用户关注

vb
Sub UserFollowers()
    Dim oRedis As New cRedisClient

    If Not oRedis.Connect() Then Exit Sub

    Dim sUserId As String
    sUserId = "user:123"

    ' 用户关注的人
    oRedis.SAdd sUserId & ":following", "user:456", "user:789", "user:101"

    ' 关注用户的人
    oRedis.SAdd sUserId & ":followers", "user:200", "user:300", "user:400"

    ' 检查是否关注了某用户
    If oRedis.SIsMember(sUserId & ":following", "user:456") Then
        Debug.Print "已关注用户 456"
    End If

    ' 获取关注列表
    Dim vFollowing As Variant
    vFollowing = oRedis.SMembers(sUserId & ":following")

    Debug.Print vbCrLf & "关注列表:"
    Dim i As Long
    If IsArray(vFollowing) Then
        For i = 0 To UBound(vFollowing)
            Debug.Print "  " & vFollowing(i)
        Next
    End If

    ' 获取粉丝数
    Debug.Print vbCrLf & "粉丝数: " & oRedis.SCard(sUserId & ":followers")

    ' 取消关注
    oRedis.SRem sUserId & ":following", "user:789"
    Debug.Print "取消关注后,关注数: " & oRedis.SCard(sUserId & ":following")

    oRedis.DisConnect
End Sub

3. 在线用户

vb
Sub OnlineUsers()
    Dim oRedis As New cRedisClient

    If Not oRedis.Connect() Then Exit Sub

    Dim sOnlineSet As String
    sOnlineSet = "users:online"

    ' 用户上线
    oRedis.SAdd sOnlineSet, "user:1001", "user:1002", "user:1003", "user:1004"

    ' 获取在线用户数
    Debug.Print "在线用户数: " & oRedis.SCard(sOnlineSet)

    ' 检查某用户是否在线
    If oRedis.SIsMember(sOnlineSet, "user:1001") Then
        Debug.Print "用户 1001 在线"
    End If

    ' 获取所有在线用户
    Dim vUsers As Variant
    vUsers = oRedis.SMembers(sOnlineSet)

    Debug.Print vbCrLf & "在线用户列表:"
    Dim i As Long
    If IsArray(vUsers) Then
        For i = 0 To UBound(vUsers)
            Debug.Print "  " & vUsers(i)
        Next
    End If

    ' 用户下线
    oRedis.SRem sOnlineSet, "user:1002"
    Debug.Print vbCrLf & "用户 1002 下线,在线用户数: " & oRedis.SCard(sOnlineSet)

    oRedis.DisConnect
End Sub

4. IP 黑名单

vb
Sub IpBlacklist()
    Dim oRedis As New cRedisClient

    If Not oRedis.Connect() Then Exit Sub

    Dim sBlacklist As String
    sBlacklist = "security:blacklist"

    ' 添加 IP 到黑名单
    oRedis.SAdd sBlacklist, "192.168.1.100"
    oRedis.SAdd sBlacklist, "192.168.1.101"
    oRedis.SAdd sBlacklist, "192.168.1.102"

    ' 检查 IP 是否在黑名单中
    Dim sCheckIp As String
    sCheckIp = "192.168.1.100"

    If oRedis.SIsMember(sBlacklist, sCheckIp) Then
        Debug.Print "IP " & sCheckIp & " 在黑名单中,拒绝访问"
    Else
        Debug.Print "IP " & sCheckIp & " 可以访问"
    End If

    ' 获取黑名单中的所有 IP
    Dim vIps As Variant
    vIps = oRedis.SMembers(sBlacklist)

    Debug.Print vbCrLf & "黑名单中的 IP:"
    Dim i As Long
    If IsArray(vIps) Then
        For i = 0 To UBound(vIps)
            Debug.Print "  " & vIps(i)
        Next
    End If

    ' 从黑名单移除 IP
    oRedis.SRem sBlacklist, "192.168.1.101"
    Debug.Print vbCrLf & "已将 192.168.1.101 从黑名单移除"

    oRedis.DisConnect
End Sub

5. 唯一访客统计

vb
Sub UniqueVisitors()
    Dim oRedis As New cRedisClient

    If Not oRedis.Connect() Then Exit Sub

    Dim sDate As String
    sDate = "2024-01-01"
    Dim sVisitorKey As String
    sVisitorKey = "stats:visitors:" & sDate

    ' 记录访客 ID
    oRedis.SAdd sVisitorKey, "visitor:001"
    oRedis.SAdd sVisitorKey, "visitor:002"
    oRedis.SAdd sVisitorKey, "visitor:003"

    ' 同一访客再次访问(不会重复计数)
    oRedis.SAdd sVisitorKey, "visitor:001"
    oRedis.SAdd sVisitorKey, "visitor:002"

    ' 获取当日唯一访客数
    Debug.Print sDate & " 的唯一访客数: " & oRedis.SCard(sVisitorKey)

    ' 获取所有访客 ID
    Dim vVisitors As Variant
    vVisitors = oRedis.SMembers(sVisitorKey)

    Debug.Print vbCrLf & "访客列表:"
    Dim i As Long
    If IsArray(vVisitors) Then
        For i = 0 To UBound(vVisitors)
            Debug.Print "  " & vVisitors(i)
        Next
    End If

    oRedis.DisConnect
End Sub

6. 收藏夹

vb
Sub Bookmarks()
    Dim oRedis As New cRedisClient

    If Not oRedis.Connect() Then Exit Sub

    Dim sUserId As String
    sUserId = "user:123"
    Dim sBookmarksKey As String
    sBookmarksKey = sUserId & ":bookmarks"

    ' 添加收藏
    oRedis.SAdd sBookmarksKey, "article:1"
    oRedis.SAdd sBookmarksKey, "article:2"
    oRedis.SAdd sBookmarksKey, "article:3"

    ' 检查文章是否已收藏
    If oRedis.SIsMember(sBookmarksKey, "article:1") Then
        Debug.Print "文章 1 已收藏"
    End If

    ' 获取收藏数
    Debug.Print "收藏数: " & oRedis.SCard(sBookmarksKey)

    ' 获取所有收藏
    Dim vBookmarks As Variant
    vBookmarks = oRedis.SMembers(sBookmarksKey)

    Debug.Print vbCrLf & "收藏列表:"
    Dim i As Long
    If IsArray(vBookmarks) Then
        For i = 0 To UBound(vBookmarks)
            Debug.Print "  " & vBookmarks(i)
        Next
    End If

    ' 取消收藏
    oRedis.SRem sBookmarksKey, "article:2"
    Debug.Print vbCrLf & "取消收藏后,剩余收藏数: " & oRedis.SCard(sBookmarksKey)

    oRedis.DisConnect
End Sub

完整示例

vb
Sub Example_SetOperations()
    Dim oRedis As New cRedisClient

    If Not oRedis.Connect() Then
        Debug.Print "连接失败: " & oRedis.LastError
        Exit Sub
    End If

    ' 使用 Set 存储标签
    oRedis.SAdd "post:1:tags", "技术", "编程", "Redis", "VB6"

    Debug.Print "文章标签数: " & oRedis.SCard("post:1:tags")

    Dim vTags As Variant
    vTags = oRedis.SMembers("post:1:tags")

    Debug.Print "所有标签:"
    Dim i As Long
    For i = 0 To UBound(vTags)
        Debug.Print "  - " & vTags(i)
    Next

    ' 检查标签是否存在
    If oRedis.SIsMember("post:1:tags", "Redis") Then
        Debug.Print vbCrLf & "包含 Redis 标签"
    End If

    ' 删除标签
    oRedis.SRem "post:1:tags", "VB6"
    Debug.Print "删除标签后,剩余标签数: " & oRedis.SCard("post:1:tags")

    ' 再次添加(不会重复)
    oRedis.SAdd "post:1:tags", "编程"
    Debug.Print "再次添加 '编程' 后,标签数: " & oRedis.SCard("post:1:tags")

    oRedis.DisConnect
End Sub

Set vs List 的选择

场景推荐类型原因
需要唯一值Set自动去重
允许重复List可以存储重复元素
成员检查SetO(1) 时间复杂度
按顺序存储List保持插入顺序
去重需求Set集合天然支持去重
栈/队列List支持 LPush/LPop/RPush/RPop

Set 特性

  1. 无序:成员没有顺序之分
  2. 唯一:不允许重复元素
  3. 快速查找:检查成员是否存在非常快
  4. 集合运算:支持交集、并集、差集等运算(需要扩展实现)

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