go-redis

来源:https://www.cnblogs.com/ygjzs/archive/2019/11/22/11913848.html
-Advertisement-
Play Games

redis Redis 基本介紹 redis是nosql型資料庫,不是傳統的資料庫,性能很高,適合做緩存也適合做出持久化,,完全開源免費,高性能的分散式記憶體資料庫,,基於記憶體運行,並支持持久化,,最熱門的nosql資料庫之一,也稱為數據結構伺服器。 redis 兩種安裝方式,壓縮包型,和,安裝文件型 ...


redis

Redis 基本介紹

redis是nosql型資料庫,不是傳統的資料庫,性能很高,適合做緩存也適合做出持久化,,完全開源免費,高性能的分散式記憶體資料庫,,基於記憶體運行,並支持持久化,,最熱門的nosql資料庫之一,也稱為數據結構伺服器。

redis

兩種安裝方式,壓縮包型,和,安裝文件型,比較簡單,
若為壓縮包型:redis.server啟動服務,視窗不關,redis.client,客戶端操作數據;

Redis 的操作指令一覽

指令[http://redisdoc.com/]

redis 的基本使用:

說明: Redis 安裝好後,預設有 16 個資料庫,初始預設使用 0 號庫, 編號是 0...15

  1. 添加 key-val [set]
  2. 查看當前 redis 的 所有 key [keys *]
  3. 獲取 key 對應的值. [get key]
  4. 切換 redis 資料庫 [select index]
  5. 如何查看當前資料庫的 key-val 數量 [dbsize]
  6. 清空當前資料庫的 key-val 和清空所有資料庫的 key-val [flushdb flushall]

Redis 的 Crud 操作

Redis 的五大數據類型:

Redis 的五大數據類型是: String(字元串) 、Hash (哈希)、List(列表)、Set(集合)和 zset(sorted set:有序集合)

String(字元串) -介紹

string 是 redis 最基本的類型,一個 key 對應一個 value。
string 類型是二進位安全的。除普通的字元串外,也可以存放圖片等數據redis 中字元串 value 最大是 512M

舉例,存放一個地址信息:
address 北京天安門
說明 :
key : address
value: 北京天安門

String(字元串) -CRUD
舉例說明 Redis 的 String 字元串的 CRUD 操作.
set[如果存在就相當於修改,不存在就是添加]/get/del

String(字元串)-使用細節和註意事項

setex(set with expire)鍵秒值(10s後,數據消失)
mset[同時設置一個或多個 key-value 對]
mget[同時獲取多個 key-val]

Hash (哈希,類似 golang 里的 Map)-介紹

基本的介紹
Redis hash 是一個鍵值對集合。var user1 map[string]string
Redis hash 是一個 string 類型的 field 和 value 的映射表,hash 特別適合用於存儲對

舉例,存放一個 User 信息:(user1)

user1 name "smith" age 30 job "golang coder"
說明 :
key : user1
name 張三 和 age 30 就是兩對 field-value

Hash(哈希,類似 golang 里的 Map)-CRUD

舉例說明 Redis 的 Hash 的 CRUD 的基本操作.
hset/hget/hgetall/hdel
演示添加 user 信息的案例 (name,age )

Hash-使用細節和註意事項

在給 user 設置 name 和 age 時,前面我們是一步一步設置,使用 hmset和 hmget 可以一次性來設
置多個 filed 的值和返回多個 field 的值 。
hlen 統計一個 hash 有幾個元素.
hexists key field
查看哈希表 key 中,給定域 field 是否存在

List(列表)-介紹

列表是簡單的字元串列表,按照插入順序排序。你可以添加一個元素到列
表的頭部(左邊)或者尾部(右邊)。

List 本質是個鏈表, List 的元素 是有序的,元素的值可以重覆.

舉例, 存放多個地址信息:
city 北京 天津 上海
說明 :
key : city
北京 天津 上海 就是三個元素

List(列表)-CRUD(類似於管道)

舉例說明 Redis 的 List 的 CRUD 操作。
lpush/rpush/lrange/lpop/rpop/del/

List-使用細節和註意事項

1) 按索引獲取元素
2) llen key 獲取長度,若key不存在,key被解釋為一個空列表,返回0
3) list可以左插和右插
4) 若全部移除,對應的鍵就消失了

