Golang
記事のディレクトリ
Redisのは何1
Redisのは、Cで書かれた、オープンソースのサポートネットワーク相互作用、また、メモリキー値データベースの持続性に基づくことができます。
Redisの利点
高性能 - Redisのが速い11万回/ Sなどとして読み取ることができ、書き込み速度は81000回/秒です。
豊富なデータタイプ - Redisのは、バイナリの場合文字列、リスト、ハッシュ、セットと順序セット操作のデータ型をサポートしています。
アトミック - Redisのすべての操作はアトミックであり、原子Redisのも、全体的な動作と、いくつかの実装をサポートしています。
Redisのと他のキーと値のストアの違いは何ですか?
Redisのは、より複雑なデータ構造を有しており、他のデータベースの進化経路とは異なるそれらにアトミック操作を提供します。一方、Redisのデータ型は、追加の抽象化を必要とせずに、プログラマに対して透過的、基本的なデータ構造に基づいています。
Redisのメモリで実行されているが、そのようにデータがハードウェアメモリの量よりも大きくすることができないので、高速に読み出しおよび書き込みメモリは、異なるデータセットをトレードオフするときことを、ディスクに保存することができます。あなたが内部のRedis非常に複雑な問題の多くを行うことができますので、インメモリ・データベースのもう一つの利点は、同じ複雑なデータ構造に比べて、ディスク上の非常に簡単なメモリで動作します。彼らはランダムアクセスを必要としないので、一方、そのコンパクトディスクフォーマットの面で、追加の方法を生成します。
2接続のRedis
package main
import (
"fmt"
"github.com/garyburd/redigo/redis"
)
func main() {
c, err := redis.Dial("tcp", "127.0.0.1:6379")
if err != nil {
fmt.Println("Connect to redis error", err)
return
}
defer c.Close()
}
読み書きに2.1
ここに書かれた値が期限切れになりません
package main
import (
"fmt"
"github.com/garyburd/redigo/redis"
)
func main() {
c, err := redis.Dial("tcp", "127.0.0.1:6379")
if err != nil {
fmt.Println("Connect to redis error", err)
return
}
defer c.Close()
_, err = c.Do("SET", "mykey", "superWang")
if err != nil {
fmt.Println("redis set failed:", err)
}
username, err := redis.String(c.Do("GET", "mykey"))
if err != nil {
fmt.Println("redis get failed:", err)
} else {
fmt.Printf("Get mykey: %v \n", username)
}
}
有効期限が切れる設定する方法は、追加のパラメータセットを使用することができます
package main
import (
"fmt"
"time"
"github.com/garyburd/redigo/redis"
)
func main() {
c, err := redis.Dial("tcp", "127.0.0.1:6379")
if err != nil {
fmt.Println("Connect to redis error", err)
return
}
defer c.Close()
_, err = c.Do("SET", "mykey", "superWang", "EX", "5")
if err != nil {
fmt.Println("redis set failed:", err)
}
username, err := redis.String(c.Do("GET", "mykey"))
if err != nil {
fmt.Println("redis get failed:", err)
} else {
fmt.Printf("Get mykey: %v \n", username)
}
time.Sleep(8 * time.Second)
username, err = redis.String(c.Do("GET", "mykey"))
if err != nil {
fmt.Println("redis get failed:", err)
} else {
fmt.Printf("Get mykey: %v \n", username)
}
}
输出:
取得にmykey:superWang
Redisの取得に失敗しました:redigo:nilが返されます
2.2検出値が存在します
キーをEXISTS
package main
import (
"fmt"
"github.com/garyburd/redigo/redis"
)
func main() {
c, err := redis.Dial("tcp", "127.0.0.1:6379")
if err != nil {
fmt.Println("Connect to redis error", err)
return
}
defer c.Close()
_, err = c.Do("SET", "mykey", "superWang")
if err != nil {
fmt.Println("redis set failed:", err)
}
is_key_exit, err := redis.Bool(c.Do("EXISTS", "mykey1"))
if err != nil {
fmt.Println("error:", err)
} else {
fmt.Printf("exists or not: %v \n", is_key_exit)
}
}
输出:
存在するかどうか:偽の
2.3削除
DELキー[キー...]
package main
import (
"fmt"
"github.com/garyburd/redigo/redis"
)
func main() {
c, err := redis.Dial("tcp", "127.0.0.1:6379")
if err != nil {
fmt.Println("Connect to redis error", err)
return
}
defer c.Close()
_, err = c.Do("SET", "mykey", "superWang")
if err != nil {
fmt.Println("redis set failed:", err)
}
username, err := redis.String(c.Do("GET", "mykey"))
if err != nil {
fmt.Println("redis get failed:", err)
} else {
fmt.Printf("Get mykey: %v \n", username)
}
_, err = c.Do("DEL", "mykey")
if err != nil {
fmt.Println("redis delelte failed:", err)
}
username, err = redis.String(c.Do("GET", "mykey"))
if err != nil {
fmt.Println("redis get failed:", err)
} else {
fmt.Printf("Get mykey: %v \n", username)
}
}
输出:
取得にmykey:superWang
Redisの取得に失敗しました:redigo:nilが返されます
JSONのRedisを書く2.4
package main
import (
"encoding/json"
"fmt"
"github.com/garyburd/redigo/redis"
)
func main() {
c, err := redis.Dial("tcp", "127.0.0.1:6379")
if err != nil {
fmt.Println("Connect to redis error", err)
return
}
defer c.Close()
key := "profile"
imap := map[string]string{"username": "666", "phonenumber": "888"}
value, _ := json.Marshal(imap)
n, err := c.Do("SETNX", key, value)
if err != nil {
fmt.Println(err)
}
if n == int64(1) {
fmt.Println("success")
}
var imapGet map[string]string
valueGet, err := redis.Bytes(c.Do("GET", key))
if err != nil {
fmt.Println(err)
}
errShal := json.Unmarshal(valueGet, &imapGet)
if errShal != nil {
fmt.Println(err)
}
fmt.Println(imapGet["username"])
fmt.Println(imapGet["phonenumber"])
}
2.5有効期限を設定します
キー秒を期限切れ
// 设置过期时间为24小时
n, _ := rs.Do("EXPIRE", key, 24*3600)
if n == int64(1) {
fmt.Println("success")
}
2.6リストの操作
コード:
package main
import (
"fmt"
"github.com/garyburd/redigo/redis"
)
func main() {
c, err := redis.Dial("tcp", "127.0.0.1:6379")
if err != nil {
fmt.Println("Connect to redis error", err)
return
}
defer c.Close()
_, err = c.Do("lpush", "runoobkey", "redis")
if err != nil {
fmt.Println("redis set failed:", err)
}
_, err = c.Do("lpush", "runoobkey", "mongodb")
if err != nil {
fmt.Println("redis set failed:", err)
}
_, err = c.Do("lpush", "runoobkey", "mysql")
if err != nil {
fmt.Println("redis set failed:", err)
}
values, _ := redis.Values(c.Do("lrange", "runoobkey", "0", "100"))
for _, v := range values {
fmt.Println(string(v.([]byte)))
}
}
出力:
MySQLの
MongoDBの
Redisの
3パイプライン
要求/応答サービスは、クライアントが古いレスポンスを読み取る準備ができていない場合でも、持続的なハンドルに新しい要求を達成することができます。クライアントは、応答を待たずに、サーバーに複数の読取りに応答して、最後の時間を複数のコマンドを送信することができるように。これは、(パイプライン)をパイプライン化され、この技術は、長年にわたって広く使用されてきました。距離、多くのPOP3プロトコルは、すでにかなりのサーバプロセスからダウンロード新しいメッセージを加速し、この機能をサポートしています。
あなたが任意のバージョンを使用するようにするかどうかを、早期にサポートパイプライン化をRedisのは、パイプライン化技術を使用することができます
送信サポートを()の接続、フラッシュ()、受信()メソッドは、パイプラインの動作をサポートしています
Send(commandName string, args ...interface{}) error
Flush() error
Receive() (reply interface{}, err error)
接続された出力バッファに書き込みコマンドを送信します。書き込みサーバ側に接続され、空になった出力バッファをフラッシュします。Recevieは順次FIFOのためにサーバに応じてお読みください。次の例が示す簡単なパイプライン:
c.Send("SET", "foo", "bar")
c.Send("GET", "foo")
c.Flush()
c.Receive() // reply from SET
v, err = c.Receive() // reply from GET
DO方式では、送信を組み合わせたフラッシュやメソッドを受信します。、書き込みにコマンドの方法を実行し、出力バッファをクリアし、最後に受信した応答結果の全てが放出されるコマンドドゥハング側が含まれています。いずれかの応答がエラーが含まれている場合は、Doがエラーを返します。エラーがない場合は、実行(Do)メソッドは、最終的な応答を返します。
アプリケーション
package main
import (
"fmt"
"github.com/go-redis/redis"
)
func main() {
client := redis.NewClient(&redis.Options{
Addr: "127.0.0.1:6379",
Password: "", // no password set
DB: 0, // use default DB
})
pong, err := client.Ping().Result()
fmt.Println(pong, err)
err = client.Set("key", "value", 0).Err()
if err != nil {
panic(err)
}
val, err := client.Get("key").Result()
if err != nil {
panic(err)
}
fmt.Println("key", val)
val2, err := client.Get("key2").Result()
if err == redis.Nil {
fmt.Println("key2 does not exists")
} else if err != nil {
panic(err)
} else {
fmt.Println("key2", val2)
}
}
输出:
PONG
キー値
KEY2は存在しません。