Skip to content

Instantly share code, notes, and snippets.

@tristan2077
Last active February 22, 2019 01:44
Show Gist options
  • Save tristan2077/6f17e1bd034f7a2445db22028d6314fc to your computer and use it in GitHub Desktop.
Save tristan2077/6f17e1bd034f7a2445db22028d6314fc to your computer and use it in GitHub Desktop.
redis签到golang实现
package main
import (
"fmt"
"github.com/gomodule/redigo/redis"
"time"
)
//redis bitmap
// getbit setbit bitfield
//前20位为注册日期
// 0-11 位表示年
// 12-15 位表示月
// 16-20 为表示日
// 21-36 位 为连续签到日期。
// 37开始为签到日
func setYear(c redis.Conn, key string,y int){
result,err:=c.Do("bitfield",key,"set","u12",0,y)
if err != nil {
// handle error
fmt.Println(err)
}
fmt.Println(result)
}
func setMonth(c redis.Conn, key string, m int){
result,err:=c.Do("bitfield",key,"set","u4",12,m)
if err != nil {
// handle error
fmt.Println(err)
}
fmt.Println(result)
}
func getYear(c redis.Conn, key string) interface{}{
result,err:=c.Do("bitfield",key,"get","u12",0)
if err != nil {
// handle error
fmt.Println(err)
}
return (result.([]interface{})[0])
}
func getMonth(c redis.Conn, key string) interface{}{
result,err:=c.Do("bitfield",key,"get","u4",12)
if err != nil {
// handle error
fmt.Println(err)
}
return (result.([]interface{})[0])
}
func setDay(c redis.Conn, key string, day int) {
result,err:=c.Do("bitfield",key,"set","u5",16,day)
if err != nil {
// handle error
fmt.Println(err)
}
fmt.Println(result)
}
func getDay(c redis.Conn, key string) interface{}{
result,err:=c.Do("bitfield",key,"get","u5",16)
if err != nil {
// handle error
fmt.Println(err)
}
return (result.([]interface{})[0])
}
func getRegister(c redis.Conn, key string){
year := getYear(c,key)
month := getMonth(c,key)
day := getDay(c,key)
fmt.Println(year,month,day)
}
func Register(c redis.Conn, key string, date time.Time){
setDay(c,key,date.Day())
setMonth(c,key,int(date.Month()))
setYear(c,key,date.Year())
}
func checkIn(c redis.Conn, key string,offset int){
if offset == 0{
c.Do("bitfield",key,"set","u16",21,1)
}else {
result,_:=c.Do("getbit",key, (37 + offset -1))
a :=(result.(int64))
fmt.Println("a is ,",a)
if a ==0{
fmt.Println(a)
c.Do("bitfield",key,"set","u16",21,1)
}else{
result,_ :=c.Do("bitfield",key,"get","u16",21)
day :=(result.([]interface{})[0])
new_day :=day.(int64)+1
c.Do("bitfield",key,"set","u16",21,new_day)
}
}
result,err:=c.Do("setbit",key, (37 + offset ),1)
if err != nil {
// handle error
fmt.Println(err)
}
fmt.Println(result)
}
func main(){
c, err := redis.Dial("tcp", ":6379")
if err != nil {
// handle error
}
username := "xxx2019"
//注册时间
registerDate :=time.Date(2019,2,22,0,0,0,0,time.Local)
//Register(c, username, registerDate)
now := time.Now()
today:=time.Date(now.Year(),now.Month(),now.Day(),0,0,0,0,time.Local)
check_offset := (today.Sub(registerDate).Hours())/24
fmt.Println(check_offset)
checkIn(c,username,int(check_offset))
defer c.Close()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment