之前也用过redis.不过只是走马观花的了解了一下,能满足当时的情况需求,但是知识不成体系,看了用了也就忘了, 最近又把redis实战一书翻了一遍, 知识点又重新捡了起来,这次准备做一次完整的总结。由于时间的关系,我会慢慢的进行不定期的更新。
redis的好处我就不多叙述了,如果没用过redis ,快速入门的教程在这:http://www.jianshu.com/p/fc994da72d09
下面上图,图中记录了常用的redis 命令:
完整的命令请自行查阅官网:https://redis.io/commands
python 驱动Redis
小案例
浓缩了redis数据结构中方法的使用。
<pre>
author = 'YuLuo'
import redis
import time
import json
'''定义常量'''
ONE_WEEK_IN_SECONDS = 7 * 86400
VOTE_SCORE = 432
class Redisx(object):
def init(self ,host= '192.168.1.15' ,port = 6379 , db = 0):
self.conn = redis.Redis(host , port , db)
def publish_article(self , user = u'起个名忒难' , title = 'hello redis', link = 'http://www.baidu.com'):
'''
发布文章
:param user:
:param title:
:param link:
:return:
'''
article_id = str(self.conn.incr('article:id')) #文章id编号
voted = 'voted:'+article_id
self.conn.sadd(voted , user ) #放入已投票集合
self.conn.expire(voted , ONE_WEEK_IN_SECONDS) #设置键的过期时间
publie_date = time.time() #文章发布时间
article = 'article:' + article_id # 文章id
self.conn.hmset(article , { #创建文章信息
'title': title,
'link': link,
'user': user,
'time': publie_date,
'votes': 1
})
self.conn.zadd('score:' , article , ONE_WEEK_IN_SECONDS+VOTE_SCORE) #放入有序表score:
self.conn.zadd('time:' , article , publie_date) #放入以发布时间作为分数的有序表time:
print('publish article success ')
return article_id
def article_voted(self , user , article_id):
'''
文章投票
:param user:
:param article_id:
:return:
'''
cutoff = time.time() - ONE_WEEK_IN_SECONDS
article = 'article:'+article_id
if self.conn.zscore('time:' ,article) < cutoff : #判断投票时间是否截至
return
if self.conn.sadd('voted:'+id , user): #判断用户是否已经投过票
self.conn.zincrby('score:' , article , VOTE_SCORE) # 增加分值
self.conn.hincrby(article , 'votes' ,1) #文章得票数+1
print('voted success')
def get_artcile(self , article_id):
'''
获取文章信息
:param article_id:
:return:
'''
article = 'article:'+article_id
article_info = self.conn.hgetall(article)
return article_info #返回文章信息
def article_group(self , id , toadd = [] , toremove = []):
'''
添加文章到分组
:param id:
:param toadd: 分组编号
:param toremove:
:return:
'''
article = 'article:'+id
for group in toadd:
self.conn.sadd('group:'+str(group) , article)
for group in toremove:
self.conn.srem('group:'+str(group) , article)
def get_article_by_group(self ,group):
'''
根据分组获取文章分组
:param group:
:return:
'''
article_list = self.conn.smembers(group)
articles = []
for article in article_list:
articles.append(self.get_artcile(str(article).split(':')[1]))
return articles #返回文章列表
if name == 'main':
client = Redisx()
id = client.publish_article()
client.article_voted('zhangsan' , id)
artcile = client.get_artcile(id)
print artcile
client.article_group(id , [1 ,3,5])
articles = client.get_article_by_group('group:1')
list_json = json.dumps(articles, ensure_ascii=False)
print list_json
</pre>
其他操作:
flushdb 删除当前数据库
flushall 删除所有数据库
type key 查看当前键的类型
redis-cli , 中文是‘\xx5\xx’类型的编码,使用redis-cli --raw .换成中文显示
少年听雨歌楼上,红烛昏罗帐。
壮年听雨客舟中,江阔云低,断雁叫西风。
感谢支持!
---起个名忒难