wget http://download.redis.io/releases/redis-5.0.3.tar.gz tar xzf redis-5.0.3.tar.gz
mv redis-5.0.3 /usr/local/
cd /usr/local/redis-5.0.3 sudo make test
sudo make install
redis-server
若出现以下画面则表示redis数据库已经启动了:
jpg
数据缓存应该考虑同步问题:如果对数据进行了缓存,当查询数据时,如果缓存中有数据则直接返回缓存数据不会查询数据库,当数据库数据改变的时候就有可能出现数据库不一致的问题。可以考虑在每次修改数据库的时候同时将对应的缓存数据删除,这样重新查询的时候就会查询数据库并缓存
package redigo_pool import ( "flag" "github.com/garyburd/redigo/redis" "time" ) var ( pool *redis.pool redisserver = flag.string("redisserver", ":6379", "") ) func init() { pool = &redis.pool{ maxidle: 3, //最大空闲链接数,表示即使没有redis链接事依然可以保持n个空闲链接,而不被清除 maxactive: 3, //最大激活连接数,表示同时最多有多少个链接 idletimeout: 240 * time.second,//最大空闲链接等待时间,超过此时间,空闲将被关闭 dial: func() (redis.conn, error) { c, err := redis.dial("tcp", *redisserver) if err != nil { return nil, err } return c, err }, testonborrow: func(c redis.conn, t time.time) error { if time.since(t) < time.minute { return nil } _, err := c.do("ping") return err }, } }
package main import ( "database/sql" "encoding/json" "fmt" "github.com/garyburd/redigo/redis" _ "github.com/go-sql-driver/mysql" "strconv" "web/redis/redigo_pool" _ "web/redis/redigo_pool" ) type person struct { id int `db:"id"` name string `db:"name"` age int `db:"age"` rmb int `db:"rmb"` } func main() { var cmd string for{ fmt.println("输入命令") fmt.scan(&cmd) switch cmd { case "getall": getall() default: fmt.println("不能识别其他命令") } fmt.println() } } func getall() { //从连接池当中获取链接 conn := redigo_pool.pool.get() //先查看redis中是否有数据 //conn,_ :=redis.dial("tcp","localhost:6379") defer conn.close() values, _ := redis.values(conn.do("lrange", "mlist",0,-1)) if len(values) > 0 { //如果有数据 fmt.println("从redis获取数据") //从redis中直接获取 for _,key := range values{ pid :=string(key.([]byte)) id ,_:= strconv.atoi(pid) results,_ := redis.bytes(conn.do("get",id)) var p person err := json.unmarshal(results,&p) if err != nil { fmt.println("json 反序列化出错") }else { fmt.printf("name = %s\n",p.name) } } }else { fmt.println("从mysql中获取") //查询数据库 db,_ := sql.open("mysql","root:szt930708@tcp(localhost:3306)/mydb") defer db.close() var persons []person rows,_ := db.query("select id,name,age,rmb from person") for rows.next() { var id int var name string var age int var rmb int rows.scan(&id,&name,&age,&rmb) per := person{id,name,age,rmb} persons = append(persons,per) } //写入到redis中:将person以hash的方式写入到redis中 for _,p := range persons{ p_byte,_ := json.marshal(p) _,err1 := conn.do("setnx",p.id,p_byte) _,err2 := conn.do("lpush","mlist",p.id) // 设置过期时间 conn.do("expire",p.id,60*5) if err1 != nil || err2 != nil { fmt.println("写入失败") }else { fmt.println("写入成功") } } conn.do("expire","mlist",60*5) } }
如对本文有疑问, 点击进行留言回复!!
一步步教你用Prometheus搭建实时监控系统系列(一)——上帝之火,普罗米修斯的崛起
网友评论