Set(集合) - 介紹

Redis 的 Set 是 string 類型的無序集合。
底層是 HashTable 數據結構, Set 也是存放很多字元串元素,字元串元素是無序
的,而且元素的值不能重覆

舉例,存放多個郵件列表信息:
email [email protected] [email protected]
說明 :
key : [email protected] [email protected] 就是二個元素
redis>sadd email xx xxx

Set(集合)- CRUD

舉例說明 Redis 的 Set 的 CRUD 操作.

sadd
smembers[取出所有值]
sismember[判斷值是否是成員]
srem [刪除指定值]

以上基本操作的命令

127.0.0.1:6379> dbsize
(integer) 4
127.0.0.1:6379> del name
(integer) 1
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> setx name 10 hello,go
(error) ERR unknown command 'setx'
127.0.0.1:6379> setex name 10 hello,go
OK
127.0.0.1:6379> get name
"hello,go"
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> setex name 10 hello,go
OK
127.0.0.1:6379> get name
"hello,go"
127.0.0.1:6379> get name
"hello,go"
127.0.0.1:6379> get name
"hello,go"
127.0.0.1:6379> get name
"hello,go"
127.0.0.1:6379> get name
"hello,go"
127.0.0.1:6379> get name
"hello,go"
127.0.0.1:6379> get name
"hello,go"
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> mset name a name2 b
OK
127.0.0.1:6379> get name
"a"
127.0.0.1:6379> get name2
"b"
127.0.0.1:6379> dbsize
(integer) 4
127.0.0.1:6379> get user01
(error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379> hget user01
(error) ERR wrong number of arguments for 'hget' command
127.0.0.1:6379> hset use1 name "ygj"
(integer) 1
127.0.0.1:6379> hset use1 age 20
(integer) 1
127.0.0.1:6379> hget user1
(error) ERR wrong number of arguments for 'hget' command
127.0.0.1:6379> hget user1 name
(nil)
127.0.0.1:6379> hget use1 name
"ygj"
127.0.0.1:6379> hget use1 age
"20"
127.0.0.1:6379> hgetall use1
1) "name"
2) "ygj"
3) "age"
4) "20"
127.0.0.1:6379> hget user01 name
"john"
127.0.0.1:6379> desize
(error) ERR unknown command 'desize'
127.0.0.1:6379> dbsize
(integer) 5
127.0.0.1:6379> hlen user01
(integer) 2
127.0.0.1:6379> hlen usel1
(integer) 0
127.0.0.1:6379> hlen use1
(integer) 2
127.0.0.1:6379> lpush city a b c d
(integer) 4
127.0.0.1:6379> lrange city 0 -1
1) "d"
2) "c"
3) "b"
4) "a"
127.0.0.1:6379> lrange city 0 2
1) "d"
2) "c"
3) "b"
127.0.0.1:6379> rpush e f g
(integer) 2
127.0.0.1:6379> lrange city 0 -1
1) "d"
2) "c"
3) "b"
4) "a"
127.0.0.1:6379> rpush city e f g
(integer) 7
127.0.0.1:6379> lrange city 0 -1
1) "d"
2) "c"
3) "b"
4) "a"
5) "e"
6) "f"
7) "g"
127.0.0.1:6379> del e
(integer) 1
127.0.0.1:6379> lrang e 0 -1
(error) ERR unknown command 'lrang'
127.0.0.1:6379> rrange city 0 -1
(error) ERR unknown command 'rrange'
127.0.0.1:6379> lrange city 0 -1
1) "d"
2) "c"
3) "b"
4) "a"
5) "e"
6) "f"
7) "g"
127.0.0.1:6379> desize
(error) ERR unknown command 'desize'
127.0.0.1:6379> dbsize
(integer) 6
127.0.0.1:6379> sadd emals [email protected]
(integer) 1
127.0.0.1:6379> sadd emals [email protected]
(integer) 1
127.0.0.1:6379> smembers emals
1) "[email protected]"
2) "[email protected]"
127.0.0.1:6379> sismember emals [email protected]
(integer) 1
127.0.0.1:6379> sismember emals [email protected]
(integer) 0
127.0.0.1:6379> srem emals [email protected]
(integer) 1
127.0.0.1:6379> smembers emals
1) "[email protected]"

Golang 操作 Redis

安裝第三方開源 Redis 庫

1) 使用第三方開源的 redis 庫: github.com/garyburd/redigo/redis
2) 在使用 Redis 前,先安裝第三方 Redis 庫,在 GOPATH 路徑下執行安裝指令:
D:\goproject>go get github.com/garyburd/redigo/redis

特別說明: 在安裝 Redis 庫前,確保已經安裝並配置了 Git, 因為 是從 github 下載安裝 Redis 庫的,
需要使用到 Git。 如果沒有安裝配置過 Git,請參考: 如何安裝配置 Git

Set/Get 介面

說明: 通過 Golang 添加和獲取 key-value 【比如 name-tom~ 】

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.Dial err=", err)
        return 
    }
    defer conn.Close() //關閉..

    //2. 通過go 向redis寫入數據 string [key-val]
    _, err = conn.Do("Set", "name", "tomjerry貓貓")
    if err != nil {
        fmt.Println("set  err=", err)
        return 
    }

    //3. 通過go 向redis讀取數據 string [key-val]

    r, err := redis.String(conn.Do("Get", "name"))
    if err != nil {
        fmt.Println("set  err=", err)
        return 
    }

    //因為返回 r是 interface{}
    //因為 name 對應的值是string ,因此我們需要轉換
    //nameString := r.(string)

    fmt.Println("操作ok ", r)
}

操作 Hash

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.Dial err=", err)
        return 
    }
    defer conn.Close() //關閉..

    //2. 通過go 向redis寫入數據 string [key-val]
    _, err = conn.Do("HSet", "user01", "name", "john")
    if err != nil {
        fmt.Println("hset  err=", err)
        return 
    }

    _, err = conn.Do("HSet", "user01", "age", 18)
    if err != nil {
        fmt.Println("hset  err=", err)
        return 
    }

    //3. 通過go 向redis讀取數據 

    r1, err := redis.String(conn.Do("HGet","user01", "name"))
    if err != nil {
        fmt.Println("hget  err=", err)
        return 
    }

    r2, err := redis.Int(conn.Do("HGet","user01", "age"))
    if err != nil {
        fmt.Println("hget  err=", err)
        return 
    }

    //因為返回 r是 interface{}
    //因為 name 對應的值是string ,因此我們需要轉換
    //nameString := r.(string)

    fmt.Printf("操作ok r1=%v r2=%v \n", r1, r2)
}

操作多個數據

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.Dial err=", err)
        return 
    }
    defer conn.Close() //關閉..

    //2. 通過go 向redis寫入數據 string [key-val]
    _, err = conn.Do("HMSet", "user02", "name", "john", "age", 19)
    if err != nil {
        fmt.Println("HMSet  err=", err)
        return 
    }



    //3. 通過go 向redis讀取數據 

    r, err := redis.Strings(conn.Do("HMGet","user02", "name", "age"))
    if err != nil {
        fmt.Println("hget  err=", err)
        return 
    }
    for i, v := range r {
        fmt.Printf("r[%d]=%s\n", i, v)
    }

}

與此類似集合也可以這樣操作

給數據設置有效時間

說明: 通過 Golang 對 Redis 操作,給 key-value 設置有效時間
核心代碼:

//給 name 數據設置有效時間為 10s
_, err = c.Do("expire", "name", 10)

操作 List

說明: 通過 Golang 對 Redis 操作 List 數據類型

核心代碼:

_, err = c.Do("lpush", "heroList", "no1: 宋江", 30, "no2: 盧俊義", 28)
r, err := redis.String(c.Do("rpop", "heroList"))

Redis 鏈接池

說明: 通過 Golang 對 Redis 操作, 還可以通過 Redis 鏈接池, 流程如下:
1) 事先初始化一定數量的鏈接,放入到鏈接池
2) 當 Go 需要操作 Redis 時, 直接從 Redis 鏈接池取出鏈接即可。
3) 這樣可以節省臨時 獲取 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() {
    //先從pool 取出一個鏈接
    conn := pool.Get()
    defer conn.Close()

    _, err := conn.Do("Set", "name", "湯姆貓~~")
    if err != nil {
        fmt.Println("conn.Do err=", err)
        return
    }

    //取出
    r, err := redis.String(conn.Do("Get", "name"))
    if err != nil {
        fmt.Println("conn.Do err=", err)
        return
    }

    fmt.Println("r=", r)

    //如果我們要從pool 取出鏈接,一定保證鏈接池是沒有關閉
    // pool.Close()
    conn2 := pool.Get()

    _, err = conn2.Do("Set", "name2", "湯姆貓~~2")
    if err != nil {
        fmt.Println("conn.Do err~~~~=", err)
        return
    }

    //取出
    r2, err := redis.String(conn2.Do("Get", "name2"))
    if err != nil {
        fmt.Println("conn.Do err=", err)
        return
    }

    fmt.Println("r=", r2)

    //fmt.Println("conn2=", conn2)


}

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 錯誤與異常 錯誤,可以理解程式本身的錯誤,例如語法錯誤。而異常則更偏向於程式運行不符合預期或者不符合正常流程;對於 PHP 語言而言,處理錯誤和處理異常使用的機制完全不同,因此很容易讓人產生困惑。 例如,我們希望通過捕獲異常來處理除數為 0 的情況,但是在捕獲到異常之前,PHP 就觸發了錯誤。 1 ...
  • 在上一篇文章中我們對lock和AbstractQueuedSynchronizer(AQS)有了初步的認識。在同步組件的實現中,AQS是核心部分,同步組件的實現者通過使用AQS提供的模板方法實現同步組件語義,AQS則實現了對同步狀態的管理,以及對阻塞線程進行排隊,等待通知等等一些底層的實現處理。AQ... ...
  • 引言 - 導航欄目 有些朋友可能對 redis 充滿著數不盡的求知欲, 也許是 redis 屬於工作, 交流(面試)的大頭戲, 不得不 ... 而自己當下對於 redis 只是停留在會用層面, 細節層面幾乎沒有涉獵. 為了更快的融於大 家, 這裡嘗試拋磚引玉. 先帶大家手寫個 redis 中最簡單的 ...
  • 隨著Python語言的生態日漸完善,採用Python開發方案的團隊也在增加,而且Python由於自身語法的特點和豐富的庫支持,一直比較受程式員群體的歡迎,這也是Python得到大量應用的重要原因之一。所以,從就業的角度來看,當前學習Python是不錯的選擇,但是找工作的難度呢? 如果想通過自學Pyt ...
  • 如果有一個大迴圈,裡面每一個都開啟groutine,那麼瞬間就會開啟非常多的groutine,要解決這個問題就要用channel的阻塞特性來解決 看時間每次只是同時執行兩個 ...
  • [TOC] flask依賴wsgi,實現wsgi的模塊:wsgiref,werkzeug,uwsgi 1.flask的路由分發方式 路由分發的本質:將url和視圖函數封裝成一個Rule對象,添加到Flask的url_map欄位中 2.請求響應相關 3.flask配置文件拾遺(config) from ...
  • 這個要解決的問題是,比如如果有一個大迴圈,取自一個大的文件,要進行邏輯處理,那麼這個邏輯的代碼要放在迴圈每一行的迴圈體裡面,這樣有可能會出現一個for迴圈的邏輯嵌套,一層又一層,類似俄羅斯套娃.如果放在外面那麼就需要把大迴圈的每一行數據存到一個數組或者切片裡面,這樣會占很大的記憶體 那麼就可以使用這種 ...
  • 前言 文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯繫我們以作處理。 作者: 開源最前線(ID:OpenSourceTop) PS:如有需要Python學習資料的小伙伴可以加點擊下方鏈接自行獲取 http://note.youdao.com/no ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...