【问题标题】:Hash fields in Redis not ordered the same way as inputRedis 中的哈希字段与输入的排序方式不同
【发布时间】:2015-11-25 03:49:03
【问题描述】:

我有一个 date => data 类型的关联数组,f.e.:

   [
    '2015-11-18' => 'some_data',
    '2015-11-17' => 'some_data',
    '2015-11-16' => 'some_data'
   ]

然后我将它们推入hash,其中数组键(日期)是哈希的field,值是value...但在Redis中它们的排序不同输入的顺序(我需要它们)。此外,当我获得所有键 (hkeys) 时,它们的排序方式与它们存储在 Redis 中的顺序完全不同。

在存储和获取密钥时,有没有办法按照我输入它们的方式对它们进行排序?

【问题讨论】:

    标签: redis


    【解决方案1】:

    您需要使用两种结构在 redis 中实现关联数组。一种方法是将密钥按顺序存储在list 中,并将key => value 映射存储在hash 中。

    键列表:

    [
     '2015-11-18',
     '2015-11-17',
     '2015-11-16'
    ]
    

    哈希:

    {
     '2015-11-18' => 'some data',
     '2015-11-16' => 'some data',
     '2015-11-17' => 'some data'
    }
    

    您可以使用scripts 以原子方式更新这两个结构。添加操作脚本可能如下所示:

    eval "
      redis.call('rpush', KEYS[1], ARGV[1]);
      local i = redis.call('llen', KEYS[1]);
      return redis.call('hset', KEYS[2], ARGV[1], ARGV[2]);
    " 2 'keys' 'values' '2015-11-15' 'some data'
    

    删除操作脚本可能如下所示:

    eval "
      redis.call('lrem', KEYS[1], ARGV[1]);
      return redis.call('hdel', KEYS[2], ARGV[1]);
    " 2 'keys' 'values' '2015-11-15'
    

    get-by-key 操作脚本可能看起来像普通的hash get

    hget 'values' '2015-11-15'
    

    按索引获取的操作脚本可能如下所示:

    eval "
      local k = redis.call('lindex', KEYS[1], ARGV[1]);
      return redis.call('hget', KEYS[2], k);
    " 2 'keys' 'values' 1
    

    按顺序获取密钥将是一个简单的lrange

    lrange 'keys' 0 -1
    

    要按顺序获取值,您可以使用:

    eval "
      local k = redis.call('lrange', KEYS[1], 0, -1);
      return redis.call('hmget', KEYS[2], unpack(k));
    " 2 'keys' 'values'
    

    【讨论】:

      【解决方案2】:

      Redis 哈希不维护顺序,也不对输出的顺序做出任何保证(Redis 哈希可能在其生命周期内进行重新哈希)。不妨考虑使用 Redis 的 Sorted Sets。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-08-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多