Golang
기사 디렉토리
![그림 삽입 설명 여기](https://img-blog.csdnimg.cn/20200223164935375.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMTQxNzI2,size_16,color_FFFFFF,t_70)
1 무엇 레디 스입니다
레디 스는 C로 작성된 오픈 소스이며, 지원 네트워크 상호 작용, 또한 메모리 키 - 값 데이터베이스의 지속성을 기반으로 할 수 있습니다.
레디 스의 장점
고성능 - 레디 스 최대한 빨리 110,000 배 / S를 읽을 수, 쓰기 속도는 S / 81000 번이다.
리치 데이터 유형 - 레디 스 이진 경우 문자열,리스트, 해시, 세트 및 순서 집합 연산의 데이터 유형을 지원합니다.
원자 - 레디 스의 모든 작업은 원자이고, 원자 레디 스도 전체 운영 및 몇 가지의 구현을 지원합니다.
레디 스 및 기타 키 - 값 저장소의 차이점은 무엇입니까?
레디 스 더 복잡한 데이터 구조를 갖고, 다른 데이터베이스 진화 경로 상이한 그들 원자 연산을 제공한다. 한편 레디 스 데이터 형식은 추가 추상화 없이도 프로그래머 투명 기본적인 데이터 구조에 기초한다.
메모리에서 실행 레디 스하지만 고속 판독 할 때 데이터를 하드웨어 메모리 크기보다 클 수 있기 때문에 쓰기 메모리는 서로 다른 데이터 세트를 트레이드 오프되도록 디스크에 유지 될 수있다. 당신이 내부 레디 스 매우 복잡한 문제를 많이 할 수 있도록 메모리 데이터베이스의 또 다른 장점은, 같은 복잡한 데이터 구조에 비해, 디스크에 매우 간단한 메모리에서 작동합니다. 그들은 랜덤 액세스를 필요로하지 않기 때문에 한편, 컴팩트 디스크 형식의 측면에서, 또 다른 방법을 생성합니다.
2 연결 레디 스
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
레디 스 GET 실패 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
레디 스 GET 실패 redigo : nil을 반환
2.4 JSON의 레디 스를 작성하는
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를
레디 스
3 파이프 라인
요청 / 응답 서비스는 클라이언트가 이전 응답을 읽을 준비가없는 경우에도 지속적으로 핸들에게 새로운 요구를 달성 할 수있다. 클라이언트는 응답, 다수의 판독에 응답 마지막 시간을 기다리지 않고 서버에 여러 개의 명령을 보낼 수 있도록. 이것은 (파이프 라이닝) 파이프 라인되고,이 기술은 널리 수년 동안 사용되어왔다. 거리, 많은 POP3 프로토콜은 이미이 기능을 지원 크게 서버 프로세스에서 다운로드 새 메시지를 가속화 할 수 있습니다.
당신이 어떤 버전을 사용하므로 여부, 당신이 기술을 파이프 라이닝 사용할 수 있습니다, 초기 지원 파이프 라인을 레디 스
연결 지원이 방법은 파이프 라인의 운영을 지원 () () 플러시, 수신,) (보내기
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
세척, 방법을 결합에게 보내기를 수행 및 방법을받습니다. 작성하는 명령의 방법을 수행 한 후, 출력 버퍼를 클리어, 최종 수신 된 응답 결과가 모두 방출 된 명령 음주 끊기 측면을 포함한다. 모든 응답에 오류가있는 경우, 음주 오류를 반환합니다. 오류가 없으면 수행 방법은 최종 응답을 반환합니다.
신청
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
키 값
키 2가 존재하지 않습니다