天天看點

django 使用redis進行頁面資料緩存和更新緩存資料

轉自:https://blog.csdn.net/xiaohuoche175/article/details/89304601

在開發過程中會遇到一些頁面的資料是很長時間才進行更新的,不使用緩存的情況下,使用者每次通路這些都需要先去資料庫中擷取這些資料,當通路量較大時,這樣擷取資料的方式就會降低頁面的通路速度,影響效率,這時就可以使用redis将這些資料儲存起來,通過判斷是否生成過擷取以及是否更新過資料來生成新的緩存資料

具體操作如下:

在settings.py裡添加緩存設定

# Django的緩存配置

CACHES = {

"default": {

"BACKEND": "django_redis.cache.RedisCache",

"LOCATION": "redis://127.0.0.1:6379/9",

"OPTIONS": {

"CLIENT_CLASS": "django_redis.client.DefaultClient",

}

}

}

在對應的app中的views.py檔案中寫視圖邏輯和緩存操作

from django.core.cache import cache

from goods.models import GoodsType, GoodsSKU, IndexGoodsBanner,IndexPromotionBanner,IndexTypeGoodsBanner

# Create your views here.

class IndexView(View):

def get(self,request):

'''顯示首頁'''

# 嘗試從緩存中擷取資料

context = cache.get('index_page_data')

if context is None:

print('設定緩存')

# 緩存中沒有資料

# 擷取商品的種類資訊

types = GoodsType.objects.all()

print(types)

# 擷取首頁輪播商品資訊

goods_banners = IndexGoodsBanner.objects.all().order_by('index')

print(goods_banners)

# 擷取首頁促銷活動資訊

promotion_banners = IndexPromotionBanner.objects.all().order_by('index')

print(promotion_banners)

# 擷取首頁分類商品展示資訊

for type in types: # GoodsType

# 擷取type種類首頁分類商品的圖檔展示資訊

image_banners = IndexTypeGoodsBanner.objects.filter(type=type, display_type=1).order_by('index')

print(image_banners)

# 擷取type種類首頁分類商品的文字展示資訊

title_banners = IndexTypeGoodsBanner.objects.filter(type=type, display_type=0).order_by('index')

print(title_banners)

# 動态給type增加屬性,分别儲存首頁分類商品的圖檔展示資訊和文字展示資訊

type.image_banners = image_banners

type.title_banners = title_banners

context = {'types': types,

'goods_banners': goods_banners,

'promotion_banners': promotion_banners}

# 設定redis緩存

# key value timeout

cache.set('index_page_data', context, 3600)

return render(request, 'index.html', context)

在對應的app中的admin.py檔案中添加BaseModelAdmin,作用是當資料發生改變時,将之前的緩存删除,然後再通過視圖邏輯生成新的緩存

from django.contrib import admin

from django.core.cache import cache

from goods.models import GoodsType,IndexPromotionBanner,IndexGoodsBanner,IndexTypeGoodsBanner

# Register your models here.

class BaseModelAdmin(admin.ModelAdmin):

def save_model(self, request, obj, form, change):

'''新增或更新表中的資料時調用'''

super().save_model(request, obj, form, change)

# 發出任務,讓celery worker重新生成首頁靜态頁

from celery_tasks.tasks import generate_static_index_html

generate_static_index_html.delay()

# 清除首頁的緩存資料

cache.delete('index_page_data')

def delete_model(self, request, obj):

'''删除表中的資料時調用'''

super().delete_model(request, obj)

# 發出任務,讓celery worker重新生成首頁靜态頁

from celery_tasks.tasks import generate_static_index_html

generate_static_index_html.delay()

# 清除首頁的緩存資料

cache.delete('index_page_data')

class GoodsTypeAdmin(BaseModelAdmin):

pass

class IndexGoodsBannerAdmin(BaseModelAdmin):

pass

class IndexTypeGoodsBannerAdmin(BaseModelAdmin):

pass

class IndexPromotionBannerAdmin(BaseModelAdmin):

pass

admin.site.register(GoodsType, GoodsTypeAdmin)

admin.site.register(IndexGoodsBanner, IndexGoodsBannerAdmin)

admin.site.register(IndexTypeGoodsBanner, IndexTypeGoodsBannerAdmin)

admin.site.register(IndexPromotionBanner, IndexPromotionBannerAdmin)

————————————————

版權聲明:本文為CSDN部落客「小火skr車」的原創文章,遵循 CC 4.0 BY-SA 版權協定,轉載請附上原文出處連結及本聲明。

原文連結:https://blog.csdn.net/xiaohuoche175/article/details/89304601

轉載于:https://www.cnblogs.com/linwenbin/p/11485608.html