Redis 入门

刚开始学习用Django框架做网站,遇到了一个需求:显示浏览次数

很常规的需求,但如果在数据库中储存显得不太现实(太慢了,还会有很多问题)

就这样我了解到了redis数据库,不同于传统的mysql数据库

1Redis数据库把数据完全存在内存中,仅使用磁盘进行持久化

2Redis 读取迅速,操作具有原子性,如果两个客户并发访问,那么redis服务器会接受更新的值

百度百科上对redis的解释

Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

从2010年3月15日起,Redis的开发工作由VMware主持。

从2013年5月开始,Redis的开发由Pivotal赞助。

                  
   

 

 

 

 

 

 

 

 

 

 

 

我们马上装好redis并来尝试一下吧(笔者使用的windows系统)

redis存储数据类型和基础语法

string

使用set get语法

127.0.0.1:6379> set name 'cyx'
OK
127.0.0.1:6379> get name
"cyx"

hash

使用hmset key field1 value1 [field2...]存储

hget field 取出数据

127.0.0.1:6379>  HMSET myhash 1 cyx 2 wyx 3 rhc
OK
127.0.0.1:6379> HGET myhash 1
"cyx"
127.0.0.1:6379> HGET myhash 2
"wyx"
127.0.0.1:6379> HGET myhash 3
"rhc"

list

使用lpush key value1 [value2...]存储

使用lrange key start stop取出从start索引到stop索引位置之间的数据

127.0.0.1:6379> lpush friends cyx wyx rhc zyl
(integer) 4
127.0.0.1:6379> lpush friends xkx
(integer) 5
127.0.0.1:6379> lrange friends 0 7
1) "xkx"
2) "zyl"
3) "rhc"
4) "wyx"
5) "cyx"

Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,

这就意味着集合中不能出现重复的数据。

使用 sadd key member...向集合加入元素

smember 取出集合元素

观察右面例子看出我们在集合中插入已经存在的元素会无法插入,

当我们取出元素1 2 3 4时并未按照顺序来顺序并不相同

127.0.0.1:6379> sadd mykey 1 2 3 4
(integer) 4
127.0.0.1:6379> sadd mykey cyx
(integer) 1
127.0.0.1:6379> SMEMBERS mykey
1) "3"
2) "4"
3) "2"
4) "1"
5) "cyx"
127.0.0.1:6379> sadd mykey cyx
(integer) 0
127.0.0.1:6379> smembers mykey
1) "4"
2) "2"
3) "1"
4) "3"
5) "cyx"

Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。

不同的是每个元素都会关联一个double类型的分数(score)。

redis正是通过分数来为集合中的成员进行从小到大的排序。分数可以重复

使用zadd key score member 添加使用zrangebyscore 取出指定score关联的数据

 127.0.0.1:6379> zadd schools 0 Peking
(integer) 1
127.0.0.1:6379> zadd schools 1 Peking
(integer) 0
127.0.0.1:6379> zadd schools 0 Ouc
(integer) 1
127.0.0.1:6379> ZRANGEBYSCORE schools 0 1
1) "Ouc"
2) "Peking"
127.0.0.1:6379> zadd schools 3 zyz
(integer) 1
127.0.0.1:6379> zadd schools 2 a
(integer) 1
127.0.0.1:6379> ZRANGEBYSCORE schools 0 1
1) "Ouc"
2) "Peking"
127.0.0.1:6379> ZRANGEBYSCORE schools 0 4
1) "Ouc"
2) "Peking"
3) "a"
4) "zyz"

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

有了基础,下面我们在Django中实现浏览次数和最热文章(当然要先配置好redis库)

 

#setting
REDIS_HOST = 'localhost'
REDIS_PORT = '6379'
REDIS_DB = 0


#views
from django.conf import settings
import redis


r = redis.StrictRedis(host=settings.REDIS_HOST, port=settings.REDIS_PORT db=settings.REDIS_DB)

#1    total_view = r.incr("article:{}:views".format(blog_id))
#2    r.zincrby('article_ranking', blog_id, 1)
#3    article_ranking = r.zrange('article_ranking',0,-1,desc=True)[:5]
#4    article_ranking_ids = [int(id) for id in article_ranking]
#5    most_viewed = list(Blog.objects.filter(id__in=article_ranking_ids))
#6    most_viewed.sort(key=lambda x:article_ranking_ids.index(x.id))

 

 

 

 核心代码如上,在此解释一下:

配置不用多说,

#1  "article:{}:views".format(blog_id),是一个key,虽然命名没有强制要求,但比较好的是“对象类型:对象id:对象属性”。

使用了incr函数,就是在每次get请求到来时使我们的 "article:{}:views".format(blog_id)的value值自增1

#2  使用zincrby函数,原型为zincrby(name,value,amount),设置amount的值来增加有序集合name中value的对应的score的值,这里既是每次访问。就在'article_ranking'这个有序集合中增加blog_id(自定)的scroe值,每次加1(初始为0)

#3 使用zrange函数,返回有序集合中指定区间的成员,这里从0开始到最后(-1)desc=True是指定从大到小排序,最后是列表切片,获得前5名

#4 列表表达式,生成一个id值为int型的前五排名列表

#5 从数据库里查出对应的Blog对象

#6 使用python的sort函数,排序方法是most_viewed列表中的每个对象的id在article_ranking_ids的排名

最后我们就得到了按浏览次数排好的一个列表,你可以把他返回html页面中,显示文章名字。

ps:富文本有点不习惯


   
posted @ 2018-12-02 16:56  Permanently  阅读(116)  评论(0)    收藏  举报