美文网首页
Redis数据库

Redis数据库

作者: 叶田的学习笔记 | 来源:发表于2018-10-19 21:11 被阅读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对应的有序集合的元素

    相关文章

      网友评论

          本文标题:Redis数据库

          本文链接:https://www.haomeiwen.com/subject/mqruzftx.html