前言
Redis 是一个开源的、使用C语言编写的、基于内存也可持久化的 Key-Value 数据库。
Redis 优势
- 性能高 – Redis 读速度 110000 次/s,写速度 81000次/s 。
- 支持的数据类型多 – Redis支持 Strings,Lists,Hashes,Sets 及 Ordered Sets 数据类型。
- 原子 – 所有操作都是原子性的,还支持对几个操作全并后的原子性执行。
- 丰富的特性 – 还支持 publish/subscribe,通知,key 过期等等特性。
其他 key-value 存储有什么不同?
Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。
引入包
"github.com/mediocregopher/radix.v2/pool" "github.com/mediocregopher/radix.v2/redis"
序列化反序列化
import ( "bytes" "github.com/ugorji/go/codec" )
func MsgPackMarshal(v interface{}) ([]byte,error) { var buf = new(bytes.Buffer) enc := codec.NewEncoder(buf,new(codec.MsgpackHandle)) err := enc.Encode(v) return buf.Bytes(),err }
func MsgPackUnMarshal(data []byte,v interface{}) error { var buf = bytes.NewBuffer(data) dec := codec.NewDecoder(buf,new(codec.MsgpackHandle)) return dec.Decode(v) }
建立连接池
var redisConnectionPool *pool.Pool df := func(network,addr string) (*redis.Client,error) { client,err := redis.Dial(network,addr) if err != nil { return nil,err } if config.RedisPassword != "" { if err = client.Cmd("AUTH",config.RedisPassword).Err; err != nil { client.Close() return nil,err } } return client,nil } redisConnectionPool,err = pool.NewCustom("tcp",config.RedisAddress,config.RedisConnectionNumber,df) if err != nil { panic("Failed to connect to Redis server: " + err.Error()) } }
关闭连接池
func Close() { redisConnectionPool.Empty() }
使用客户端
func GetClient() (*redis.Client,error) { return redisConnectionPool.Get() } func PutClient(c *redis.Client) { redisConnectionPool.Put(c) }
添加 key
func Set(table RedisDatabase,key string,value interface{}) (err error) { c,err := GetClient() if err != nil { return err } defer PutClient(c) encodedValue,err := MsgPackMarshal(value) if err != nil { return err } // Use table.String() + key as Redis key return c.Cmd("set",table.String()+key,string(encodedValue)).Err }
查询 key
func Get(table RedisDatabase,unmarshal func([]byte) (interface{},error)) (value interface{},err error) { c,err := GetClient() if err != nil { return } defer PutClient(c) // Use table.String() + key as Redis key encodedValue,err := c.Cmd("get",table.String()+key).Bytes() if err != nil { return } return unmarshal(encodedValue) }
删除 key
func Remove(table RedisDatabase,key string) (err error) { c,err := GetClient() if err != nil { return err } defer PutClient(c) // Use table.String() + key as Redis key return c.Cmd("del",table.String()+key).Err }