Redis 哈希

Redis 哈希简介

Redis 哈希是记录类型,结构化为字段-值对的集合。您可以使用哈希来表示基本对象,以及存储计数器分组等。

虽然哈希非常适合表示*对象*,但实际上,您可以在哈希中放入的字段数量没有实际限制(除了可用内存),因此您可以在应用程序中以多种方式使用哈希。

命令 HSET 设置哈希的多个字段,而 HGET 检索单个字段。 HMGETHGET 类似,但返回一个值数组

也有一些命令可以对单个字段执行操作,例如 HINCRBY

您可以在 文档中找到哈希命令的完整列表

值得注意的是,小哈希(即少数元素具有小值)在内存中以特殊方式编码,使其非常节省内存。

基本命令

  • HSET: 设置哈希中一个或多个字段的值。
  • HGET: 返回给定字段的值。
  • HMGET: 返回一个或多个给定字段的值。
  • HINCRBY: 将给定字段的值增加提供的整数。

查看 哈希命令的完整列表

示例

  • 存储自行车:1 被骑过、发生事故或更换车主的次数计数器

字段过期

Redis 社区版 7.4 中新增了为单个哈希字段指定过期时间或生存时间 (TTL) 值的功能。此功能类似于 键过期,并包含许多类似的命令。

使用以下命令为特定字段设置精确的过期时间或 TTL 值

  • HEXPIRE: 设置剩余的 TTL(以秒为单位)。
  • HPEXPIRE: 设置剩余的 TTL(以毫秒为单位)。
  • HEXPIREAT: 将过期时间设置为以秒为单位的 1 时间戳。
  • HPEXPIREAT: 将过期时间设置为以毫秒为单位的时间戳。

使用以下命令检索特定字段将过期时的确切时间或剩余 TTL

  • HEXPIRETIME: 获取以秒为单位的时间戳形式的过期时间。
  • HPEXPIRETIME: 获取以毫秒为单位的时间戳形式的过期时间。
  • HTTL: 获取剩余的 TTL(以秒为单位)。
  • HPTTL: 获取剩余的 TTL(以毫秒为单位)。

使用以下命令删除特定字段的过期时间

常见的字段过期用例

  1. 事件跟踪: 使用哈希键存储过去一小时的事件。将每个事件的 TTL 设置为一小时。使用 HLEN 统计过去一小时的事件。

  2. 欺诈检测: 创建一个哈希,其中包含每小时事件计数器。将每个字段的 TTL 设置为 48 小时。查询哈希以获取过去 48 小时每小时的事件数量。

  3. 客户会话管理: 在哈希键中存储客户数据。为每个会话创建一个新的哈希键,并在客户的哈希键中添加一个会话字段。会话过期时,自动过期会话键和客户哈希键中的会话字段。

  4. 活动会话跟踪: 在一个哈希键中存储所有活动会话。将每个会话的 TTL 设置为在不活动后自动过期。使用 HLEN 统计活动会话。

字段过期示例

官方客户端库目前尚不支持哈希字段过期,但您可以使用 Python (redis-py)Java (Jedis) 客户端库的测试版测试哈希字段过期。

以下是一些演示如何使用字段过期的 Python 示例。

考虑一个用于存储传感器数据的哈希数据集,其结构如下

event = {
    'air_quality': 256,
    'Battery_level':89
}

client.hset('sensor:sensor1', mapping=event)

设置和检索哈希中多个字段的 TTL

# set the TTL for two hash fields to 60 seconds
client.hexpire('sensor:sensor1', 60, 'air_quality', 'battery_level')
ttl = client.httl('sensor:sensor1', 'air_quality', 'battery_level')
print(ttl)
# prints [60]

设置和检索哈希字段的 TTL(以毫秒为单位)

# set the TTL of the 'air_quality' field in milliseconds
client.hpexpire('sensor:sensor1', 60000, 'air_quality')
# and retrieve it
pttl = client.hpttl('sensor:sensor1', 'air_quality')
print(pttl)
# prints [60000]

设置和检索哈希字段的过期时间戳

# set the expiration of 'air_quality' to now + 24 hours
# (similar to setting the TTL to 24 hours)
client.hexpireat('sensor:sensor1', 
    datetime.now() + timedelta(hours=24), 
    'air_quality')
# and retrieve it
expire_time = client.hexpiretime('sensor:sensor1', 'air_quality')
print(expire_time)
# prints [1717668041]

性能

大多数 Redis 哈希命令都是 O(1)。

一些命令,例如 HKEYSHVALSHGETALL 以及大多数与过期时间相关的命令,都是 O(n),其中 n 是键值对的数量。

限制

每个哈希最多可以存储 4,294,967,295 (2^32 - 1) 个键值对。实际上,您的哈希仅受托管 Redis 部署的 VM 上的总内存限制。

了解更多


  1. 所有时间戳均以自 Unix 纪元 起的秒或毫秒为单位。 ↩︎

RATE THIS PAGE
Back to top ↑