Redis 哈希

Redis 哈希简介

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

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

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

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

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

值得注意的是,小哈希值(即少数具有小值的元素)以特殊方式在内存中编码,这使得它们的内存效率非常高。

基本命令

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

查看哈希命令的完整列表

示例

  • 存储自行车:1 被骑行、撞车或更换主人的次数的计数器:

字段过期

Redis Community Edition 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)。

一些命令(例如HKEYS、、HVALSHGETALL以及大多数与到期相关的命令都是 O(n),其中n是字段值对的数量。

限制

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

了解更多


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

给此页面评分
返回顶部 ↑