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)