歌者泰戈 發表於 2019-8-2 21:12:00

Go实战--golang中使用redis(redigo和go-redis/redis)

<div>
<h2><strong>开源库redigo的使用</strong></h2>
<p>github地址:<br>
https://github.com/garyburd/redigo</p>
<p>文档地址:<br>
http://godoc.org/github.com/garyburd/redigo/redis</p>
<p>获取:</p>
<pre class="hljs undefined"><code>go get github.com/garyburd/redigo/redis
</code></pre>
<p><strong>连接redis</strong></p>
<pre class="hljs java"><code class="java"><span class="hljs-function"><span class="hljs-keyword">package main
<span class="hljs-title">import <span class="hljs-params">(
    <span class="hljs-string">"fmt"
    <span class="hljs-string">"github.com/garyburd/redigo/redis"
)

func <span class="hljs-title">main<span class="hljs-params">() {
    c, err := redis.Dial(<span class="hljs-string">"tcp", <span class="hljs-string">"127.0.0.1:6379")
    <span class="hljs-keyword">if err != nil {
      fmt.Println(<span class="hljs-string">"Connect to redis error", err)
      <span class="hljs-keyword">return
    }
    defer c.Close()
}
</span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p><strong>读写</strong><br>
这里写入的值永远不会过期</p>
<pre class="hljs objectivec"><code class="objectivec">package main

import (
    <span class="hljs-string">"fmt"

    <span class="hljs-string">"github.com/garyburd/redigo/redis"
)

func main() {
    c, err := redis.Dial(<span class="hljs-string">"tcp", <span class="hljs-string">"127.0.0.1:6379")
    <span class="hljs-keyword">if err != <span class="hljs-literal">nil {
      fmt.Println(<span class="hljs-string">"Connect to redis error", err)
      <span class="hljs-keyword">return
    }
    defer c.Close()

    _, err = c.Do(<span class="hljs-string">"SET", <span class="hljs-string">"mykey", <span class="hljs-string">"superWang")
    <span class="hljs-keyword">if err != <span class="hljs-literal">nil {
      fmt.Println(<span class="hljs-string">"redis set failed:", err)
    }

    username, err := redis.String(c.Do(<span class="hljs-string">"GET", <span class="hljs-string">"mykey"))
    <span class="hljs-keyword">if err != <span class="hljs-literal">nil {
      fmt.Println(<span class="hljs-string">"redis get failed:", err)
    } <span class="hljs-keyword">else {
      fmt.Printf(<span class="hljs-string">"Get mykey: %v \n", username)
    }
}

</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p>如何设置过期呢,可以使用SET的附加参数:</p>
<pre class="hljs objectivec"><code class="objectivec">package main

import (
    <span class="hljs-string">"fmt"
    <span class="hljs-string">"time"

    <span class="hljs-string">"github.com/garyburd/redigo/redis"
)

func main() {
    c, err := redis.Dial(<span class="hljs-string">"tcp", <span class="hljs-string">"127.0.0.1:6379")
    <span class="hljs-keyword">if err != <span class="hljs-literal">nil {
      fmt.Println(<span class="hljs-string">"Connect to redis error", err)
      <span class="hljs-keyword">return
    }
    defer c.Close()

    _, err = c.Do(<span class="hljs-string">"SET", <span class="hljs-string">"mykey", <span class="hljs-string">"superWang", <span class="hljs-string">"EX", <span class="hljs-string">"5")
    <span class="hljs-keyword">if err != <span class="hljs-literal">nil {
      fmt.Println(<span class="hljs-string">"redis set failed:", err)
    }

    username, err := redis.String(c.Do(<span class="hljs-string">"GET", <span class="hljs-string">"mykey"))
    <span class="hljs-keyword">if err != <span class="hljs-literal">nil {
      fmt.Println(<span class="hljs-string">"redis get failed:", err)
    } <span class="hljs-keyword">else {
      fmt.Printf(<span class="hljs-string">"Get mykey: %v \n", username)
    }

    time.Sleep(<span class="hljs-number">8 * time.Second)

    username, err = redis.String(c.Do(<span class="hljs-string">"GET", <span class="hljs-string">"mykey"))
    <span class="hljs-keyword">if err != <span class="hljs-literal">nil {
      fmt.Println(<span class="hljs-string">"redis get failed:", err)
    } <span class="hljs-keyword">else {
      fmt.Printf(<span class="hljs-string">"Get mykey: %v \n", username)
    }
}

</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p>输出:<br>
Get mykey: superWang<br>
redis get failed: redigo: nil returned</p>
<p><strong>批量写入读取</strong></p>
<p>MGET key <br>
MSET key value </p>
<p><strong>批量写入读取对象(Hashtable)</strong><br>
HMSET key field value <br>
HMGET key field </p>
<p><strong>检测值是否存在</strong><br>
EXISTS key</p>
<pre class="hljs objectivec"><code class="objectivec">package main

import (
    <span class="hljs-string">"fmt"

    <span class="hljs-string">"github.com/garyburd/redigo/redis"
)

func main() {
    c, err := redis.Dial(<span class="hljs-string">"tcp", <span class="hljs-string">"127.0.0.1:6379")
    <span class="hljs-keyword">if err != <span class="hljs-literal">nil {
      fmt.Println(<span class="hljs-string">"Connect to redis error", err)
      <span class="hljs-keyword">return
    }
    defer c.Close()

    _, err = c.Do(<span class="hljs-string">"SET", <span class="hljs-string">"mykey", <span class="hljs-string">"superWang")
    <span class="hljs-keyword">if err != <span class="hljs-literal">nil {
      fmt.Println(<span class="hljs-string">"redis set failed:", err)
    }

    is_key_exit, err := redis.Bool(c.Do(<span class="hljs-string">"EXISTS", <span class="hljs-string">"mykey1"))
    <span class="hljs-keyword">if err != <span class="hljs-literal">nil {
      fmt.Println(<span class="hljs-string">"error:", err)
    } <span class="hljs-keyword">else {
      fmt.Printf(<span class="hljs-string">"exists or not: %v \n", is_key_exit)
    }

}

</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p>输出:<br>
exists or not: false</p>
<p><strong>删除</strong><br>
DEL key </p>
<pre class="hljs objectivec"><code class="objectivec">package main

import (
    <span class="hljs-string">"fmt"

    <span class="hljs-string">"github.com/garyburd/redigo/redis"
)

func main() {
    c, err := redis.Dial(<span class="hljs-string">"tcp", <span class="hljs-string">"127.0.0.1:6379")
    <span class="hljs-keyword">if err != <span class="hljs-literal">nil {
      fmt.Println(<span class="hljs-string">"Connect to redis error", err)
      <span class="hljs-keyword">return
    }
    defer c.Close()

    _, err = c.Do(<span class="hljs-string">"SET", <span class="hljs-string">"mykey", <span class="hljs-string">"superWang")
    <span class="hljs-keyword">if err != <span class="hljs-literal">nil {
      fmt.Println(<span class="hljs-string">"redis set failed:", err)
    }

    username, err := redis.String(c.Do(<span class="hljs-string">"GET", <span class="hljs-string">"mykey"))
    <span class="hljs-keyword">if err != <span class="hljs-literal">nil {
      fmt.Println(<span class="hljs-string">"redis get failed:", err)
    } <span class="hljs-keyword">else {
      fmt.Printf(<span class="hljs-string">"Get mykey: %v \n", username)
    }

    _, err = c.Do(<span class="hljs-string">"DEL", <span class="hljs-string">"mykey")
    <span class="hljs-keyword">if err != <span class="hljs-literal">nil {
      fmt.Println(<span class="hljs-string">"redis delelte failed:", err)
    }

    username, err = redis.String(c.Do(<span class="hljs-string">"GET", <span class="hljs-string">"mykey"))
    <span class="hljs-keyword">if err != <span class="hljs-literal">nil {
      fmt.Println(<span class="hljs-string">"redis get failed:", err)
    } <span class="hljs-keyword">else {
      fmt.Printf(<span class="hljs-string">"Get mykey: %v \n", username)
    }
}
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p>输出:<br>
Get mykey: superWang<br>
redis get failed: redigo: nil returned</p>
<p><strong>读写json到redis</strong></p>
<pre class="hljs cpp"><code class="cpp"><span class="hljs-function">package main

<span class="hljs-title">import <span class="hljs-params">(
    <span class="hljs-string">"encoding/json"
    <span class="hljs-string">"fmt"

    <span class="hljs-string">"github.com/garyburd/redigo/redis"
)

