golang使用redis對文章進行投票

2021-09-13 12:53:53 字數 2360 閱讀 4848

最近在學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...