最近在学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) } }