2017-04-05 3 views
0

이 패키지의 작동에 관해 질문이 있습니다. 그것은 redis db에 어떻게 씁니까? Django-redis-cache가 redis에서 데이터를 가져 오지 못함

[email protected]:~/test_venv_wrapper/test_redis/cache_redis$ redis-cli 
127.0.0.1:6379> select 2 
OK 
127.0.0.1:6379[2]> set "a" "aman" 
OK 
127.0.0.1:6379[2]> set ":1:a" "theman" 
OK 
127.0.0.1:6379[2]> keys * 
1) "a" 
2)":1:views.decorators.cache.cache_page..GET.ad00468064711919773512f81be0dbc4.d41d8cd98f00b204e9800998ecf8427e.en-us.UTC" 
3) ":1:posts" 
4) ":1:a" 
5) ":1:aman" 
6) ":1:views.decorators.cache.cache_header.cache_test.ad00468064711919773512f81be0dbc4.en-us.UTC" 
7) ":1:views.decorators.cache.cache_header..ad00468064711919773512f81be0dbc4.en-us.UTC" 
8) ":1:b" 
9)":1:views.decorators.cache.cache_page.cache_test.GET.ad00468064711919773512f81be0dbc4.d41d8cd98f00b204e9800998ecf8427e.en-us.UTC" 
10) "aman" 
127.0.0.1:6379[2]> get ":1:a" 
"theman" 
127.0.0.1:6379[2]> get "a" 
"aman" 

는 해당 레디 스입니다, 이건 내 레디 스이 -cli입니다

def postview(request): 
    print("Working") 
    #post_list = Post.objects.all() 
    if cache.get("posts") == None: 
      post_list = Post.objects.all() 
      print("going to be cached") 
      a = cache.get("aman") 
      print("aman ", a) 
      cache.set("posts", post_list, timeout=60*100*10) 
      print("cached") 
    else : 
      post_list = cache.get("posts") 
      aman = cache.get("aman") 
      print(aman, " aman's job") 
      print("already present in cache") 
    context = {"post_list" : post_list} 
    print("Problem") 
    return render(request, 'post_list.html', context) 

@cache_page(60*15*10, key_prefix="cache_redis") 
def testview(request): 
    post_list = cache.get("posts") 
    print("post_list is", post_list) 
    return render(request, 'post_list.html', {"post_list":post_list}) 

@cache_page(60*25*10, key_prefix="cache_test") 
def new(request): 
    print("Hey") 
    print("cache_page is working") 
    return HttpResponse("Hello, I am Mohammed") 

, 이건 내 의견이 파일

CACHES = { 
    'default': { 
    'BACKEND': 'redis_cache.RedisCache', 
    'LOCATION': '/var/run/redis/redis.sock', 
    'OPTIONS': { 
     'DB': 2, 
    }, 
}, 
} 

-

이 내 레디 스에 대한 설정입니다 -cli 모니터

[email protected]:~/test_venv_wrapper/test_redis/cache_redis$ redis-cli monitor 
OK 
1491412249.001149 [0 unix:/var/run/redis/redis.sock] "INFO" 
1491412249.086196 [0 127.0.0.1:44984] "select" "2" 
1491412250.001249 [0 unix:/var/run/redis/redis.sock] "INFO" 
1491412257.001426 [0 unix:/var/run/redis/redis.sock] "INFO" 
1491412257.423536 [2 127.0.0.1:44984] "set" "a" "aman" 
1491412258.001311 [0 unix:/var/run/redis/redis.sock] "INFO" 
1491412269.001211 [0 unix:/var/run/redis/redis.sock] "INFO" 
1491412269.820886 [2 127.0.0.1:44984] "set" ":1:a" "theman" 
1491412270.000741 [0 unix:/var/run/redis/redis.sock] "INFO" 
1491412272.955386 [2 127.0.0.1:44984] "keys" "*" 
1491412273.001121 [0 unix:/var/run/redis/redis.sock] "INFO" 
1491412340.991928 [2 127.0.0.1:44984] "get" ":1:a" 
1491412341.002001 [0 unix:/var/run/redis/redis.sock] "INFO" 
1491412344.106985 [2 127.0.0.1:44984] "get" "a" 
1491412345.001677 [0 unix:/var/run/redis/redis.sock] "INFO" 

이는 데이터베이스 2에 수동으로 삽입하는 데이터를 사용할 수 있으며 redis-cli를 통해 데이터를 가져올 수 있음을 의미합니다. 여기

