#python #encoding #redis #redisson #redis-py
Вопрос:
У меня есть приложение Java Spring, которое использует клиент Redisson для хранения некоторых данных в redis в хэше. Сохраненные ключи являются строками (например, «key1»), а значения-объектами java. Используемый кодек используется по умолчанию, поэтому FSTCodec. Что я хочу сделать, так это использовать скрипт на python (я использую клиент redis-py), чтобы найти ключ в redis и удалить его. Когда я получаю ключи от redis, их формат выглядит примерно так: [b'xfcx07key1', b'xfcx05key2', b'xfcx02key3']
. Когда я делаю что-то подобное
r = redis.StrictRedis()
hash = r.keys(pattern='*key*') # to get the hash
hk = r.hkeys(hash[0])
print(hk) # returns [b'xfcx07key1', b'xfcx05key2', b'xfcx02key3']
for key in hk:
print("key ", key)
print("value", r.hget(hash[0], key)) #None
в результате ничего не получается. Я пробовал несколько способов получить значение, но безрезультатно. (не знаком с python)
Если я сделаю то же самое в командной строке с помощью redis-cli, ключи будут в немного другом формате "xfcakey1"
, и когда я это сделаю HGET test_key "xfcakey1"
, он вернет значение правильно.
Здесь я должен отметить, что я должен быть в состоянии найти ключ с известным значением «key1». Итак, мой ввод «key1», и я должен получить все ключи и просмотреть их, чтобы найти и удалить тот, в котором есть «key1», в данном случае xfcx07key1.
Я также пытался декодировать с помощью decode_responses
, но я получаю UnicodeDecodeError: 'utf-8' codec can't decode byte in position 0: invalid start byte
Есть ли способ, которым я могу расшифровать ключи из моего скрипта python? Например, удалите часть xfc…, добавленную FSTCodec. Или иначе, как я могу получить правильный ключ? Является ли единственным решением изменить кодек, который использует redisson, на JsonJacksonCodec? Любая помощь будет очень признательна
Комментарии:
1. Почему бы вам не изменить сериализацию в Redission, чтобы использовать msgpack или JSON?
2. Это я действительно мог бы сделать. Но весь смысл вопроса в том, что я не хочу вносить какие-либо изменения, связанные с redis, в приложение.