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:富文本有点不习惯 |

浙公网安备 33010602011771号