Redis这种Key/value的存储方式,使得它很适合做缓存数据库。
启动Redis
redis-server
redis-cli --raw (显示中文)
安装Redis库
pip install redis
settings.py配置
REDIS_HOST = 'localhost'
REDIS_PORT = 6379
REDIS_DB = 0
views.py,建立与Redis数据库的连接
import redis
from django.conf import settings
r = redis.StrictRedis(host=settings.REDIS_HOST,port=settings.REDIS_PORT,db=settings.REDIS_DB)
举例,实现记录阅读次数功能
def article_detail(request,id,slug):
article = get_object_or_404(ArticlePost,id=id,slug=slug)
total_views = r.incr('article:{}:views'.format(article.id))
return render(request,'article/list/article_detail.html',locals())
incr(),让当前的键值递增1,并返回递增后的值。
如果键不存在,则在执行操作之前将其设置为0。 如果键包含错误类型的值或包含无法表示为整数的字符串,则会返回错误。此操作限于64位有符号整数。
Redis对于键的命名没有强制要求,比较好的命名格式是:
“对象类型:对象ID:对象属性”
article:15:views 用来存储ID为15的文章的浏览次数
在模板中的应用,article_detail.html
<p>
<a href="{% url 'article:author_articles' article.author.username %}">
{{ article.author.username }}
</a>
<span style="margin-left:20px" class="glyphicon glyphicon-thumbs-up">{{ total_likes }}like{{ total_likes | pluralize }}</span>
<span style="margin-left: 20px">{{ total_views }}view{{ total_views | pluralize }}</span>
</p>
实现显示最热文章,改写article_detail()方法
def article_detail(request,id,slug):
# 记录阅读次数
article = get_object_or_404(ArticlePost,id=id,slug=slug)
total_views = r.incr('article:{}:views'.format(article.id))
# 显示最热文章
r.zincrby('article_ranking',article.id,1)
article_ranking = r.zrange('article_ranking',0,-1,desc=True)[:10] # 得到article_ranking中排序前10名的对象
article_ranking_ids = [int(id) for id in article_ranking]
most_viewed = list(ArticlePost.objects.filter(id__in=article_ranking_ids)) # 得到最热文章对象组成的列表,list()将元组或字符串转换成列表
most_viewed.sort(key=lambda x: article_ranking_ids.index(x.id)) # 用匿名函数lambda 对得到的列表进行排序
return render(request,'article/list/article_detail.html',locals())
r.zincrby(name, value, amount=1)
说明: 为有序集合name的成员value的score加上增量amount。
如果在键为name的zset中已经存在元素value,则将该元素的score增加amount;否则向该集合中添加该元素,其score的值为amount。
若有序集name不存在,就创建一个只含有成员value的有序集合。
若name不是有序集类型,返回一个错误。
r.zrange(name, start, end, desc=False, withscores=False, score_cast_func=<type 'float'>)
说明: 返回有序集合name中指定区间的成员desc是否逆向排序,withscores是否显示score
按照索引范围获取name对应的有序集合的元素
网友评论