個人網站搭建 (第十七天) celery 定時刷新緩存

    當網站使用redis緩存時,就會涉及到緩存的過時時間,redis數據庫中的內容就會消失。這個時候進行用戶操做又會變慢,因此要採用一種辦法,當緩存恰好要過時時,可以使得redis數據庫自動對緩存內容進行更新。這個辦法就是使用 celery,具體配置及使用我已經先在Django框架17: Celery的使用中總結完畢,通常按着步驟實現就能夠了,這裏我只將定時刷新的功能實現一下。python

    按照Django框架17: Celery的使用配置好後,在須要添加任務的app/tasks.py添加:redis

from __future__ import absolute_import
from celery import shared_task
from read_statistics.utils import *


@shared_task
def get_post_list():
    """
    緩存博客列表
    """
    post_list = Post.objects.filter(Q(display=0) | Q(display__isnull=True))
    # 30*60表示30秒*60,也就是半小時
    cache.set('post_list', post_list, 30 * 60)


@shared_task
def get_new_publish():
    """
    緩存最新發表的15篇博客
    """
    new_publish = Post.objects.filter(Q(display=0) | Q(display__isnull=True))[:15]
    # 60*60表示60秒*60,也就是1小時
    cache.set('new_publish', new_publish, 30 * 60)


@shared_task
def get_new_recommend():
    """
    緩存最新推薦的博客
    """
    post_content_type = ContentType.objects.get_for_model(Post)
    new_recommend = get_new_recommend_post(post_content_type)
    # 60*60表示60秒*60,也就是1小時
    cache.set('new_recommend', new_recommend, 30 * 60)


@shared_task
def get_last_7_days_hot_data():
    """
    緩存周榜博客
    """
    last_7_days_hot_data = get_7_days_read_posts()
    # 60*60表示60秒*60,也就是1小時
    cache.set('last_7_days_hot_data', last_7_days_hot_data, 30 * 60)


@shared_task
def get_last_30_days_hot_data():
    """
    緩存月榜博客
    """
    last_30_days_hot_data = get_30_days_read_posts()
    # 60*60表示60秒*60,也就是1小時
    cache.set('last_30_days_hot_data', last_30_days_hot_data, 30 * 60)


@shared_task
def get_all_hot_posts():
    """
    緩存總榜博客
    """
    all_hot_posts = get_all_read_posts()
    # 60*60表示60秒*60,也就是1小時
    cache.set('all_hot_posts', all_hot_posts, 30 * 60)

    在這裏,我設置的緩存過時時間爲30分鐘,定時任務的時間間隔則須要去後臺開啓。我使用的是xadmin後臺,由於xadmin的註冊方式稍與admin註冊方式有所區別,因此djcelery應用並不會自動註冊到後臺應用,在xadmin管理界面也找不到,因此能夠同時打開xadmin後臺和admin後臺。數據庫

    完成tasks.py的編寫以後,還要運行定時進程,原本能夠將此進程放在Supervisor中掛起,考慮到環境配置和路徑比較繁瑣,我就直接直接經過nohup命令將程序以守護運行,一樣能夠打印出狀態信息。緩存

nohup python manage.py celery beat > celery-beat.log 2>&1 &

    在interval設置好定時間隔後,而後去periodic task中添加任務,並選擇對應任務的時間間隔。bash

原文出處:https://www.jzfblog.com/detail/118,文章的更新編輯以此連接爲準。歡迎關注源站文章!app

相關文章
相關標籤/搜索