redis相信大家都很熟悉了,和memcached一樣是一個(gè)高性能的key-value數(shù)據(jù)庫,至于什么是緩存服務(wù)器,度娘都有很明白的介紹了,我在這里就不一一介紹了。關(guān)于和memcached具體可以看Django配置緩存機(jī)制
安裝該數(shù)據(jù)庫是為了做服務(wù)器緩存。以下兩種情況都適合使用服務(wù)器緩存:
1)數(shù)據(jù)非經(jīng)常更新。若每次都從硬盤讀取一次,浪費(fèi)服務(wù)器資源、拖慢響應(yīng)速度。
2)數(shù)據(jù)更新頻率較高,服務(wù)器負(fù)擔(dān)比較大。
這些數(shù)據(jù)只需每天更新一次。而我每次都從數(shù)據(jù)庫獲取相應(yīng)的數(shù)據(jù),計(jì)算統(tǒng)計(jì)排行情況和閱讀數(shù)。很明顯浪費(fèi)服務(wù)器資源,浪費(fèi)時(shí)間。解決方法是定時(shí)統(tǒng)計(jì)一次數(shù)據(jù),保存到數(shù)據(jù)庫或文件中。每次讀取數(shù)據(jù)從中獲取。
若保存到數(shù)據(jù)庫,還需要額外建立一張對(duì)應(yīng)的表存儲(chǔ)數(shù)據(jù)。在Django中建立表通常做法是建立一個(gè)模型??此坪唵?,問題調(diào)試麻煩、開發(fā)時(shí)長久。所以我一直拖著沒處理該問題。畢竟一開始訪問量不是很多。后來不少網(wǎng)友訪客打開慢(當(dāng)然服務(wù)器在國外也是個(gè)原因),查了資料發(fā)現(xiàn)Redis內(nèi)存數(shù)據(jù)庫??梢詫?shù)據(jù)寫入到內(nèi)存,再進(jìn)行讀寫。減少計(jì)算量,可以有效提高服務(wù)器響應(yīng)速度。
這么一來,我就不用創(chuàng)建新表創(chuàng)建模型。直接將數(shù)據(jù)寫入緩存,定時(shí)更新。獲取數(shù)據(jù)從服務(wù)器緩存獲取即可。
下面我就來介紹如何在Django中配置使用redis數(shù)據(jù)庫!
1、安裝redis
在Ubuntu中執(zhí)行下面這句命令:
sudo apt-get install redis-server
在Centos 中執(zhí)行下面這句命令:
sudo yum install redis-server
讀寫數(shù)據(jù)之前,記得開啟redis服務(wù)。否則會(huì)顯示No connect未連接錯(cuò)誤。
2、安裝django-redis和settings配置
執(zhí)行命令,即可安裝:
pip install django-redis
這是一個(gè)開源的項(xiàng)目,github地址是 https://github.com/niwibe/django-redis。
目前django-redis已更新到4.10.0版本。安裝完畢之后,給Django項(xiàng)目的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",
},
},
}
這樣是錯(cuò)誤的,估計(jì)是老版本的原因,暫時(shí)不必深究!
作為 session backend 使用配置
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "default"
3、測(cè)試redis緩存
該步驟非必須,只是為了測(cè)試看可否正常使用redis。
進(jìn)入django的后臺(tái)命令模式:
python manage.py shell
逐條輸入如下命令測(cè)試:
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的緩存
測(cè)試沒問題,則說明可正常使用。
4、redis緩存功能開發(fā)
這里需要考慮兩個(gè)問題:
- 寫入redis的數(shù)據(jù)是什么形式?
- 緩存時(shí)效多長?
redis支持字符串、列表、集合、字典等數(shù)據(jù)結(jié)構(gòu)。經(jīng)測(cè)試,可將Python的字典和列表直接存儲(chǔ)。你也可以用json模塊對(duì)字典和列表轉(zhuǎn)化成字符串再存儲(chǔ)。
至于緩存時(shí)效看具體情況,建議30分鐘或者1小時(shí)更新一次。原本我考慮1天更新1次數(shù)據(jù),但全球有很多個(gè)時(shí)區(qū)。不是每個(gè)時(shí)區(qū)都和我一樣在0點(diǎn)的時(shí)候看到更新結(jié)果。我們是東八區(qū),我們0點(diǎn)的時(shí)候,東九區(qū)是1點(diǎn)。所以,每1小時(shí)更新一次的頻率較為合適,你可以直接設(shè)置60*60秒。而我需要整點(diǎn)的時(shí)候更新,需要再多一步計(jì)算到下一個(gè)整點(diǎn)還有多少秒。
讀寫redis緩存代碼(這是重點(diǎn)):
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保存該數(shù)據(jù)的樣子,可進(jìn)入redis客戶端查看。輸入命令redis-cli進(jìn)入客戶端。
再分別輸入keys * 查看有那些鍵,再輸入get命令獲取數(shù)據(jù)。結(jié)果如下:
此文章同時(shí)同步到我的個(gè)人博客緣來來來 ? Django 添加自定義命令Django使用redis緩存服務(wù)器](https://www.fkomm.cn/article/2019/2/21/68.html)