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 IfSCard - 获取集合成员数量
vb
Dim lCount As Long
lCount = oRedis.SCard("myset")
Debug.Print "集合成员数: " & lCountSIsMember - 检查成员是否存在
vb
If oRedis.SIsMember("myset", "apple") Then
Debug.Print "成员存在"
Else
Debug.Print "成员不存在"
End IfSRem - 删除集合成员
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 Sub2. 用户关注
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 Sub3. 在线用户
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 Sub4. 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 Sub5. 唯一访客统计
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 Sub6. 收藏夹
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 SubSet vs List 的选择
| 场景 | 推荐类型 | 原因 |
|---|---|---|
| 需要唯一值 | Set | 自动去重 |
| 允许重复 | List | 可以存储重复元素 |
| 成员检查 | Set | O(1) 时间复杂度 |
| 按顺序存储 | List | 保持插入顺序 |
| 去重需求 | Set | 集合天然支持去重 |
| 栈/队列 | List | 支持 LPush/LPop/RPush/RPop |
Set 特性
- 无序:成员没有顺序之分
- 唯一:不允许重复元素
- 快速查找:检查成员是否存在非常快
- 集合运算:支持交集、并集、差集等运算(需要扩展实现)