Skip to content

Instantly share code, notes, and snippets.

@hto
Last active October 26, 2017 08:50
Show Gist options
  • Save hto/8205fecfa1d7a68030e6d6d4af2f164f to your computer and use it in GitHub Desktop.
Save hto/8205fecfa1d7a68030e6d6d4af2f164f to your computer and use it in GitHub Desktop.
user_data | go run main.go -redisPort=6379 -redisQPort=6379 -mysqlHost=localhost -mysqlUsername=root -mysqlPassword=root -mysqlDB=headball -mysqlPort=8889
package main
import (
"io"
"os"
"time"
"flag"
"strings"
"log"
"encoding/json"
"github.com/go-redis/redis"
_ "github.com/go-sql-driver/mysql"
"database/sql"
)
var redisClient *redis.Client
var (
redisPort = flag.String("redisPort", "6379", "Redis Port")
redisQPort = flag.String("redisQPort", "6379", "Redis Port")
mysqlHost = flag.String("mysqlHost", "localhost", "Mysql Host")
mysqlPort = flag.String("mysqlPort", "3306", "Mysql Port")
mysqlDB = flag.String("mysqlDB", "headball", "Mysql Database")
mysqlUsername = flag.String("mysqlUsername", "root", "Mysql UserName")
mysqlPassword = flag.String("mysqlPassword", "root", "Mysql User Password")
)
// "{\"gold\":250,\"diamond\":0,\"supporters\":171845,\"win\":0,\"lose\":0,\"draw\":0,\"matches\":0,\"update\":1490024625,\"lastmatchtime\":1490024625,\"level\":1,\"stadium\":1,\"energy\":20,\"energyDrink\":10,\"energyTtl\":0,\"experience\":120,\"metrics\":{\"1\":1,\"2\":1,\"3\":1,\"4\":1}}"
type UserData struct {
Gold int `json:"gold"`
Diamond int `json:"diamond"`
Supporters int `json:"supporters"`
Win int `json:"win"`
Lose int `json:"lose"`
Draw int `json:"draw"`
Matches int `json:"matches"`
Level int `json:"level"`
Stadium int `json:"stadium"`
Energy int `json:"energy"`
EnergyDrink int `json:"energyDrink"`
Experience int `json:"experience"`
LastMatchTime int `json:"lastmatchtime"`
}
var (
Error *log.Logger
)
func Init(errorHandle io.Writer) {
f, _ := os.OpenFile("/var/log/syncUserData.log", os.O_RDWR | os.O_CREATE | os.O_APPEND, 0666)
Error = log.New(f,
"ERROR: ",
log.Ldate|log.Ltime|log.Lshortfile)
}
func main(){
Init(os.Stderr)
flag.Parse()
redisClient := redis.NewClient(&redis.Options{
Addr: "localhost:" + *redisPort,
Password: "", // no password set
DB: 0, // use default DB
})
redisQClient := redis.NewClient(&redis.Options{
Addr: "localhost:" + *redisQPort,
Password: "", // no password set
DB: 0, // use default DB
})
_, err := redisClient.Ping().Result()
if err != nil {
Error.Println("Redis Not Connected - 1")
}
_, err = redisQClient.Ping().Result()
if err != nil {
Error.Println("RedisQ Not Connected - 1")
}
db, errDb := sql.Open("mysql", *mysqlUsername + ":" + *mysqlPassword + "@tcp(" + *mysqlHost + ":" + *mysqlPort + ")/" + *mysqlDB)
if errDb != nil {
Error.Println("Mysql Not Connected - 1")
}
defer db.Close()
// Sonsuz Döngü
for {
err = db.Ping()
if err != nil {
// Db Erişimi yok ise
time.Sleep(15 * time.Second)
Error.Println("Mysql Not Connected - 2")
db, errDb = sql.Open("mysql", *mysqlUsername + ":" + *mysqlPassword + "@tcp(" + *mysqlHost + ":" + *mysqlPort + ")/" + *mysqlDB)
if errDb != nil {
Error.Println("Mysql Not Connected - 3")
}
continue
}
_, err = redisClient.Ping().Result()
if err != nil {
Error.Println("Redis Not Connected - 2")
time.Sleep(15 * time.Second)
redisClient = redis.NewClient(&redis.Options{
Addr: "localhost:" + *redisPort,
Password: "", // no password set
DB: 0, // use default DB
})
continue
}
_, err = redisQClient.Ping().Result()
if err != nil {
Error.Println("RedisQ Not Connected - 2")
time.Sleep(15 * time.Second)
redisQClient = redis.NewClient(&redis.Options{
Addr: "localhost:" + *redisQPort,
Password: "", // no password set
DB: 0, // use default DB
})
continue
}
txn, errBegin := db.Begin()
if errBegin != nil {
Error.Println(errBegin)
Error.Println("begin txn err")
}
update, errDb := txn.Prepare("update user_data set "+
"supporters=? ,"+
"gold=? ,"+
"diamond=? ,"+
"matches=? ,"+
"win=? ,"+
"lose=? ,"+
"draw=? ,"+
"level=? ,"+
"stadium=? ,"+
"energy=? ,"+
"energyDrink=? ,"+
"experience=? ,"+
"lastmatchtime=? "+
"where userid=?")
if errDb != nil {
Error.Println(errDb)
Error.Println("Mysql Update Error !!")
}
for i := 0; i < 999; i++ {
queue := redisQClient.SPop("queue:userdata")
if queue != nil && len(queue.Val()) > 0 {
// "{\"gold\":250,\"diamond\":0,\"supporters\":171845,\"win\":0,\"lose\":0,\"draw\":0,\"matches\":0,\"update\":1490024625,\"lastmatchtime\":1490024625,\"level\":1,\"stadium\":1,\"energy\":20,\"energyDrink\":10,\"energyTtl\":0,\"experience\":120,\"metrics\":{\"1\":1,\"2\":1,\"3\":1,\"4\":1}}"
userData := redisClient.HGet("user_data", queue.Val())
if userData.Val() == "" {
continue
}
dec := json.NewDecoder(strings.NewReader(userData.Val()))
var ud UserData
err := dec.Decode(&ud);
if err != nil {
Error.Println(err)
continue
}
_, updateErr := update.Exec(
ud.Supporters,
ud.Gold,
ud.Diamond,
ud.Matches,
ud.Win,
ud.Lose,
ud.Draw,
ud.Level,
ud.Stadium,
ud.Energy,
ud.EnergyDrink,
ud.Experience,
ud.LastMatchTime,
queue.Val())
if updateErr != nil {
Error.Println(updateErr)
Error.Println("Mysql Update Error - 2 - !!")
continue
}
}
}
errCommit := txn.Commit()
if errCommit != nil {
Error.Println(errCommit)
}
//rowCount, _ := result.RowsAffected()
//log.Printf("%d row copied\n", rowCount)
//fmt.Println("%d row copied\n", rowCount)
// 15sn dinlenme
time.Sleep(15 * time.Second)
}
}
`level` int(11) DEFAULT '1',
`stadium` int(11) DEFAULT '1',
`energy` int(11) DEFAULT '0',
`energyDrink` int(11) DEFAULT '0',
`experience` int(11) DEFAULT '0',
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment