獲取Golang的redis第三方api
git clone https://github.com/garyburd/redigo.git
1 Set/Get接口
package main
import (
"fmt"
"github.com/garyburd/redigo/redis" // 引入redis包
)
func main() {
// 通過go向redis寫入數據和讀取數據
// 1.連接到redis
conn, err := redis.Dial("tcp", "127.0.0.1:6379")
if err != nil {
fmt.Println("redis connect failed. err = ", err)
return
}
defer conn.Close() //關閉連接
// 2.通過go向redis寫入數據
_, err = conn.Do("Set", "name", "tomjerry")
if err != nil {
fmt.Println("Set err = ", err)
return
}
// 3.從redis中讀取數據
// 由於返回的r是一個interface{},故要轉成字符串
r, err := redis.String(conn.Do("Get", "name"))
if err != nil {
fmt.Println("Get err = ", err)
return
}
fmt.Println("操作ok. name =", r) // 操作ok. name = tomjerry
}
2 批量HMSet/HMGet
package main
import (
"fmt"
"github.com/garyburd/redigo/redis" // 引入redis包
)
func main() {
// 通過go向redis寫入數據和讀取數據
// 1.連接到redis
conn, err := redis.Dial("tcp", "127.0.0.1:6379")
if err != nil {
fmt.Println("redis connect failed. err = ", err)
return
}
defer conn.Close() //關閉連接
// 2.通過go向redis寫入數據
_, err = conn.Do("HMSet", "user01", "name", "jack", "age", 20)
if err != nil {
fmt.Println("HMSet err = ", err)
return
}
// 3.從redis中讀取數據
// 由於返回的r是一個多類型的變量,故需要用redis.Strings()
r, err := redis.Strings(conn.Do("HMGet", "user01", "name", "age"))
if err != nil {
fmt.Println("HMGet err = ", err)
return
}
// 遍歷結果
for i, v := range r {
fmt.Printf("r[%d]=%v\n", i, v)
}
/*
r[0]=jack
r[1]=20
*/
}
3 設置數據有效時間
_, err = conn.Do("MSet", "name01", "RSQ", "name02", "Tom")
if err != nil {
fmt.Println("HMSet err = ", err)
return
}
// 設置超時時間
_, err = conn.Do("expire", "name01", 10)
if err != nil {
fmt.Println("Set Expire err = ", err)
return
}
4 操作List
// 1.通過go向redis寫入數據
_, err = conn.Do("Lpush", "herolist", "no1:宋江", 30, "no2:吳淞", 40)
if err != nil {
fmt.Println("Lpush err = ", err)
return
}
// 2.從redis中讀取數據
r, err = redis.String(conn.Do("rpop", "herolist"))
if err != nil {
fmt.Println("rpop err = ", err)
return
}
5 redis連接池
package main
import (
"fmt"
"github.com/garyburd/redigo/redis"
)
// 定義一個全局的pool
var pool *redis.Pool
// 創建連接池
func init() {
pool = &redis.Pool{
MaxIdle: 8, // 表示最大空閒連接數
MaxActive: 0, // 表示和數據庫的最大連接數,0表示沒有限制
IdleTimeout: 100, // 最大空閒時間
Dial: func() (redis.Conn, error) { // 初始化連接的代碼,連接哪個ip的redis
return redis.Dial("tcp", "localhost:6379")
},
}
}
func main() {
conn := pool.Get() // 從連接池中取出一個連接
defer conn.Close() // 關閉連接池,一旦關閉連接池,就不能從連接池再取出連接
_, err := conn.Do("set", "car", "BBB")
if err != nil {
fmt.Println("conn.Do err=", err)
return
}
r, err := redis.String(conn.Do("Get", "car"))
if err != nil {
fmt.Println("read Data err=", err)
return
}
fmt.Println("r=", r)
// 如果要從pool池中取出連接,一定要保證連接池是沒有關閉的
}
6 example
6.1 exa1
要求:
- Monster信息[name, age, skill]
- 通過終端輸入三個monster的信息,使用golang操作redis,存放到redis中[用hash數據類型]
- 遍歷出所有的Monster信息,並顯示在終端
- 保存monster可以使用hash數據類型,遍歷時先取出所有的keys,比如keys monster*
package main
import (
"fmt"
"github.com/garyburd/redigo/redis"
)
type Monster struct {
Name string
Age int
Skill string
}
func Process(name string, age int, skill string) {
// 1.連接redis
conn, err := redis.Dial("tcp", "127.0.0.1:6379")
if err != nil {
fmt.Println("conn err = ", err)
return
}
defer conn.Close()
// 2.往redis數據庫寫入數據
_, err = conn.Do("HMset", "monster", "name", name, "age", age, "skill", skill)
if err != nil {
fmt.Println("write data err = ", err)
return
}
// 3.從redis中讀取數據
r, err := redis.Strings(conn.Do("HMget", "monster", "name", "age", "skill"))
if err != nil {
fmt.Println("read data err = ", err)
return
}
for i, v := range r {
fmt.Printf("r[%d]=%v\n", i, v)
}
}
func main() {
// 定義結構體實例
var monster Monster
fmt.Println("請輸入monster的Name:")
fmt.Scanln(&monster.Name)
fmt.Println("請輸入monster的Age:")
fmt.Scanln(&monster.Age)
fmt.Println("請輸入monster的Skill:")
fmt.Scanln(&monster.Skill)
Process(monster.Name, monster.Age, monster.Skill)
}
6.2 exa2
要求:
- 記錄用戶瀏覽商品信息,比如保存商品名
- 編寫一個函數,可以取出某個用戶最近瀏覽的10個商品名
- 考慮使用list數據類型