Last active
February 22, 2019 01:44
-
-
Save tristan2077/6f17e1bd034f7a2445db22028d6314fc to your computer and use it in GitHub Desktop.
redis签到golang实现
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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