前段時間因為忙一些其它的事情沪袭,分享的有些少,最近學習一下redis在Go語言開發(fā)中的應用瘫想。
一蹋偏、理論知識
Redis是一個開源的、使用C語言編寫的饶火、支持網絡交互的鹏控、可基于內存也可持久化的Key-Value數據庫。
Redis 優(yōu)勢
性能極高 – Redis能讀的速度是110000次/s,寫的速度是81000次/s 肤寝。
豐富的數據類型 – Redis支持二進制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數據類型操作当辐。
原子 – Redis的所有操作都是原子性的,同時Redis還支持對幾個操作全并后的原子性執(zhí)行鲤看。
豐富的特性 – Redis還支持 publish/subscribe, 通知, key 過期等等特性缘揪。
Redis與其他key-value存儲有什么不同?
Redis有著更為復雜的數據結構并且提供對他們的原子性操作义桂,這是一個不同于其他數據庫的進化路徑找筝。Redis的數據類型都是基于基本數據結構的同時對程序員透明,無需進行額外的抽象慷吊。
Redis運行在內存中但是可以持久化到磁盤袖裕,所以在對不同數據集進行高速讀寫時需要權衡內存,因為數據量不能大于硬件內存溉瓶。在內存數據庫方面的另一個優(yōu)點是急鳄,相比在磁盤上相同的復雜的數據結構,在內存中操作起來非常簡單堰酿,這樣Redis可以做很多內部復雜性很強的事情疾宏。同時,在磁盤格式方面他們是緊湊的以追加的方式產生的胞锰,因為他們并不需要進行隨機訪問灾锯。
二、使用:
在開發(fā)過程中我們使用到了開源庫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)))
}
}