이 패키지의 작동에 관해 질문이 있습니다. 그것은 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"가 호출됩니다.
하지만이 오류가 발생합니다. 따라서, 다른 방법으로 데이터를 다시 쓰는 것이 분명합니다. 오류에 대해 알려주고 데이터를 쓰는 방법을 알려주십시오.
하고 그입니다! 잘 설명! 나는이 단계들을 알기 위해 github에 문제를 제기했다. 데이터가 캐시되기 전에 serialize되었다는 것을 알지 못했습니다 (cache_page 데코레이터를 통해). 이것은 내 모든 의심을 설명합니다.고마워요 dhruv bhai – Luv33preet
나는 이것을 지금했다,'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