Redis数据库

2018-10-19  本文已影响0人  叶田的学习笔记

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对应的有序集合的元素

上一篇下一篇

猜你喜欢

热点阅读