Django使用redis緩存服務器

redis相信大家都很熟悉了,和memcached一樣是一個高性能的key-value數據庫,至於什麼是緩存服務器,度娘都有很明白的介紹了,我在這裏就不一一介紹了。關於和memcached具體可以看Django配置緩存機制

安裝該數據庫是爲了做服務器緩存。以下兩種情況都適合使用服務器緩存:

1)數據非經常更新。若每次都從硬盤讀取一次,浪費服務器資源、拖慢響應速度。

2)數據更新頻率較高,服務器負擔比較大。

這些數據只需每天更新一次。而我每次都從數據庫獲取相應的數據,計算統計排行情況和閱讀數。很明顯浪費服務器資源,浪費時間。解決方法是定時統計一次數據,保存到數據庫或文件中。每次讀取數據從中獲取。

若保存到數據庫,還需要額外建立一張對應的表存儲數據。在Django中建立表通常做法是建立一個模型。看似簡單,問題調試麻煩、開發時長久。所以我一直拖着沒處理該問題。畢竟一開始訪問量不是很多。後來不少網友訪客打開慢(當然服務器在國外也是個原因),查了資料發現Redis內存數據庫。可以將數據寫入到內存,再進行讀寫。減少計算量,可以有效提高服務器響應速度。

這麼一來,我就不用創建新表創建模型。直接將數據寫入緩存,定時更新。獲取數據從服務器緩存獲取即可。

下面我就來介紹如何在Django中配置使用redis數據庫!

1、安裝redis

在Ubuntu中執行下面這句命令:

sudo apt-get install redis-server

在Centos 中執行下面這句命令:

sudo yum install redis-server

讀寫數據之前,記得開啓redis服務。否則會顯示No connect未連接錯誤。

2、安裝django-redis和settings配置

執行命令,即可安裝:

pip install django-redis

這是一個開源的項目,github地址是 https://github.com/niwibe/django-redis

目前django-redis已更新到4.10.0版本。安裝完畢之後,給Django項目的settings.py文件添加如下配置。

CACHES = {
    'default': {
        'BACKEND': 'django_redis.cache.RedisCache',
        'LOCATION': 'redis://127.0.0.1:6379',
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        },
    },
}

LOCATION支持三種 URL scheme :

  • redis://: 普通的 TCP 套接字連接
  • rediss://: SSL 包裹的 TCP 套接字連接
  • unix://: Unix 域套接字連接

記住 LOCATION的配置不能是 127.0.0.1:6379 ,必須加上 Redis://,否則提示連接不上redis!

很多文章都是這樣配置的:

CACHES = { 
    'default': { 
        'BACKEND': 'redis_cache.cache.RedisCache', 
        'LOCATION': '127.0.0.1:6379', 
        "OPTIONS": { 
            "CLIENT_CLASS": "redis_cache.client.DefaultClient", 
        }, 
    }, 
} 

這樣是錯誤的,估計是老版本的原因,暫時不必深究!

作爲 session backend 使用配置

SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "default"

3、測試redis緩存

該步驟非必須,只是爲了測試看可否正常使用redis。

進入django的後臺命令模式:

python manage.py shell

逐條輸入如下命令測試:

from django.core.cache import cache #引入緩存模塊
cache.set('key', 'value', 30*60)      #寫入key爲key,值爲value的緩存,有效期30分鐘
cache.has_key('key') #判斷key爲k是否存在
cache.get('key')     #獲取key爲k的緩存

測試沒問題,則說明可正常使用。

4、redis緩存功能開發

這裏需要考慮兩個問題:

  • 寫入redis的數據是什麼形式?
  • 緩存時效多長?

redis支持字符串、列表、集合、字典等數據結構。經測試,可將Python的字典和列表直接存儲。你也可以用json模塊對字典和列表轉化成字符串再存儲。

至於緩存時效看具體情況,建議30分鐘或者1小時更新一次。原本我考慮1天更新1次數據,但全球有很多個時區。不是每個時區都和我一樣在0點的時候看到更新結果。我們是東八區,我們0點的時候,東九區是1點。所以,每1小時更新一次的頻率較爲合適,你可以直接設置60*60秒。而我需要整點的時候更新,需要再多一步計算到下一個整點還有多少秒。

讀寫redis緩存代碼(這是重點):

def expire_view_cache(path, servername, serverport, key_prefix=None):
    '''
    刷新視圖緩存
    :param path:url路徑
    :param servername:host
    :param serverport:端口
    :param key_prefix:前綴
    :return:是否成功
    '''
    from django.http import HttpRequest
    from django.utils.cache import get_cache_key

    request = HttpRequest()
    request.META = {'SERVER_NAME': servername, 'SERVER_PORT': serverport}
    request.path = path

    key = get_cache_key(request, key_prefix=key_prefix, cache=cache)
    if key:
        logger.info('expire_view_cache:get key:{path}'.format(path=path))
        if cache.get(key):
            cache.delete(key)
        return True
    return False

若你想看看redis保存該數據的樣子,可進入redis客戶端查看。輸入命令redis-cli進入客戶端。

再分別輸入keys * 查看有那些鍵,再輸入get命令獲取數據。結果如下:

此文章同時同步到我的個人博客緣來來來 » Django 添加自定義命令Django使用redis緩存服務器](https://www.fkomm.cn/article/2019/2/21/68.html)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章