Redis로 Dictionary 객체를 저장할 때, encoding, decoding 문제로 곤란을 겪은적이 있었습니다.


이를 해결 하기 위해서,

Redis에 데이터를 저장할 때는 json.dumps() 메서드를, 데이터를 가져올 때는 json.loads() 메서드를 호출하니까 해결되었습니다.


먼저 잘못된 예시들을 살펴보겠습니다.



잘못된 예시

import redis
r = redis.StrictRedis(host="localhost", port=6379, db=0)

test_dict = {
"foo": "안녕",
"goo": ["헬로", "월드"]
}

r.set("test_dict", test_dict)
print( r.get("test_dict") )

Python에서 Redis를 사용하는 가장 기본적인 방법입니다.

set(), get() 메서드를 호출하여 데이터를 저장하고, 조회하는데 에러가 발생하는 부분은 없습니다.


그러나 결과를 보시면 아래와 같이 decoding 처리가 되지 않아 알아볼 수 없는 문자열을 볼 수 있습니다.

b"{'foo': '\xec\x95\x88\xeb\x85\x95', 'goo': ['\xed\x97\xac\xeb\xa1\x9c', '\xec\x9b\x94\xeb\x93\x9c']}"



따라서 Redis에 ASCII 문자열이 아닌 UTF-8 타입의 문자열을 저장하고 조회하려면, json 모듈의 dumps(), loads() 메서드를 사용하면 됩니다.




올바른 방법

import redis
import json
r = redis.StrictRedis(host="localhost", port=6379, db=0)

test_dict = {
"foo": "안녕",
"goo": ["헬로", "월드"]
}

# set
json_test_dict = json.dumps(test_dict, ensure_ascii=False).encode('utf-8')
r.set("test_dict", json_test_dict)

# get
json_test_dict = r.get('test_dict').decode('utf-8')
test_dict2 = dict(json.loads(json_test_dict))

print(test_dict2)

출력 되는 값을 보면, 아래와 같이 UTF-8 인코딩 처리가 잘된 것을 확인할 수 있습니다.

{'foo': '안녕', 'goo': ['헬로', '월드']}




이상으로 Python에서 Redis를 사용할 때, UTF-8 타입의 문자열을 저장하고, 조회하는 방법에 대해 알아보았습니다.