func <span class="hljs-title">main<span class="hljs-params">() {
    c, err := redis.Dial(<span class="hljs-string">"tcp", <span class="hljs-string">"127.0.0.1:6379")
    <span class="hljs-keyword">if err != nil {
      fmt.Println(<span class="hljs-string">"Connect to redis error", err)
      <span class="hljs-keyword">return
    }
    defer c.Close()

    key := <span class="hljs-string">"profile"
    imap := <span class="hljs-built_in">map[<span class="hljs-built_in">string]<span class="hljs-built_in">string{<span class="hljs-string">"username": <span class="hljs-string">"666", <span class="hljs-string">"phonenumber": <span class="hljs-string">"888"}
    value, _ := json.Marshal(imap)

    n, err := c.Do(<span class="hljs-string">"SETNX", key, value)
    <span class="hljs-keyword">if err != nil {
      fmt.Println(err)
    }
    <span class="hljs-keyword">if n == int64(<span class="hljs-number">1) {
      fmt.Println(<span class="hljs-string">"success")
    }

    var imapGet <span class="hljs-built_in">map[<span class="hljs-built_in">string]<span class="hljs-built_in">string

    valueGet, err := redis.Bytes(c.Do(<span class="hljs-string">"GET", key))
    <span class="hljs-keyword">if err != nil {
      fmt.Println(err)
    }

    errShal := json.Unmarshal(valueGet, &amp;imapGet)
    <span class="hljs-keyword">if errShal != nil {
      fmt.Println(err)
    }
    fmt.Println(imapGet[<span class="hljs-string">"username"])
    fmt.Println(imapGet[<span class="hljs-string">"phonenumber"])
}
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p><strong>设置过期时间</strong><br>
EXPIRE key seconds</p>
<pre class="hljs php"><code class="php"><span class="hljs-comment">// 设置过期时间为24小时
n, _ := rs.<span class="hljs-keyword">Do(<span class="hljs-string">"EXPIRE", key, <span class="hljs-number">24*<span class="hljs-number">3600)
<span class="hljs-keyword">if n == int64(<span class="hljs-number">1) {
    fmt.Println(<span class="hljs-string">"success")
}
</span></span></span></span></span></span></span></span></code></pre>
<p><strong>列表操作</strong><br>
命令:</p>
<pre class="hljs css"><code class="css"><span class="hljs-selector-tag">redis 127<span class="hljs-selector-class">.0<span class="hljs-selector-class">.0<span class="hljs-selector-class">.1<span class="hljs-selector-pseudo">:6379&gt; <span class="hljs-selector-tag">LPUSH <span class="hljs-selector-tag">runoobkey <span class="hljs-selector-tag">redis
(<span class="hljs-selector-tag">integer) 1
<span class="hljs-selector-tag">redis 127<span class="hljs-selector-class">.0<span class="hljs-selector-class">.0<span class="hljs-selector-class">.1<span class="hljs-selector-pseudo">:6379&gt; <span class="hljs-selector-tag">LPUSH <span class="hljs-selector-tag">runoobkey <span class="hljs-selector-tag">mongodb
(<span class="hljs-selector-tag">integer) 2
<span class="hljs-selector-tag">redis 127<span class="hljs-selector-class">.0<span class="hljs-selector-class">.0<span class="hljs-selector-class">.1<span class="hljs-selector-pseudo">:6379&gt; <span class="hljs-selector-tag">LPUSH <span class="hljs-selector-tag">runoobkey <span class="hljs-selector-tag">mysql
(<span class="hljs-selector-tag">integer) 3
<span class="hljs-selector-tag">redis 127<span class="hljs-selector-class">.0<span class="hljs-selector-class">.0<span class="hljs-selector-class">.1<span class="hljs-selector-pseudo">:6379&gt; <span class="hljs-selector-tag">LRANGE <span class="hljs-selector-tag">runoobkey 0 10

1) "<span class="hljs-selector-tag">mysql"
2) "<span class="hljs-selector-tag">mongodb"
3) "<span class="hljs-selector-tag">redis"
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p>代码实现:</p>
<pre class="hljs objectivec"><code class="objectivec">package main

import (
    <span class="hljs-string">"fmt"

    <span class="hljs-string">"github.com/garyburd/redigo/redis"
)

