Python Django 筆記 – Django Cache 存取多個儲存體

Django Cache 基本盤

Django 的 Cache ,可以設定存取多種儲存體,例如 File, DB, Memory 等

只要照著文件設定,就可以了,例如下面是把預設的 Cache 設定在 File 的範例,設定通常存在某個 setting.py 之類的檔案,依據你系統實際狀況而定。

setting 設定範例

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
        'LOCATION': '/var/tmp/django_cache',
    }
}

使用範例

那個 ‘default’ 同時也意味著,這組是預設的 Cache,所以呼叫預設 Cache 可以這樣做

from django.core.cache import cache

... [略]

cache.get('your_key')  # 取得某個 key 的 value
cache.set('your_key', timeout=123)   # 設定 value 且過期時間 123 秒
cache.delete('your_key')  # 刪除某個 key 

其實也可以這樣用,兩者等效,可以參考文件

from django.core.cache import caches

... [略]

caches['default'].get('your_key')  # 取得某個 key 的 value
caches['default'].set('your_key', 'your_value', 23)   # 設定 value 且過期時間 123 秒
caches['default'].delete('your_key')  # 刪除某個 key 

... [略]

多個 Cache 儲存體

所以看完上面範例,你應該也已經猜到,如果想要設定多個 Cache 的儲存體非常簡單,

setting.py 設定範例

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
        'LOCATION': 'unique-snowflake',
    }
    'my_file_cache': {
        'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
        'LOCATION': '/var/tmp/django_cache',
    }
}

使用範例

from django.core.cache import caches

... [略]

# 存取 'default' 的 Cache
caches['default'].get('your_key')  # 取得某個 key 的 value
caches['default'].set('your_key', 'your_value', 23)   # 設定 value 且過期時間 123 秒
caches['default'].delete('your_key')  # 刪除某個 key 

# 存取 'my_file_cache' 的 Cache
caches['my_file_cache'].get('your_key')  # 取得某個 key 的 value
caches['my_file_cache'].set('your_key', 'your_value', 23)   # 設定 value 且過期時間 123 秒
caches['my_file_cache'].delete('your_key')  # 刪除某個 key 

... [略]

其他多個 Cache 範例 – Redis 使用不同 Host、不同 db number

db number 的部分,可以參考 Redis 的 SELECT 指令,以及 redis-cli 的 -n 參數

簡而言之這有點類似 namespace 概念,Redis 預設準備了 0~15 共計 16 個 db 給你用,不同的 db 互不干涉,可以使用相同的 key,如果沒指定,預設是連向 0 號 db。

以下是使用套件 django-redis 的範例

setting 範例

CACHES = {
    # 預設 Cache
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    },
    # 連向 local 的 Redis db number 1
    "my_redis_db1": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/1",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    },
    # 連向 遠端某個 Redis 主機(host: your.redis.url), db number 為 2
    "another_redis_db2": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://your.redis.url:6379/2",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    },
}

使用範例

from django.core.cache import caches
... [略]
# 存取預設 Cache,所以會是 local redis , db number 0 的 database
cache.get('your_key')  # 取得某個 key 的 value
cache.set('your_key', timeout=123)   # 設定 value 且過期時間 123 秒
cache.delete('your_key')  # 刪除某個 key 

... [略]

# 一樣是存取預設 Cache,所以一樣是 local redis , db number 0 的 database
caches['default'].get('your_key')  # 取得某個 key 的 value
caches['default'].set('your_key', 'your_value', 23)   # 設定 value 且過期時間 123 秒
caches['default'].delete('your_key')  # 刪除某個 key 

... [略]

# 存取 'my_redis_db1' 的 Cache,也就是 local redis , db number 1 的 database
caches['my_redis_db1'].get('your_key')  # 取得某個 key 的 value
caches['my_redis_db1'].set('your_key', 'your_value', 23)   # 設定 value 且過期時間 123 秒
caches['my_redis_db1'].delete('your_key')  # 刪除某個 key 

... [略]
# 存取 'another_redis_db2' 的 Cache,也就是遠端 Redis(your.redis.url 那台), 且 db number 2 的 database
caches['another_redis_db2'].get('your_key')  # 取得某個 key 的 value
caches['another_redis_db2'].set('your_key', 'your_value', 23)   # 設定 value 且過期時間 123 秒
caches['another_redis_db2'].delete('your_key')  # 刪除某個 key 

... [略]

You Might Also Like

Leave a Reply

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料