1. 程式人生 > 資料庫 >Go語言開發中redis的使用詳解

Go語言開發中redis的使用詳解

前段時間因為忙一些其它的事情,分享的有些少,最近學習一下redis在Go語言開發中的應用。

一、理論知識

Redis是一個開源的、使用C語言編寫的、支援網路互動的、可基於記憶體也可持久化的Key-Value資料庫。

Redis 優勢

效能極高 – Redis能讀的速度是110000次/s,寫的速度是81000次/s 。

豐富的資料型別 – Redis支援二進位制案例的 Strings,Lists,Hashes,Sets 及 Ordered Sets 資料型別操作。

原子 – Redis的所有操作都是原子性的,同時Redis還支援對幾個操作全並後的原子性執行。

豐富的特性 – Redis還支援 publish/subscribe,通知,key 過期等等特性。

Redis與其他key-value儲存有什麼不同?

Redis有著更為複雜的資料結構並且提供對他們的原子性操作,這是一個不同於其他資料庫的進化路徑。Redis的資料型別都是基於基本資料結構的同時對程式設計師透明,無需進行額外的抽象。

Redis執行在記憶體中但是可以持久化到磁碟,所以在對不同資料集進行高速讀寫時需要權衡記憶體,因為資料量不能大於硬體記憶體。在記憶體資料庫方面的另一個優點是,相比在磁碟上相同的複雜的資料結構,在記憶體中操作起來非常簡單,這樣Redis可以做很多內部複雜性很強的事情。同時,在磁碟格式方面他們是緊湊的以追加的方式產生的,因為他們並不需要進行隨機訪問。

二、使用:

在開發過程中我們使用到了開源庫redis如下

github地址

https://github.com/garyburd/redigo

文件地址:

http://godoc.org/github.com/garyburd/redigo/redis

1、資料庫的連線

func connDB() (c redis.Conn,err error) {
  db,err := redis.Dial("tcp","127.0.0.1:6379")
  if err != nil {
    fmt.Println("Connect to redis error",err)
    return
  }
  return db,err
}

2、寫入

func saveToDB(c redis.Conn) {
  _,err := c.Do("SET","name","qiuqiu","EX","50")
  if err != nil {
    fmt.Println("redis set failed:",err)
  } else {
    fmt.Println("save success")
  }
}

//批量寫入
_,err := c.Do("MSET","superWang","SEX","F",err)
  } else {
    fmt.Println("save success")
  }

//tips:EX是這個值的過期時間

3、讀取

func readFromDB(c redis.Conn) {
  username,err := redis.String(c.Do("GET","name"))
  if err != nil {
    fmt.Println("redis get failed:",err)
  } else {
    fmt.Printf("Get mykey: %v \n",username)
  }

}
//批量讀取
func readFromDB(c redis.Conn) {
  username,err := redis.Strings(c.Do("MGET",username)
  }

}

4、刪除

func delFromDB(c redis.Conn) {
  _,err := c.Do("DEL","SEX")
  if err != nil {
    fmt.Println("redis delete failed:",err)
  } else {
    fmt.Println("delete success")
  }
}

5、設定keys 過期時間

在寫入的時候如果設定了EX的時間,則當前的key過期時間為設定時間,不設定則當前的key永久有效

6、讀寫json到redis

//寫json
func saveJsonDataToDB(c redis.Conn) {
  imap := map[string]string{"name": "waiwaigo","phone": "13498739038"}
  value,_ := json.Marshal(imap)
  n,err := c.Do("SETNX","jsonkey",value)
  if err != nil {
    fmt.Println(err)
  }
  if n == int64(1) {
    fmt.Println("success")
  }
}

//讀json
func readJsonFromDB(c redis.Conn) {
  var imapGet map[string]string
  valueGet,err := redis.Bytes(c.Do("GET","jsonkey"))
  if err != nil {
    fmt.Println(err)
  }

  errShal := json.Unmarshal(valueGet,&imapGet)
  if errShal != nil {
    fmt.Println(err)
  }
  fmt.Println(imapGet["name"])
  fmt.Println(imapGet["phone"])
}

7、列表操作,存入一組資料

//存列表
func saveListToDB(c redis.Conn) {
  _,err := c.Do("lpush","username","zhangsan")
  if err != nil {
    fmt.Println("redis set failed:",err)
  }

  _,err = c.Do("lpush","lisi")
  if err != nil {
    fmt.Println("redis set failed:",err)
  }
  _,"wangwu")
  if err != nil {
    fmt.Println("redis set failed:",err)
  }
}

//讀列表
func readListFromDB(c redis.Conn) {
  values,_ := redis.Values(c.Do("lrange","0","2"))
  fmt.Printf("count%d",len(values))
  for _,v := range values {
    fmt.Println(string(v.([]byte)))
  }
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。