Redis 哈希

Redis 哈希简介

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

虽然哈希方便表示对象,但实际上一个哈希中可以放置的字段数量没有实际限制(除了可用内存),因此你可以在应用程序中以多种不同方式使用哈希。

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

也有能够对单个字段执行操作的命令,例如 HINCRBY

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

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

基本命令

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

查看 哈希命令的完整列表

示例

  • 存储 bike: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
}

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

在下面的示例中,其字段过期后,你可能需要刷新 sensor:sensor1 键。

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

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

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

# set the TTL of the 'air_quality' field in milliseconds
r.hpexpire('sensor:sensor1', 60000, 'air_quality')
# and retrieve it
pttl = r.hpttl('sensor:sensor1', 'air_quality')
print(pttl)
# prints [59994] # your actual value may vary

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

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

性能

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

少数命令,例如 HKEYSHVALSHGETALL 以及大多数与过期相关的命令,是 O(n) 的,其中 n 是字段-值对的数量。

限制

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

了解更多


  1. 所有时间戳都以自Unix 纪元以来的秒或毫秒为单位指定。 ↩︎

评价此页面
返回顶部 ↑