func main() {
    c, err := redis.Dial(<span class="hljs-string">"tcp", <span class="hljs-string">"127.0.0.1:6379")
    <span class="hljs-keyword">if err != <span class="hljs-literal">nil {
      fmt.Println(<span class="hljs-string">"Connect to redis error", err)
      <span class="hljs-keyword">return
    }
    defer c.Close()

    _, err = c.Do(<span class="hljs-string">"lpush", <span class="hljs-string">"runoobkey", <span class="hljs-string">"redis")
    <span class="hljs-keyword">if err != <span class="hljs-literal">nil {
      fmt.Println(<span class="hljs-string">"redis set failed:", err)
    }

    _, err = c.Do(<span class="hljs-string">"lpush", <span class="hljs-string">"runoobkey", <span class="hljs-string">"mongodb")
    <span class="hljs-keyword">if err != <span class="hljs-literal">nil {
      fmt.Println(<span class="hljs-string">"redis set failed:", err)
    }
    _, err = c.Do(<span class="hljs-string">"lpush", <span class="hljs-string">"runoobkey", <span class="hljs-string">"mysql")
    <span class="hljs-keyword">if err != <span class="hljs-literal">nil {
      fmt.Println(<span class="hljs-string">"redis set failed:", err)
    }

    values, _ := redis.Values(c.Do(<span class="hljs-string">"lrange", <span class="hljs-string">"runoobkey", <span class="hljs-string">"0", <span class="hljs-string">"100"))

    <span class="hljs-keyword">for _, v := range values {
      fmt.Println(string(v.([]byte)))
    }
}
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p>输出:<br>
mysql<br>
mongodb<br>
redis</p>
<p><strong>管道</strong></p>
<p>请求/响应服务可以实现持续处理新请求,即使客户端没有准备好读取旧响应。这样客户端可以发送多个命令到服务器而无需等待响应,最后在一次读取多个响应。这就是管道化(pipelining),这个技术在多年就被广泛使用了。距离,很多POP3协议实现已经支持此特性,显著加速了从服务器下载新邮件的过程。<br>
Redis很早就支持管道化,所以无论你使用任何版本,你都可以使用管道化技术</p>
<p>连接支持使用Send(),Flush(),Receive()方法支持管道化操作</p>
<pre class="hljs php"><code class="php">Send(commandName string, args ...<span class="hljs-keyword">interface{}) error
Flush() error
Receive() (reply <span class="hljs-class"><span class="hljs-keyword">interface{}, err error)
</span></span></span></code></pre>
<p>Send向连接的输出缓冲中写入命令。Flush将连接的输出缓冲清空并写入服务器端。Recevie按照FIFO顺序依次读取服务器的响应。下例展示了一个简单的管道:</p>
<pre class="hljs cpp"><code class="cpp">c.Send(<span class="hljs-string">"SET", <span class="hljs-string">"foo", <span class="hljs-string">"bar")
c.Send(<span class="hljs-string">"GET", <span class="hljs-string">"foo")
c.Flush()
c.Receive() <span class="hljs-comment">// reply from SET
v, err = c.Receive() <span class="hljs-comment">// reply from GET
</span></span></span></span></span></span></span></code></pre>
<p>Do方法组合了Send,Flush和 Receive方法。Do方法先写入命令,然后清空输出buffer,最后接收全部挂起响应包括Do方发出的命令的结果。如果任何响应中包含一个错误,Do返回错误。如果没有错误,Do方法返回最后一个响应。</p>
<h2><strong>开源库go-redis/redis的使用</strong></h2>
<p>github地址:<br>
https://github.com/go-redis/redis</p>
<p>文档地址:<br>
https://godoc.org/github.com/go-redis/redis</p>
<p>获取:</p>
<pre class="hljs undefined"><code>go get -u github.com/go-redis/redis
</code></pre>
<p>应用:</p>
<pre class="hljs objectivec"><code class="objectivec">package main

import (
    <span class="hljs-string">"fmt"

    <span class="hljs-string">"github.com/go-redis/redis"
)

func main() {
    client := redis.NewClient(&amp;redis.Options{
      Addr:   <span class="hljs-string">"127.0.0.1:6379",
      Password: <span class="hljs-string">"", <span class="hljs-comment">// no password set
      DB:       <span class="hljs-number">0,<span class="hljs-comment">// use default DB
    })

    pong, err := client.Ping().Result()
    fmt.Println(pong, err)

    err = client.Set(<span class="hljs-string">"key", <span class="hljs-string">"value", <span class="hljs-number">0).Err()
    <span class="hljs-keyword">if err != <span class="hljs-literal">nil {
      panic(err)
    }

    val, err := client.Get(<span class="hljs-string">"key").Result()
    <span class="hljs-keyword">if err != <span class="hljs-literal">nil {
      panic(err)
    }
    fmt.Println(<span class="hljs-string">"key", val)

    val2, err := client.Get(<span class="hljs-string">"key2").Result()
    <span class="hljs-keyword">if err == redis.Nil {
      fmt.Println(<span class="hljs-string">"key2 does not exists")
    } <span class="hljs-keyword">else <span class="hljs-keyword">if err != <span class="hljs-literal">nil {
      panic(err)
    } <span class="hljs-keyword">else {
      fmt.Println(<span class="hljs-string">"key2", val2)
    }
}

</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p>输出:<br>
PONG<br>
key value<br>
key2 does not exists</p>
<div class="image-package">&nbsp;</div>
</div><br><br>
来源:https://www.cnblogs.com/zhangxiaoj/p/11291251.html
頁: [1]
查看完整版本: Go实战--golang中使用redis(redigo和go-redis/redis)