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.5
django-redis==4.4.2
APScheduler==3.1.0

settings.py配置

新增内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
from urllib.parse import urlparse
import 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配置

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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,内容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""
Topic: redis缓存管理器
"""
from ..models import Post
from redis_cache import get_redis_connection
from apscheduler.schedulers.background import BackgroundScheduler RUNNING_TIMER = False
REDIS_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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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)

其他的我就不多演示了。

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

  1. Django1.7开发博客

    转自: http://www.pycoding.com/articles/category/django 基于最新的django1.7写的,通俗易懂,非常适合新手入门. 感谢博主! 参考教程: htt ...

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

    xadmin是一个django的管理后台实现,使用了更加灵活的架构设计及Bootstrap UI框架, 目的是替换现有的admin,国人开发,有许多新的特性: 兼容 Django Admin 使用 B ...

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

    国际化与本地化的目的为了能为各个不同的用户以他们最熟悉的语言和格式来显示网页. Django能完美支持文本翻译.日期时间和数字的格式化.时区. 另外,Django还有两点优势: 允许开发者和模板作者指 ...

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

    TinyMCE是一个轻量级的基于浏览器的所见即所得编辑器,支持目前流行的各种浏览器,由JavaScript写成. 功能配置灵活简单(两行代码就可以将编辑器嵌入网页中),支持AJAX.另一特点是加载速度 ...

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

    到现在为止我们已经完成的差不多了,并且基本的东西都已经学到了,是时候用起来了. 我们的博客还有很多功能需要完善,下面抛砖引玉新增几个功能,还有其他功能等你自己去发现和实现. 草稿箱 之前我们新建文章的 ...

  6. Django1.9开发博客(7)- 实现功能

    到目前为止我们已经完成了一个django应用的所有基础部分. 包括url配置.视图.模型和模板.接下来开始继续完善我们的博客系统了. 首先我们需要一个显示每篇文章的详细页面,对不? 文章详情 对于首页 ...

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

    Django本身不提供全文检索的功能,但django-haystack为其提供了全文检索的框架. django-haystack能为Django提供whoosh,solr,Xapian和Elastic ...

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

    你应该注意到了一点,当你去新建.修改和删除文章的时候并不需要登录,这样的话任何浏览网站的用户都能随时修改和删除我的文章.这个可不是我想要的! 编辑和删除的认证 我们需要保护post_new, post ...

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

    模板继承就是网站的多个页面可以共享同一个页面布局或者是页面的某几个部分的内容.通过这种方式你就需要在每个页面复制粘贴同样的代码了. 如果你想改变页面某个公共部分,你不需要每个页面的去修改,只需要修改一 ...

随机推荐

  1. HTTP协议上传boundary确定&下载content-disposition理解

    HTTP协议上传文件-协议 上传文件需要将form标签 的 ENCTYPE 属性设置为 multipart/form-data属性, 与 application/x-www-form-urlencod ...

  2. RDIFramework.NET ━ .NET快速信息化系统开发框架 V2.8 版本━新增企业通(内部简易聊天工具)

    RDIFramework.NET ━ .NET快速信息化系统开发框架 V2.8 版本 新增企业通(内部简易聊天工具) RDIFramework.NET,基于.NET的快速信息化系统开发.整合框架,给用 ...

  3. 解决SQLSERVER在还原数据时出现的“FILESTREAM功能被禁用”问题

    解决SQLSERVER在还原数据时出现的“FILESTREAM功能被禁用”问题 今天由于测试需要,在网上下载了Adventureworks2008实例数据库的BAK文件,进行还原时出现了这样的错误“F ...

  4. 谷歌大神Jeff Dean:大规模深度学习最新进展 zz

    http://www.tuicool.com/articles/MBBbeeQ 在AlphaGo与李世石比赛期间,谷歌天才工程师Jeff Dean在Google Campus汉城校区做了一次关于智能计 ...

  5. 随机采样方法整理与讲解(MCMC、Gibbs Sampling等)

    本文是对参考资料中多篇关于sampling的内容进行总结+搬运,方便以后自己翻阅.其实参考资料中的资料写的比我好,大家可以看一下!好东西多分享!PRML的第11章也是sampling,有时间后面写到P ...

  6. android stutio 快捷键

    [F] [F] F2 在错误代码之间切换 F3 往前定位(Shift + F3:往后定位 )有问题 F4\Ctrl+鼠标点击\Ctrl+B 转到定义,查看类继承关系 F5 但不调试进入函数内部. F6 ...

  7. 161221、bootstrap table 实例

    bootstrap table 封装了一套完善的数据表格组件,把下面的代码复制一下估计你需要的基本功能都有了,没有的再看看手册对比着我给的实例也能很快的熟悉了 客户端 <!DOCTYPE htm ...

  8. C#:绘图问题

    1.设置DPI Bitmap bitmap2 = new Bitmap((int)w, (int)h); bitmap2.SetResolution(, ); 2.设置Graphic(如:去锯齿等) ...

  9. php缓冲区 sapi缓冲区

    <?php#设置php.ini中output_buffering = 32#使用apache可以看到效果 #nginx+php-fpm看不到效果 nginx缓存 sockets通信问题?#imp ...

  10. java 字符串类型String

    在本质上,字符串实际上一个char类型的数组,由java.lang.String类来表示,该类具有一系列的属性和方法,提供对字符串的一些操作.除此之外,java还提供了StringBuffer类来处理 ...