一.配置文件settings.py中
# 设置django缓存存放位置为redis数据库,并设置一个默认(default)选项,在redis中(配置文件/etc/redis/redis.conf)开启了RDB持久化储存 # pip install django-redis, 然后在视图中可以通过 from django_redis import get_redis_connection 这个方法和redis数据库进行连接 CACHES = { "default": { "BACKEND": "django_redis.cache.RedisCache", # redis服务器的ip地址及端口号,及数据库序号,redis一共有15个数据库 0~15 "LOCATION": "redis://127.0.0.1:6379/6",
# "LOCATION": "redis://:passwordpassword@47.193.146.xxx:6379/0", # 如果redis设置密码的话,需要以这种格式进行设置,host前面是密码 "OPTIONS": { "CLIENT_CLASS": "django_redis.client.DefaultClient", } } }
二.某个应用的视图文件views.py中
from django.shortcuts import render, redirect from django.views.generic import View from goods.models import GoodsType, IndexGoodsBanner, IndexPromotionBanner, IndexTypeGoodsBanner, GoodsSKU from order.models import OrderGoods from django_redis import get_redis_connection # 使用该模块的方法, 可以设置和取出缓存(缓存一些无须用户登录就可以获取的数据) # 保存缓存的载体已经在settings中设置成redis from django.core.cache import cache from django.core.urlresolvers import reverse from django.core.paginator import Paginator # http://127.0.0.1:8000/index class IndexView(View): """首页""" def get(self, request): """显示网页""" # 每次来自浏览器首页的请求,都先尝试获取缓存 context = cache.get('index_page_data')
# 删除缓存
# cache.delete("键名")
if context is None: # 获取商品分类信息, 有那几大类商品 types = GoodsType.objects.all() # 获取首页轮播商品的信息 index_banner = IndexGoodsBanner.objects.all().order_by('index') # 获取首页促销活动的信息 promotion_banner = IndexPromotionBanner.objects.all().order_by('index') # 获取首页分类商品活动的信息 # types_goods_banner = IndexTypeGoodsBanner.objects.all() for type in types: # 根据type查询type种类首页展示的文字商品信息和图片商品信息 title_banner = IndexTypeGoodsBanner.objects.filter(type=type, display_type=0).order_by('index') image_banner = IndexTypeGoodsBanner.objects.filter(type=type, display_type=1).order_by('index') # 给type对象增加两个属性title_banner, image_banner # 分别保存type种类首页展示的文字商品信息和图片商品信息 type.title_banner = title_banner type.image_banner = image_banner # 将购物车显示数量设置为零 cart_count = 0 # 组织缓存的上下文 context = { 'types': types, 'index_banner': index_banner, 'promotion_banner': promotion_banner, 'cart_count': cart_count } # 设置缓存, 第一个参数是键名,第二个值,第三个是过期时间, 不设置过期时间,就是永不过期 cache.set('index_page_data', context, 3600)# 获取登录用户后购物车商品的数目,先设置为零 cart_count = 0 # 获取user user = request.user if user.is_authenticated(): # 用户已登录 conn = get_redis_connection('default') cart_key = 'cart_%d'%user.id cart_count = conn.hlen(cart_key) # 更新模板上下文 context.update(cart_count=cart_count) # 使用模板 return render(request, 'index.html', context)
这里既使用cache模块将数据保存到redis中(已经在配置文件中将缓存数据库设置为了redis), 也使用了django_redis模块的get_redis_connection()方法进行保存数据, 个人理解:缓存这里和redis肯定建立的是长连接,使用get_redis_connection()可能建立的是短链接。但是直接使用cache,只可以使用cache,get()进行获取数据, 使用cache.set()进行设置缓存. 但是,使用get_redis_connection(),可以自由使用redis的各种数据格式进行保存数据,更加灵活多变.