Redis 哈希

Redis哈希简介

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

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

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

有一些命令能够对单个字段执行操作,比如 HINCRBY

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

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

基本命令

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

查看完整的哈希命令列表

示例

  • Store counters for the number of times bike:1 has been ridden, has crashed, or has changed owners:

字段过期

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纪元以来的秒或毫秒为单位指定。↩︎

RATE THIS PAGE
Back to top ↑