當網站使用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