Abel'Blog

我干了什么?究竟拿了时间换了什么?

0%

Redis-Hset

简介

如何使用 hset+set来做个关系型数据保存。

要设计一个 Redis 方案来存储 Telegram Bot 加入的群信息,包括群名称、加入时间,并支持删除操作和获取群列表,以下是一个可能的设计方案:

设计需求:

  1. 存储每个 Telegram Bot 加入的群信息,包括 群ID群名称加入时间
  2. 当 Bot 退出群时,删除该群的记录。
  3. 能够获取当前 Bot 已加入的所有群信息。

数据结构选择:

  • Redis Hash (哈希):用于存储每个群的具体信息,如群名称和加入时间。
  • Redis Set (集合):用于存储 Bot 加入的所有群的 ID,便于去重和高效查询。

设计方案:

1. 使用 Redis Hash 存储群的详细信息

  • 使用一个 Redis Hash,每个群的详细信息(群名称和加入时间)存储为键值对。
  • key: bot:{bot_id}:group:{group_id} (每个群的详细信息以群 ID 为 key 区分)
  • fields:
    • name: 群名称
    • join_time: 加入时间(可以是时间戳)

2. 使用 Redis Set 存储加入的群 ID

  • 使用一个 Redis Set,存储当前 Bot 加入的所有群的 ID,保证群 ID 唯一且去重。
  • key: bot:{bot_id}:groups
  • 通过 SADD 命令添加群 ID,SREM 删除群 ID,SMEMBERS 获取所有群 ID。

实现操作:

1. 存储群加入信息

当 Bot 加入群时,需要存储群 ID、群名称、和加入时间。

1
2
3
4
5
# 设定群详细信息
HSET bot:{bot_id}:group:{group_id} name "Group Name" join_time 1631012345

# 将群 ID 加入集合
SADD bot:{bot_id}:groups {group_id}

2. 删除群退出信息

当 Bot 退出群时,删除相应的群记录和从群 ID 列表中移除。

1
2
3
4
5
# 删除群详细信息
DEL bot:{bot_id}:group:{group_id}

# 从加入的群 ID 集合中移除
SREM bot:{bot_id}:groups {group_id}

3. 获取当前已加入的群列表

可以通过以下步骤获取 Bot 当前加入的所有群的详细信息:

  • 获取所有群 ID

    1
    SMEMBERS bot:{bot_id}:groups
  • 获取每个群的详细信息

    1
    HGETALL bot:{bot_id}:group:{group_id}

具体示例:

场景 1:存储 Bot 加入了群

假设 Bot ID 是 12345,加入了群 1001,群名称是 Tech Group,加入时间为 2024-09-21 12:00(时间戳 1695297600)。

1
2
3
4
5
# 存储群详细信息
HSET bot:12345:group:1001 name "Tech Group" join_time 1695297600

# 将群 ID 加入群组集合
SADD bot:12345:groups 1001

场景 2:删除 Bot 退出群

当 Bot 退出群 1001 时,删除相应的记录:

1
2
3
4
5
# 删除群详细信息
DEL bot:12345:group:1001

# 从加入的群 ID 集合中移除
SREM bot:12345:groups 1001

场景 3:获取 Bot 当前已加入的群

获取所有已加入的群:

1
2
# 获取所有群 ID
SMEMBERS bot:12345:groups

获取某个群的详细信息:

1
2
# 获取群 1001 的详细信息
HGETALL bot:12345:group:1001

总结:

  • 使用 Redis Set 存储 Bot 加入的群 ID,方便群 ID 去重及高效查询。
  • 使用 Redis Hash 存储每个群的详细信息,如群名称和加入时间。
  • SADDSREM 用于添加或删除群 ID,HSETDEL 用于存储和删除群的详细信息。

这个设计方案简单高效,适用于 Telegram Bot 加入群组的场景,同时易于扩展。