前段時間因為忙一些其它的事情,分享的有些少,最近學習一下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", "name", "superWang", "SEX", "F", "EX", "50")
if err != nil {
fmt.Println("redis set failed:", 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", "SEX", "name"))
if err != nil {
fmt.Println("redis get failed:", err)
} else {
fmt.Printf("Get mykey: %v \n", username)
}
}
4、刪除
func delFromDB(c redis.Conn) {
_, err := c.Do("DEL", "name", "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", "username", "lisi")
if err != nil {
fmt.Println("redis set failed:", err)
}
_, err = c.Do("lpush", "username", "wangwu")
if err != nil {
fmt.Println("redis set failed:", err)
}
}
//讀列表
func readListFromDB(c redis.Conn) {
values, _ := redis.Values(c.Do("lrange", "username", "0", "2"))
fmt.Printf("count%d", len(values))
for _, v := range values {
fmt.Println(string(v.([]byte)))
}
}
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
您可能感興趣的文章:- 在Golang中使用Redis的方法示例
- Go語言中通過Lua腳本操作Redis的方法
- go語言操作redis連接池的方法
- Go語言操作redis用法實例