最近在學redis,本人菜鳥.代碼是過程式的,沒考慮優化.就是發篇文章記錄一下.感受redis仍是很強大的.redis
//建立文章 func CreateArticle(conn redis.Conn, title, content, link string, userId int) (err error) { articleId, err := redis.Int(conn.Do("incr", "articleid:")) //生成文章ID if nil != err { return } 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 { return } _, err = conn.Do("sadd", "voted:"+strconv.Itoa(articleId), userId) //將已投票用戶存入集合中 if nil != err { return } exTime := time.Now().Unix() + 7*86400 _, err = conn.Do("expireAt", "voted:"+strconv.Itoa(articleId), exTime) //記錄過時時間爲一週 if nil != err { return } _, err = conn.Do("zadd", "score:", now+VOTE, articleId) //記錄文章分值 if nil != err { return } return nil }
//對文章進行投票 func VoteArticle(conn redis.Conn, articleId, userId int) (err error) { cutoff := time.Now().Unix() - 7*86400 reply, err := redis.Int64(conn.Do("hget", "article:"+strconv.Itoa(articleId), "time")) if nil != err { return } if reply < cutoff { //驗證投票是否截止 fmt.Println("投票已截止") return } bool, err := redis.Bool(conn.Do("sismember", "voted:"+strconv.Itoa(articleId), userId)) //檢查是否已投過票 if nil != err { return } if bool { fmt.Println("你已投過票") return } _, err = conn.Do("sadd", "voted:"+strconv.Itoa(articleId), userId) //將投票人ID加入集合中 if nil != err { return } _, err = conn.Do("hincrby", "article:"+strconv.Itoa(articleId), "votes", 1) //文章得票 +1 if nil != err { return } _, err = conn.Do("zincrby", "score:", VOTE, articleId) //增長文章得分 if nil != err { return } fmt.Println(11) return nil }
//設置分頁 const ( ARTICLES_PER_PAGE = 2 ) //獲取文章 func GetArticles(conn redis.Conn, page int) (ids []int, err error) { start := (page - 1) * ARTICLES_PER_PAGE end := start + ARTICLES_PER_PAGE - 1 ids, err = redis.Ints(conn.Do("zrevrange", "score:", start, end)) //獲取文章排名,分數由高到低 if nil != err { return } return }
const ( VOTE = 86400 / 200 //分值 ) func main() { conn, err := redis.Dial("tcp", ":6379") if nil != err { fmt.Println(err) os.Exit(1) } //建立文章 err = CreateArticle(conn, "第一篇", "內容1", "www.baidu.com", 1) if nil != err { fmt.Println(err) } //對文章進行投票 err = VoteArticle(conn, 1, 2) if nil != err { fmt.Println(err) } //獲取分數最高的文章,並進行分頁 ids, err := GetArticles(conn, 1) if nil !=err { fmt.Println(err) } }