Django1.9开发博客(13)- redis缓存

Redis 是一个高性能的key-value数据库。redis的出现, 很大程度补偿了memcached这类keyvalue存储的不足,在部分场合可以对关系数据库起到很好的补充作用。 它提供了Python,Ruby,Erlang,PHP客户端,使用很方便。

目前Redis已经发布了3.0版本,正式支持分布式,这个特性太强大,以至于你再不用就对不住自己了。

性能测试

服务器配置:Linux 2.6, Xeon X3320 2.5Ghz

SET操作每秒钟110000次,GET操作每秒钟81000次

stackoverflow网站使用Redis做为缓存服务器。

安装redis

服务器安装篇我写了专门文章, 请参阅redis入门与安装

django中的配置

我们希望在本博客系统中,对于文章点击数、阅览数等数据实现缓存,提高效率。

requirements.txt

添加如下内容,方便以后安装软件依赖,由于在pythonanywhere上面并不能安装redis服务,所以本章只能在本地测试。

redis==2.10.5django-redis==4.4.2APScheduler==3.1.0

settings.py配置

新增内容

123456789101112131415161718192021222324252627
from urllib.parse import urlparseimport dj_database_url

redis_url = urlparse(os.environ.get(‘REDISTOGO_URL‘, ‘redis://localhost:6959‘))CACHES = {    ‘default‘: {        ‘BACKEND‘: ‘redis_cache.cache.RedisCache‘,        ‘LOCATION‘: ‘{0}:{1}‘.format(redis_url.hostname, redis_url.port),        ‘OPTIONS‘: {            ‘DB‘: 0,            ‘PASSWORD‘: redis_url.password,            ‘CLIENT_CLASS‘: ‘redis_cache.client.DefaultClient‘,            ‘PICKLE_VERSION‘: -1,  # Use the latest protocol version            ‘SOCKET_TIMEOUT‘: 60,  # in seconds            ‘IGNORE_EXCEPTIONS‘: True,        }    }}

SESSION_ENGINE = ‘django.contrib.sessions.backends.cache‘SESSION_CACHE_ALIAS = ‘default‘

# 本地开发配置放在local_settings.py中try:    from .local_settings import *except ImportError:    pass

local_settings.py配置

这个是本地开发时候使用到的配置文件

123456789101112131415
DEBUG = True

CACHES = {    ‘default‘: {        ‘BACKEND‘: ‘redis_cache.cache.RedisCache‘,        ‘LOCATION‘: ‘192.168.203.95:6379:1‘,        ‘OPTIONS‘: {            ‘CLIENT_CLASS‘: ‘redis_cache.client.DefaultClient‘,            # ‘PASSWORD‘: ‘secretpassword‘,            ‘PICKLE_VERSION‘: -1,  # Use the latest protocol version            ‘SOCKET_TIMEOUT‘: 60,  # in seconds            ‘IGNORE_EXCEPTIONS‘: True,        }    }}

使用方法

cache_manager.py缓存管理器

我们新建一个缓存管理器cache_manager.py,内容如下

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
#!/usr/bin/env python# -*- encoding: utf-8 -*-"""Topic: redis缓存管理器"""from ..models import Postfrom redis_cache import get_redis_connectionfrom apscheduler.schedulers.background import BackgroundScheduler

RUNNING_TIMER = FalseREDIS_DB = get_redis_connection(‘default‘)

def update_click(post):    """ 更新点击数 """    if REDIS_DB.hexists("CLICKS", post.id):        print(‘REDIS_DB.hexists...‘ + str(post.id))        REDIS_DB.hincrby(‘CLICKS‘, post.id)    else:        print(‘REDIS_DB.not_hexists...‘ + str(post.id))        REDIS_DB.hset(‘CLICKS‘, post.id, post.click + 1)    run_timer()

def get_click(post):    """ 获取点击数 """    if REDIS_DB.hexists("CLICKS", post.id):        return REDIS_DB.hget(‘CLICKS‘, post.id)    else:        REDIS_DB.hset(‘CLICKS‘, post.id, post.click)        return post.click

def sync_click():    """同步文章点击数"""    print(‘同步文章点击数start....‘)    for k in REDIS_DB.hkeys(‘CLICKS‘):        try:            p = Post.objects.get(k)            print(‘db_click={0}‘.format(p.click))            cache_click = get_click(p.id)            print(‘cache_click={0}‘.format(cache_click))            if cache_click != p.click:                p.click = get_click(p.id)                p.save()        except:            pass

views.py修改

然后我们修改view.py,在相应的action里使用这个cache_manager:

12345678910111213141516171819
from .commons import cache_manager

def post_list(request):    """所有已发布文章"""    posts = Post.objects.annotate(num_comment=Count(‘comment‘)).filter(        published_date__isnull=False).prefetch_related(        ‘category‘).prefetch_related(‘tags‘).order_by(‘-published_date‘)    for p in posts:        p.click = cache_manager.get_click(p)    return render(request, ‘blog/post_list.html‘, {‘posts‘: posts})

def post_detail(request, pk):    try:        pass    except:        raise Http404()    if post.published_date:        cache_manager.update_click(post)        post.click = cache_manager.get_click(post)

其他的我就不多演示了。

时间: 2024-08-05 02:55:23

Django1.9开发博客(13)- redis缓存的相关文章

Django1.7开发博客

转自: http://www.pycoding.com/articles/category/django 基于最新的django1.7写的,通俗易懂,非常适合新手入门. 感谢博主! 参考教程: http://tutorial.djangogirls.org/ GitHub项目地址: https://github.com/yidao620c/simpleblog Heroku演示地址: https://yidaoblog.herokuapp.com/   教程目录: 使用Django1.7开发博客

Django1.9开发博客(14)- 集成Xadmin

xadmin是一个django的管理后台实现,使用了更加灵活的架构设计及Bootstrap UI框架, 目的是替换现有的admin,国人开发,有许多新的特性: 兼容 Django Admin 使用 Bootstrap 作为 UI 框架 编辑页面灵活布局 主页面仪表盘及小部件 过滤器强化 数据导出 强大的插件机制 与django的集成 本篇以simpleblog项目为例,介绍下怎样在django中集成xadmin python2.7环境切换 注意,前面的教程都是在python3.4环境下开放的.

wordpress博客安装redis缓存

Redis是一个开源.支持网络.基于内存的key-value存储系统,类似memcached,性能极高,支持超过100K+ 每秒的读写频率,一些大型的网站例如ITeye(JavaEye)和CSDN现在都用到了Redis. 与memcached相比,Redis提供了持久化存储,重启了服务器后memcached需要重新创建缓存,而Redis依赖快照进行持久化,即使服务器刚开机启动也不会导致负载陡增.Redis缓存比较适合大流量的Wordpress. 当你的WordPress中的文章达到上万篇,随着流

Django1.9开发博客(12)- i18n国际化

国际化与本地化的目的为了能为各个不同的用户以他们最熟悉的语言和格式来显示网页. Django能完美支持文本翻译.日期时间和数字的格式化.时区. 另外,Django还有两点优势: 允许开发者和模板作者指定他们哪些app应该被翻译或被格式化为本地形式. 允许用户根据自己的偏好来实现本地化显示.翻译依据语言,格式化依据国家, 这些信息由浏览器中的Accept-Language头来决定.不过目前为止时区还未能实现. 参考官方文档:https://docs.djangoproject.com/en/1.9

Django1.9开发博客(8)- 继续完善

到现在为止我们已经完成的差不多了,并且基本的东西都已经学到了,是时候用起来了. 我们的博客还有很多功能需要完善,下面抛砖引玉新增几个功能,还有其他功能等你自己去发现和实现. 草稿箱 之前我们新建文章的时候只是是保存到数据库,也就是仅仅保存了草稿,还没有对外发布, 在博客首页上面是看不到的,因为published_date字段为空.这里我们需要添加一个草稿箱的链接.还是四部曲. 第一步,添加一个链接: 打开mysite/templates/mysite/base.html文件,在 1 <h1>&

Django1.9开发博客(11)- 富文本与代码高亮

TinyMCE是一个轻量级的基于浏览器的所见即所得编辑器,支持目前流行的各种浏览器,由JavaScript写成. 功能配置灵活简单(两行代码就可以将编辑器嵌入网页中),支持AJAX.另一特点是加载速度非常快. django里引用TinyMCE富文本编辑器,其实很简单,前提是你知道django的静态文件配置. 其实这个我已经在前面文章提到过,可以回去再看看. TinyMCE的官方网站是:http://www.tinymce.com/ 下载地址:http://download.moxiecode.c

Django1.9开发博客(10)- 全文搜索

Django本身不提供全文检索的功能,但django-haystack为其提供了全文检索的框架. django-haystack能为Django提供whoosh,solr,Xapian和Elasticsearc四种全文检索引擎作为后端. 其中whoosh为纯python的实现,不是非常大型的应用,是没有问题的. 本文将介绍Django1.9中通过django-haystack与whoosh集成以及whoosh的中文支持. 安装依赖: pip install django-haystackpip

Django1.9开发博客(9)- 用户认证

你应该注意到了一点,当你去新建.修改和删除文章的时候并不需要登录,这样的话任何浏览网站的用户都能随时修改和删除我的文章.这个可不是我想要的! 编辑和删除的认证 我们需要保护post_new, post_edit和post_publish这三个视图,只有登录用户才有权去执行. django为我们提供了很好的帮助类,其实就是利用了python中的decorators技术. django中认证的装饰器位于模块django.contrib.auth.decorators中,名称叫login_requir

Django1.9开发博客(6)- 模板继承

模板继承就是网站的多个页面可以共享同一个页面布局或者是页面的某几个部分的内容.通过这种方式你就需要在每个页面复制粘贴同样的代码了. 如果你想改变页面某个公共部分,你不需要每个页面的去修改,只需要修改一个模板就行了,这样最大化复用,减少了冗余,也减少了出错的几率,而且你敲的代码也少了. 创建一个base模板 一个base模板就是你全站所有页面都会继承的最基本的网站框架模板.我们在blog/templates/blog/中创建一个base.html模板: blog └───templates └──