1.wget http://zsj-linux.oss-cn-hangzhou.aliyuncs.com/redis-3.2.9.tar.gz 2.tar -zxvf redis-3.2.9.tar.gz 3.rm -rf redis-3.2.9.tar.gz 4.cd redis-3.2.9/ 5.Make 6.vim redis.conf 修改daemonize爲yes 7../redis-server /opt/redis-3.2.9/redis.conf 8.ps -aux |grep redis
一、Redis中的字符串linux
命令:redis
GET:獲取存儲在給定鍵中的值vim
get hello world
SET:設置存儲在給定鍵中的值緩存
set hello
DEL:刪除存儲在給定鍵中的值(這個命令能夠用於全部類型)數據結構
del hello
二、redis中的列表app
命令:函數
RPUSH:將給定值推入列表的右端post
rpush list-key item rpush list-key item2 rpush list-key item
LRANGE:獲取列表在給定範圍上的全部值spa
lrange list-key 0 -1
LINDEX:獲取列表在給定位置上的單個元素code
lindex list-key 1
LPOP:從列表的左端彈出一個值,並返回被彈出的值
lpop list-key
3. redis的集合
SADD:將給定元素添加到集合
sadd set-key item sadd set-key item2 sadd set-key item
返回1證實添加成功,返回0則表示元素已經存在
SMEMBERS:返回集合包含的全部元素
smembers set-key
SISMEMBER:檢查給定元素是否存在集合中
sismember set-key item sismember set-key item3
返回0證實不存在,1爲存在
SREM:若是給定的元素存在於集合中,那麼移除這個元素
srem set-key
3. redis散列
HSET:在散列裏面關聯起給定的鍵值對
hset hash-key sub-key1 value1 hset hash-key sub-key2 value2 hset hash-key sub-key1 value1
返回0,鍵值已存在,1爲存在。添加成功
HGET:獲取指定散列鍵的值
hget hash-key sub-key2
HGETALL:獲取散列包含的全部鍵值對
hgetall hash-key
HDEL:若是給定健存在於散列裏面,那麼移除這個鍵
hdel hash-key sub-key1
1.對文章進行投票
準備好須要用到的常量,計算文章的投票截止時間,檢查是否還能夠對文章進行投票,從article:id裏面取出文章的id,若是用戶第一次投票,增長投票數和評分
article_id = article.partition(':')[-1]
ONE_WEEK_IN_SECONDS = 7*86400 VOTE_SCORE = 432
def article_vote(conn,user,article); cutoff=time.time - ONE_WEEK_IN_SECONDS
if conn.zscore('time:',article)<cutoff; return;
article_id = article.partition(':')[-1]
if conn.sadd('voted:'+article_id,user); conn.zincrby('score:',article,VOTE_SCORE) conn.hincrby(article,'votes',1)
2.發佈並獲取文章
生成一個新的ID,將發佈文章的用戶添加到文章的已投票用戶名單裏,而後這個名單過時時間爲一週,將文章信息存儲到一個散列裏面,將文章添加到根據發佈時間排序的有序集合和根據評分排序的有序集合裏面
def post_article(conn,user,title,link); article_id = str(con.incr('article:'))
voted = 'voted:' +article_id conn.sadd(voted,user) conn.expire(voted,ONE_WEEK_IN_SECONDS) now = time.time()
article = 'article:'+article_id conn.hmset(article,{ 'title':title, 'link':link, 'poster':user, 'time':now, 'votes':1, })
conn.zadd('score:',article,now+VOTE_SCORE) conn.zadd('time:',article,now) return article_id
設置獲取文章的起始索引和結束索引,獲取多個文章id,根據文章ID獲取文章的詳細信息
ARTICLES_PER_PAGE = 25 def get_articles(conn,page,order='score:'); start = (page-1)*ARTICLES_PER_PAGE end = start + ARTICLES_PER_PAGE -1
ids = conn.zrevrange(order,start,end)
articles = [] for id in ids: article_data = conn.hgetall(id) article_data['id'] = id articles.append(article_data) return articles
3.對文章進行分組
構建存儲文章信息的鍵名,將文章添加到它所屬的羣組裏面,從羣組裏面移除文章
def add_remove_groups(conn,article_id,to_add[],to_remove=[]); article = 'article:'+article_id
for group in to_add: conn.sadd('group:' +group,article)
for group in to_remove: conn.srem('group:'+group,article)
爲每一個羣組的每種排序順序都建立一個鍵,檢查是否有已緩存的排序結果若是沒用的話就如今進行排序,根據評分或發佈時間對羣組文章進行排序,讓redis在60秒以後自動刪除這個有序排序,調用以前定義的get_articles()函數來進行分頁並獲取文章數據
def get_group_articles(conn,group,page,order='score:'): key = order+group
if not conn.exists(key):
conn.zinterstore(key, ['group:'+group,order], aggregate = 'max', )
conn.expire(key,60)
return get_articles(conn,page,key)