最近在學redis,本人菜鳥.**是過程式的,沒考慮優化.就是發篇文章記錄一下.感覺redis還是很強大的.
評分 = 支援票數*(86400/200)+時間戳, 文章獲得為200票就可以在首頁展示一天,隨著時間的流逝,當分數小於當前時間戳的時候,就從首頁撤下.
使用兩個有序集合來有序的儲存文章:第乙個有序集合的成員為文章id,分值為文章的發布時間;第二個有序集合的成員同樣為文章id,分值為文章的評分.通過這兩個有序集合,**既可以根據文章發布的時間來展示文章,也可以根據文章評分的高低來展示文章.
為了節約記憶體,一篇文章發布滿一周後將不能再對它進行投票,文章的評分將被固定下來,而記錄文章已投票的使用者名單的集合也會被刪除.
//建立文章
func createarticle(conn redis.conn, title, content, link string, userid int) (err error)
now := time.now().unix()
_, err = conn.do( //將文章詳情存入redis中
"hmset",
"article:"+strconv.itoa(articleid),
"title", title,
"content", content,
"link", link,
"votes", 1,
"author", userid,
"time", now,
)if nil != err
_, err = conn.do("sadd", "voted:"+strconv.itoa(articleid), userid) //將已投票使用者存入集合中
if nil != err
extime := time.now().unix() + 7*86400
_, err = conn.do("expireat", "voted:"+strconv.itoa(articleid), extime) //記錄過期時間為一周
if nil != err
_, err = conn.do("zadd", "score:", now+vote, articleid) //記錄文章分值
if nil != err
return nil
}
//對文章進行投票
func votearticle(conn redis.conn, articleid, userid int) (err error)
if reply < cutoff
bool, err := redis.bool(conn.do("sismember", "voted:"+strconv.itoa(articleid), userid)) //檢查是否已投過票
if nil != err
if bool
_, err = conn.do("sadd", "voted:"+strconv.itoa(articleid), userid) //將投票人id加入集合中
if nil != err
_, err = conn.do("hincrby", "article:"+strconv.itoa(articleid), "votes", 1) //文章得票 +1
if nil != err
_, err = conn.do("zincrby", "score:", vote, articleid) //增加文章得分
if nil != err
fmt.println(11)
return nil
}
//設定分頁
const (
articles_per_page = 2
)//獲取文章
func getarticles(conn redis.conn, page int) (ids int, err error)
return
}
const (
vote = 86400 / 200 //分值
)func main()
//建立文章
err = createarticle(conn, "第一篇", "內容1", "www.baidu.com", 1)
if nil != err
//對文章進行投票
err = votearticle(conn, 1, 2)
if nil != err
//獲取分數最高的文章,並進行分頁
ids, err := getarticles(conn, 1)
if nil !=err
}
Golang對檔案讀寫操作
package main import bufio fmt io os 寫func writefile path string 使用完畢,需要關閉檔案 defer f.close var buf string for i 0 i 5 i fmt.println n n 讀檔案內容方法 func re...
Golang 操作 Redis 示例
golang 操作 redis package main import fmt 引入 redis 包 通過 go 向 redis 寫入資料 err conn.do set name tom貓 if err nil 通過 go 向 redis 讀取資料 result,readerr conn.do g...
用redis對檔案進行訪問
檔案存入,用base64將檔案進行編碼,然後將檔案存入redis,適合檔案不長期儲存,如下 檔案提取,從redis中取出base64編碼,然後進行反編碼,生成檔案 file file newfile path string base64file base64.encode file if strin...