1

.hgetall(key) で要求されたときに、redis キャッシュの db2 で明らかに既知のハッシュが停止する状況に遭遇しています。洞察力を期待しています!ありがとうございました。

そうですね...まず、コードのスライバー:

def from_cache(self, cachekey):
    """ pull oft needed material from our persistent redis memory cache, ensuring of course that we have a connection """

    try:
        log.debug('trying to get \'%s\' from cache' % cachekey)
        return self.redis.hgetall(cachekey)
    except Exception, e:
        self.connect_to_cache()
        return self.redis.get(cachekey)

その結果:

2013-05-21 14:45:26,035 23202 DEBUG trying to get 'fax:1112223333' from cache
2013-05-21 14:45:26,036 23202 DEBUG initializing connection to redis/cache memory localhost, port 6379, db 2...
2013-05-21 14:45:26,039 23202 ERROR stopping with an exception
Traceback (most recent call last):
  File "/usr/lib/python2.6/site-packages/simpledaemon/base.py", line 165, in start
    self.run()
  File "newgov.py", line 51, in run
    if self.ready_for_queue(fax):
  File "newgov.py", line 61, in ready_for_queue
    if self.too_many_already_queued(fax):
  File "newgov.py", line 116, in too_many_already_queued
    rules = self.from_cache(key)
  File "newgov.py", line 142, in from_cache
    return self.redis.get(cachekey)
  File "/usr/lib/python2.6/site-packages/redis/client.py", line 588, in get
    return self.execute_command('GET', name)
  File "/usr/lib/python2.6/site-packages/redis/client.py", line 378, in execute_command
    return self.parse_response(connection, command_name, **options)
  File "/usr/lib/python2.6/site-packages/redis/client.py", line 388, in parse_response
    response = connection.read_response()
  File "/usr/lib/python2.6/site-packages/redis/connection.py", line 309, in read_response
    raise response
ResponseError: Operation against a key holding the wrong kind of value

そして、これがredisの内容です:

$ redis-cli
redis 127.0.0.1:6379> SELECT 2
OK
redis 127.0.0.1:6379[2]> type fax:1112223333
hash
redis 127.0.0.1:6379[2]> hgetall fax:1112223333
1) "delay"
2) "0"
3) "concurrent"
4) "20"
5) "queued"
6) "20"
7) "exclude"
8) ""
4

2 に答える 2

1

set と hset の場合、さまざまな種類のデータがあります。hset では、値はハッシュマップです。ハッシュマップを取得しようとすると、同じエラーが発生します。試すだけhgetallでredisはハッシュマップを返すか、キャッシュキーと設定されたハッシュマップの任意のキーでhgetを試して楽しんでください

于 2013-10-27T17:11:21.393 に答える
1

Python スタック トレースを見てください。「return self.execute_command('GET', name)」で失敗します。だということだ:

  • hgetall コマンドが失敗しました (おそらく、以前に接続が確立されていなかったためです)
  • 例外が発生し、メソッドでキャッチされました
  • Redis 接続が確立されます (connect_to_cache() を呼び出すことによると思います)。
  • 次に、「self.redis.get(cachekey)」を実行しようとします
  • もちろん、 cachekey のコンテンツはハッシュのキー(文字列ではない)であるため、失敗します(ここでは、代わりに hgetall を使用する必要があると思います)
  • 他の例外が発生します - Redis エラーは型エラーです (間違った種類の値を保持するキーに対する操作)

redis-cli で "GET fax:1112223333" を実行しようとすると、同じエラーが発生します。

于 2013-05-22T15:15:25.790 に答える