NoSQL(Not Only SQL)驻龟,指的是非關(guān)系型的數(shù)據(jù)庫(kù)蝶桶。目前流行的NOSQL主要有redis、mongoDB阅爽、Cassandra和Membase等。這些數(shù)據(jù)庫(kù)都有高性能逼争、高并發(fā)讀寫等特點(diǎn)优床,目前已經(jīng)廣泛應(yīng)用于各種應(yīng)用中。
Redis
redis是一個(gè)key-value存儲(chǔ)系統(tǒng)誓焦。和Memcached類似胆敞,它支持存儲(chǔ)的value類型相對(duì)更多,包括string(字符串)杂伟、list(鏈表)移层、set(集合)和zset(有序集合)。
Go目前支持redis的驅(qū)動(dòng)有如下
https://github.com/garyburd/redigo(推薦)
https://github.com/go-redis/redis
https://github.com/hoisie/redis
https://github.com/alphazero/Go-Redis
https://github.com/simonz05/godis
示例代碼
1赫粥、以redigo驅(qū)動(dòng)為例來演示如何進(jìn)行數(shù)據(jù)的操作:
package main
import (
????"fmt"
????"os"
????"os/signal"
????"syscall"
????"time"
????"github.com/garyburd/redigo/redis"
)
var (
????Pool *redis.Pool
)
func init() {
????redisHost := ":6379"
????Pool = newPool(redisHost)
????close()
}
func newPool(server string) *redis.Pool {
????return &redis.Pool{
????????MaxIdle:? ? 3,
????????IdleTimeout: 240 * time.Second,
????????Dial: func() (redis.Conn, error) {
????????????c, err := redis.Dial("tcp", server)
????????????if err != nil {
????????????????return nil, err
????????????}
????????????return c, err
????????},
????????TestOnBorrow: func(c redis.Conn, t time.Time) error {
????????????_, err := c.Do("PING")
????????????return err
????????},
????}
}
func close() {
????c := make(chan os.Signal, 1)
????signal.Notify(c, os.Interrupt)
????signal.Notify(c, syscall.SIGALRM)
????signal.Notify(c, syscall.SIGKILL)
????go func() {
????????<-c
????????Pool.Close()
????????os.Exit(0)
????}()
}
func Get(key string) ([]byte, error) {
????conn := Pool.Get()
????defer conn.Close()
????var data []byte
????data, err := redis.Bytes(conn.Do("GET", key))
????if err != nil {
????????return data, fmt.Errorf("error get key %s: %v", key, err)
????}
????return data, err
}
func main() {
????test, err := Get("test")
????fmt.Println(test, err)
}
2观话、以goredis驅(qū)動(dòng)為例來演示如何進(jìn)行數(shù)據(jù)的操作:
package main
import (
????"fmt"
????"github.com/astaxie/goredis"
)
func main() {
????var client goredis.Client
????// 設(shè)置端口為redis默認(rèn)端口
????client.Addr = "127.0.0.1:6379"????
????// 字符串操作
????client.Set("a", []byte("hello"))
????val, _ := client.Get("a")
????fmt.Println(string(val))
????client.Del("a")
????// list操作
????vals := []string{"a", "b", "c", "d", "e"}
????for _, v := range vals {
????????client.Rpush("l", []byte(v))
????}
????dbvals, _ := client.Lrange("l", 0, 4)
????for i, v := range dbvals {
????????println(i, ":", string(v))
????}
????client.Del("l")
}