国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

快取 - 用django cache設(shè)定的redis key的名字前加的序號(hào)有什麼意義?
給我你的懷抱
給我你的懷抱 2017-06-10 09:48:11
0
2
1906

使用django自帶的模組處理redis快取時(shí),設(shè)定好的key比如說時(shí)“banners”, 到了在redis的cli下看到name就變成了“:1:banners”,這是django的機(jī)制,還是redis的呢

from django.core.cache import cache

def get_queryset(self):
        key = "banners"
        queryset = cache.get(key)
        if not queryset:
            queryset = Banner.objects.filter(valid=True)
            cache.set(key, queryset, 3600)
        return queryset
給我你的懷抱
給我你的懷抱

全部回覆(2)
伊謝爾倫

你自己在設(shè)定redis會(huì)選擇redis的函式庫,redis本身就分成幾個(gè)函式庫,看你設(shè)定是哪一個(gè)

過去多啦不再A夢(mèng)

這個(gè)是django cache的機(jī)制, key由前綴,版本號(hào),真正的key組成。 django在升級(jí)或程式碼重構(gòu)的時(shí)候有用,可以判斷key是那個(gè)版本號(hào),從而進(jìn)行相容(其它歡迎補(bǔ)充)

1.首先看django redis client api的實(shí)作:

# https://github.com/niwinz/django-redis/blob/master/django_redis/client/default.py
def get(self, key, default=None, version=None, client=None):
    """
    Retrieve a value from the cache.
    Returns decoded value if key is found, the default if not.
    """
    if client is None:
        client = self.get_client(write=False)

    key = self.make_key(key, version=version)

    try:
        value = client.get(key)
    except _main_exceptions as e:
        raise ConnectionInterrupted(connection=client, parent=e)

    if value is None:
        return default

    return self.decode(value)

... 中間省略代碼 ...


def make_key(self, key, version=None, prefix=None):
    if isinstance(key, CacheKey):
        return key

    if prefix is None:
        prefix = self._backend.key_prefix

    if version is None:
        version = self._backend.version

    return CacheKey(self._backend.key_func(key, prefix, version))
  

它使用了make_key這個(gè)函數(shù)製作新的key,至於真正的key是從_backend.key_func來的。

2.其次查看django cache backend實(shí)作

# https://github.com/django/django/blob/master/django/core/cache/backends/base.py
def default_key_func(key, key_prefix, version):
    """
    Default function to generate keys.

    Constructs the key used by all other methods. By default it prepends
    the `key_prefix'. KEY_FUNCTION can be used to specify an alternate
    function with custom key making behavior.
    """
    return '%s:%s:%s' % (key_prefix, version, key)


def get_key_func(key_func):
    """
    Function to decide which key function to use.

    Defaults to ``default_key_func``.
    """
    if key_func is not None:
        if callable(key_func):
            return key_func
        else:
            return import_string(key_func)
    return default_key_func
    
class BaseCache(object):
    def __init__(self, params):
    
        ... 中間省略代碼 ...
        
        self.key_prefix = params.get('KEY_PREFIX', '')
        self.version = params.get('VERSION', 1)
        self.key_func = get_key_func(params.get('KEY_FUNCTION'))
    

由此可見,django redis cache的key是有前綴,版本號(hào),真正的key組成。

最新下載
更多>
網(wǎng)站特效
網(wǎng)站源碼
網(wǎng)站素材
前端模板