redis相信大家都很熟悉了湖员,和memcached一樣是一個高性能的key-value數(shù)據(jù)庫佑淀,至于什么是緩存服務(wù)器,度娘都有很明白的介紹了贸呢,我在這里就不一一介紹了。關(guān)于和memcached具體可以看Django配置緩存機制
安裝該數(shù)據(jù)庫是為了做服務(wù)器緩存拢军。以下兩種情況都適合使用服務(wù)器緩存:
1)數(shù)據(jù)非經(jīng)常更新楞陷。若每次都從硬盤讀取一次,浪費服務(wù)器資源朴沿、拖慢響應(yīng)速度猜谚。
2)數(shù)據(jù)更新頻率較高,服務(wù)器負擔比較大赌渣。
這些數(shù)據(jù)只需每天更新一次。而我每次都從數(shù)據(jù)庫獲取相應(yīng)的數(shù)據(jù)昌犹,計算統(tǒng)計排行情況和閱讀數(shù)坚芜。很明顯浪費服務(wù)器資源,浪費時間斜姥。解決方法是定時統(tǒng)計一次數(shù)據(jù)鸿竖,保存到數(shù)據(jù)庫或文件中。每次讀取數(shù)據(jù)從中獲取铸敏。
若保存到數(shù)據(jù)庫缚忧,還需要額外建立一張對應(yīng)的表存儲數(shù)據(jù)。在Django中建立表通常做法是建立一個模型杈笔∩了看似簡單,問題調(diào)試麻煩蒙具、開發(fā)時長久球榆。所以我一直拖著沒處理該問題。畢竟一開始訪問量不是很多禁筏。后來不少網(wǎng)友訪客打開慢(當然服務(wù)器在國外也是個原因)持钉,查了資料發(fā)現(xiàn)Redis內(nèi)存數(shù)據(jù)庫±槲簦可以將數(shù)據(jù)寫入到內(nèi)存每强,再進行讀寫。減少計算量,可以有效提高服務(wù)器響應(yīng)速度空执。
這么一來浪箭,我就不用創(chuàng)建新表創(chuàng)建模型。直接將數(shù)據(jù)寫入緩存脆烟,定時更新山林。獲取數(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ù)拜鹤。否則會顯示No connect未連接錯誤框冀。
2、安裝django-redis和settings配置
執(zhí)行命令敏簿,即可安裝:
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緩存功能開發(fā)
這里需要考慮兩個問題:
- 寫入redis的數(shù)據(jù)是什么形式醋寝?
- 緩存時效多長搞挣?
redis支持字符串、列表音羞、集合囱桨、字典等數(shù)據(jù)結(jié)構(gòu)。經(jīng)測試嗅绰,可將Python的字典和列表直接存儲舍肠。你也可以用json模塊對字典和列表轉(zhuǎn)化成字符串再存儲搀继。
至于緩存時效看具體情況,建議30分鐘或者1小時更新一次翠语。原本我考慮1天更新1次數(shù)據(jù)叽躯,但全球有很多個時區(qū)。不是每個時區(qū)都和我一樣在0點的時候看到更新結(jié)果肌括。我們是東八區(qū)点骑,我們0點的時候,東九區(qū)是1點谍夭。所以黑滴,每1小時更新一次的頻率較為合適,你可以直接設(shè)置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保存該數(shù)據(jù)的樣子珠漂,可進入redis客戶端查看晚缩。輸入命令redis-cli進入客戶端。
再分別輸入keys * 查看有那些鍵媳危,再輸入get命令獲取數(shù)據(jù)荞彼。結(jié)果如下:
![](https://resource.fkomm.cn/image/20190221150735.png)
此文章同時同步到我的個人博客緣來來來 ? Django 添加自定義命令Django使用redis緩存服務(wù)器](https://www.fkomm.cn/article/2019/2/21/68.html)