(十二)Golang連接操作Redis

獲取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

要求:

  1. Monster信息[name, age, skill]
  2. 通過終端輸入三個monster的信息,使用golang操作redis,存放到redis中[用hash數據類型]
  3. 遍歷出所有的Monster信息,並顯示在終端
  4. 保存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

要求:

  1. 記錄用戶瀏覽商品信息,比如保存商品名
  2. 編寫一個函數,可以取出某個用戶最近瀏覽的10個商品名
  3. 考慮使用list數據類型
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章