>>> from django.core.cache import cache 
>>> cache.get("a") 
Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
    File "/usr/local/lib/python2.7/dist-packages/redis_cache/backends/base.py", line 33, in wrapped 
    return method(self, client, key, *args, **kwargs) 
    File "/usr/local/lib/python2.7/dist-packages/redis_cache/backends/base.py", line 259, in get 
    value = self.get_value(value) 
    File "/usr/local/lib/python2.7/dist-packages/redis_cache/backends/base.py", line 210, in get_value 
    value = self.deserialize(value) 
    File "/usr/local/lib/python2.7/dist-packages/redis_cache/backends/base.py", line 197, in deserialize 
    return self.serializer.deserialize(value) 
    File "/usr/local/lib/python2.7/dist-packages/redis_cache/serializers.py", line 42, in deserialize 
    return pickle.loads(force_bytes(value)) 
UnpicklingError: could not find MARK 

가 대응하는 레디 스-CLI 모니터입니다

하지만 장고 - 응용 프로그램 파이썬 쉘에서이 수동으로 입력 데이터를 가져하려고 할 때 발생합니다,

OK 
1491413058.004167 [0 unix:/var/run/redis/redis.sock] "INFO" 
1491413059.002746 [0 unix:/var/run/redis/redis.sock] "INFO" 
1491413060.663292 [2 unix:/var/run/redis/redis.sock] "GET" ":1:a" 
1491413061.001167 [0 unix:/var/run/redis/redis.sock] "INFO" 

왜 수동으로 작성된 데이터에 액세스 할 수 없습니까? 나는 django를 통해 작성된 데이터에 접두사를 추가한다는 것을 알고 있습니다. 접두사는 ":1:key_name"입니다. 그래서 "a"와 ": 1 : a"라는 2 개의 키를 추가했습니다. 따라서 "a"에 액세스하려고하면 ": 1 : a"가 호출됩니다.

하지만이 오류가 발생합니다. 따라서, 다른 방법으로 데이터를 다시 쓰는 것이 분명합니다. 오류에 대해 알려주고 데이터를 쓰는 방법을 알려주십시오.

답변

1

gettting하는 오류가 데이터 검색 오류가 아니며 데이터가 검색 중이지만 올바른 피클 형식이 아닙니다.

  • 수동으로 데이터를 설정하는 경우 데이터는 절편 형식이 아닌 바이트 형식으로 설정됩니다.
  • django-redis를 통해 데이터를 설정하면 데이터가 cPickle을 사용하여 직렬화 된 다음 pickled 문자열로 redis에 저장됩니다.

  • django-redis를 통해 저장된 데이터를 검색하면 해당 데이터는 pickle 직렬화 된 문자열로 수집 된 다음 해당하는 python 데이터 유형으로 deserialize됩니다.

  • 수동으로 입력 한 데이터는 문자열 유형이지만 정확한 피클 형식이 아니므로 조사 되더라도 해당 Python 유형으로 변환 할 수 없으며 사용자는 피클링 오류가 발생합니다.
  • 해결책은 django 쉘에서 django-redis 자체를 사용하거나 데이터를 저장 및 검색하는 코드에서 데이터를 수동으로 입력하면 직렬화 계약이 중단됩니다.

예 :

>>> from django.core.cache import cache 
>>> cache.set("THE_KEY","aman") 
True 
>>> cache.get("THE_KEY") 
'aman' 
>>> 
[email protected]:~$ redis-cli 
127.0.0.1:6379> keys * 
1) ":1:THE_KEY" 
127.0.0.1:6379> get ":1:THE_KEY" 
"\x80\x02U\x04amanq\x01." 
127.0.0.1:6379> set "THE_MANUAL_KEY" "aman" 
OK 
127.0.0.1:6379> get "THE_MANUAL_KEY" 
"aman" 
+1

하고 그입니다! 잘 설명! 나는이 단계들을 알기 위해 github에 문제를 제기했다. 데이터가 캐시되기 전에 serialize되었다는 것을 알지 못했습니다 (cache_page 데코레이터를 통해). 이것은 내 모든 의심을 설명합니다.고마워요 dhruv bhai – Luv33preet

+0

나는 이것을 지금했다,'a = "aman"'; 'import cPickle'; 'a = cPickle.dumps (a)'; 이것은 현재 S'aman 백엔드 '\ np1 \ n의 값입니다. "'이걸 복사해서 redis-cli에서''set"key_name ""value "'를 설정했습니다. 이 값은 (파이썬 코드에서) 복사 된 값입니다. 그리고 지금은 쉘에서, 나는 그것을 찾으려고 노력했다. 그리고이 오류가 발생했습니다. django.core.exceptions.ImproperlyConfigured : CACHES 설정을 요청했으나 설정이 구성되지 않았습니다. 설정에 액세스하기 전에 DJANGO_SETTINGS_MODULE 환경 변수를 정의하거나 settings.configure()를 호출해야합니다. '길이가 길어서 전체 트레이스를 복사 할 수 없습니다. – Luv33preet