Django使用redis緩存服務(wù)器

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é)果如下:

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市待笑,隨后出現(xiàn)的幾起案子卿泽,更是在濱河造成了極大的恐慌,老刑警劉巖滋觉,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異齐邦,居然都是意外死亡椎侠,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門措拇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人丐吓,你說我怎么就攤上這事∪纾” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵粘衬,是天一觀的道長荞估。 經(jīng)常有香客問我咳促,道長,這世上最難降的妖魔是什么跪腹? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任飞醉,我火速辦了婚禮冲茸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘缅帘。我一直安慰自己轴术,他們只是感情好,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布股毫。 她就那樣靜靜地躺著,像睡著了一般铃诬。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上趣席,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機與錄音想罕,去河邊找鬼。 笑死按价,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的笙瑟。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼框产,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了秉宿?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤屯碴,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后窿锉,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體膝舅,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡窑多,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了埂息。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡享幽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出拾弃,到底是詐尸還是另有隱情值桩,我是刑警寧澤豪椿,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站搭盾,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏鸯隅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一蝌以、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧跟畅,春花似錦、人聲如沸碍彭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽舰褪。三九已至,卻和暖如春占拍,著一層夾襖步出監(jiān)牢的瞬間捎迫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工窄绒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人彰导。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓敲茄,卻偏偏與公主長得像位谋,于是被迫代替她去往敵國和親堰燎。 傳聞我的和親對象是個殘疾皇子掏父,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容