Documentation ¶
Overview ¶
Package redis provides both clients and connectors for the Redis server. Both synchronous and asynchronous interaction modes are supported. Asynchronous clients (using the asynchronous connection) use pipelining.
Synchronous semantics are defined by redis.Client interface type ¶
Usage example:
func usingRedisSync () Error { spec := DefaultConnectionSpec(); pipeline := NewAsynchClient(spec); value, reqErr := pipeline.Get("my-key"); if reqErr != nil { return withError (reqErr); } }
Asynchronous semantics are defined by redis.AsyncClient interface type. Note that these clients use a pipelining connector and a single instance can be used by multiple go routines. Use of pipelining increases throughput at the cost of latency. If low latency is more important to you than throughput, and you require async call semantics, then you should use only 1 go routine per AsyncClient connection.
Usage example without timeouts (caller blocks on Get until the response from Redis has been processed.)
func usingRedisAsync () Error { spec := DefaultConnectionSpec(); pipeline := NewRedisPipeline(spec); // async invoke of GET my-key // futureBytes is a FutureBytes that will have the result of the // Redis GET operation. futureBytes, reqErr := pipline.Get("my-key"); if reqErr != nil { return withError (reqErr); } // ... note that you could issue additional redis commands here ... []byte, execErr := futureBytes.Get(); if execErr != nil { return withError (execErr); } }
Usage example with timeouts - same Redis op as above but here we use TryGet on the Future result with a timeout of 1 msecs:
func usingRedisAsync () Error { spec := DefaultConnectionSpec(); pipeline := NewRedisPipeline(spec); // futureBytes is a FutureBytes futureBytes, reqErr := pipline.Get("my-key"); if reqErr != nil { return withError (reqErr); } // ... note that you could issue additional redis commands here ... []byte, execErr := futureBytes.Get(); if execErr != nil { return withError (execErr); } timeout := 1000000; // wait 1 msec for result []byte, execErr, ok := futureBytes.TryGet (timeout); if !ok { .. handle timeout here } else { if execErr != nil { return withError (execErr); } } }
Index ¶
- Constants
- func CreateFuture(cmd *Command) (future interface{})
- func CreateRequestBytes(cmd *Command, args [][]byte) []byte
- func GetPubSubResponse(r *bufio.Reader) (msg *Message, err Error)
- func GetResponse(reader *bufio.Reader, cmd *Command) (resp Response, err Error)
- func NewAsynchClient() (c AsyncClient, err Error)
- func NewAsynchClientWithSpec(spec *ConnectionSpec) (client AsyncClient, err Error)
- func NewAsynchConnection(spec *ConnectionSpec) (conn AsyncConnection, err Error)
- func NewPubSubClient() (PubSubClient, Error)
- func NewPubSubClientWithSpec(spec *ConnectionSpec) (PubSubClient, Error)
- func NewPubSubConnection(spec *ConnectionSpec) (conn PubSubConnection, err Error)
- func NewSyncConnection(spec *ConnectionSpec) (c SyncConnection, err Error)
- func NewSynchClient() (c Client, err Error)
- func NewSynchClientWithSpec(spec *ConnectionSpec) (c Client, err Error)
- func SetFutureResult(future interface{}, cmd *Command, r Response)
- type AsyncClient
- type AsyncConnection
- type Client
- type Command
- type ConnectionSpec
- func (spec *ConnectionSpec) Db(db int) *ConnectionSpec
- func (spec *ConnectionSpec) Heartbeat(period time.Duration) *ConnectionSpec
- func (spec *ConnectionSpec) Host(host string) *ConnectionSpec
- func (spec *ConnectionSpec) Password(password string) *ConnectionSpec
- func (spec *ConnectionSpec) Port(port int) *ConnectionSpec
- func (spec *ConnectionSpec) Protocol(protocol Protocol) *ConnectionSpec
- type Error
- type FutureBool
- type FutureBytes
- type FutureBytesArray
- type FutureFloat64
- type FutureInfo
- type FutureInt64
- type FutureKeyType
- type FutureKeys
- type FutureResult
- type FutureString
- type KeyType
- type Message
- type MethodSpec
- type PendingResponse
- type Protocol
- type PubSubChannel
- type PubSubClient
- type PubSubConnection
- type PubSubMType
- type RedisError
- type RequestType
- type Response
- type ResponseType
- type Status
- type Subscription
- type SyncConnection
- type SystemError
Constants ¶
const ( TCP = "tcp" // tcp/ip socket UNIX = "unix" // unix domain socket )
connection socket modes
const ( DefaultReqChanSize = 1000000 DefaultRespChanSize = 1000000 DefaultTCPReadBuffSize = 1024 * 256 DefaultTCPWriteBuffSize = 1024 * 256 DefaultTCPReadTimeoutNSecs = 1000 * time.Nanosecond DefaultTCPWriteTimeoutNSecs = 1000 * time.Nanosecond DefaultTCPLinger = 0 // -n: finish io; 0: discard, +n: wait for n secs to finish DefaultTCPKeepalive = true DefaultHeartbeatSecs = 1 * time.Second DefaultProtocol = REDIS_DB )
various defaults for the connections exported for user convenience.
const ( DefaultRedisPassword = "" DefaultRedisDB = 0 DefaultRedisPort = 6379 DefaultRedisHost = "127.0.0.1" )
Redis specific default settings exported for user convenience.
const ( OK = true PONG = true ERR = false )
Variables ¶
This section is empty.
Functions ¶
func CreateFuture ¶
func CreateFuture(cmd *Command) (future interface{})
Creates a specific Future type for the given Redis command and returns it as a generic reference.
func CreateRequestBytes ¶
Creates the byte buffer that corresponds to the specified Command and provided command arguments.
panics on error (with redis.Error)
func GetPubSubResponse ¶
Fully reads and processes an expected Redis pubsub message byte sequence.
func GetResponse ¶
Gets the response to the command.
The returned response (regardless of flavor) may have (application level) errors as sent from Redis server. (Note err will be nil in that case)
Any errors (whether runtime or bugs) are returned as redis.Error.
func NewAsynchClient ¶
func NewAsynchClient() (c AsyncClient, err Error)
Create a new Client and connects to the Redis server using the default ConnectionSpec.
func NewAsynchClientWithSpec ¶
func NewAsynchClientWithSpec(spec *ConnectionSpec) (client AsyncClient, err Error)
Create a new asynClient and connects to the Redis server using the specified ConnectionSpec.
func NewAsynchConnection ¶
func NewAsynchConnection(spec *ConnectionSpec) (conn AsyncConnection, err Error)
Creates and opens a new AsyncConnection and starts the goroutines for request and response processing interaction with redis (AUTH &| SELECT)
func NewPubSubClient ¶
func NewPubSubClient() (PubSubClient, Error)
func NewPubSubClientWithSpec ¶
func NewPubSubClientWithSpec(spec *ConnectionSpec) (PubSubClient, Error)
func NewPubSubConnection ¶
func NewPubSubConnection(spec *ConnectionSpec) (conn PubSubConnection, err Error)
func NewSyncConnection ¶
func NewSyncConnection(spec *ConnectionSpec) (c SyncConnection, err Error)
Creates a new SyncConnection using the provided ConnectionSpec. Note that this function will also connect to the specified redis server.
func NewSynchClient ¶
Create a new syncClient and connects to the Redis server using the default ConnectionSpec.
func NewSynchClientWithSpec ¶
func NewSynchClientWithSpec(spec *ConnectionSpec) (c Client, err Error)
Create a new syncClient and connects to the Redis server using the specified ConnectionSpec.
func SetFutureResult ¶
Sets the type specific result value from the response for the future reference based on the command type.
Types ¶
type AsyncClient ¶
type AsyncClient interface { // Redis QUIT command. Quit() (status FutureBool, err Error) // Redis GET command. Get(key string) (result FutureBytes, err Error) // Redis TYPE command. Type(key string) (result FutureKeyType, err Error) // Redis SET command. Set(key string, arg1 []byte) (status FutureBool, err Error) // Redis SAVE command. Save() (status FutureBool, err Error) // Redis KEYS command using "*" wildcard AllKeys() (result FutureKeys, err Error) // Redis KEYS command. Keys(key string) (result FutureKeys, err Error) // Redis EXISTS command. Exists(key string) (result FutureBool, err Error) // Redis RENAME command. Rename(key, arg1 string) (status FutureBool, err Error) // Redis INFO command. Info() (result FutureInfo, err Error) // Redis PING command. Ping() (status FutureBool, err Error) // Redis SETNX command. Setnx(key string, arg1 []byte) (result FutureBool, err Error) // Redis GETSET command. Getset(key string, arg1 []byte) (result FutureBytes, err Error) // Redis MGET command. Mget(key string, arg1 []string) (result FutureBytesArray, err Error) // Redis INCR command. Incr(key string) (result FutureInt64, err Error) // Redis INCRBY command. Incrby(key string, arg1 int64) (result FutureInt64, err Error) // Redis DECR command. Decr(key string) (result FutureInt64, err Error) // Redis DECRBY command. Decrby(key string, arg1 int64) (result FutureInt64, err Error) // Redis DEL command. Del(key string) (result FutureBool, err Error) // Redis RANDOMKEY command. Randomkey() (result FutureString, err Error) // Redis RENAMENX command. Renamenx(key string, arg1 string) (result FutureBool, err Error) // Redis DBSIZE command. Dbsize() (result FutureInt64, err Error) // Redis EXPIRE command. Expire(key string, arg1 int64) (result FutureBool, err Error) // Redis TTL command. Ttl(key string) (result FutureInt64, err Error) // Redis RPUSH command. Rpush(key string, arg1 []byte) (status FutureBool, err Error) // Redis LPUSH command. Lpush(key string, arg1 []byte) (status FutureBool, err Error) // Redis LSET command. Lset(key string, arg1 int64, arg2 []byte) (status FutureBool, err Error) // Redis LREM command. Lrem(key string, arg1 []byte, arg2 int64) (result FutureInt64, err Error) // Redis LLEN command. Llen(key string) (result FutureInt64, err Error) // Redis LRANGE command. Lrange(key string, arg1 int64, arg2 int64) (result FutureBytesArray, err Error) // Redis LTRIM command. Ltrim(key string, arg1 int64, arg2 int64) (status FutureBool, err Error) // Redis LINDEX command. Lindex(key string, arg1 int64) (result FutureBytes, err Error) // Redis LPOP command. Lpop(key string) (result FutureBytes, err Error) // Redis RPOP command. Rpop(key string) (result FutureBytes, err Error) // Redis RPOPLPUSH command. Rpoplpush(key string, arg1 string) (result FutureBytes, err Error) // Redis SADD command. Sadd(key string, arg1 []byte) (result FutureBool, err Error) // Redis SREM command. Srem(key string, arg1 []byte) (result FutureBool, err Error) // Redis SISMEMBER command. Sismember(key string, arg1 []byte) (result FutureBool, err Error) // Redis SMOVE command. Smove(key string, arg1 string, arg2 []byte) (result FutureBool, err Error) // Redis SCARD command. Scard(key string) (result FutureInt64, err Error) // Redis SINTER command. Sinter(key string, arg1 []string) (result FutureBytesArray, err Error) // Redis SINTERSTORE command. Sinterstore(key string, arg1 []string) (status FutureBool, err Error) // Redis SUNION command. Sunion(key string, arg1 []string) (result FutureBytesArray, err Error) // Redis SUNIONSTORE command. Sunionstore(key string, arg1 []string) (status FutureBool, err Error) // Redis SDIFF command. Sdiff(key string, arg1 []string) (result FutureBytesArray, err Error) // Redis SDIFFSTORE command. Sdiffstore(key string, arg1 []string) (status FutureBool, err Error) // Redis SMEMBERS command. Smembers(key string) (result FutureBytesArray, err Error) // Redis SRANDMEMBER command. Srandmember(key string) (result FutureBytes, err Error) // Redis ZADD command. Zadd(key string, arg1 float64, arg2 []byte) (result FutureBool, err Error) // Redis ZREM command. Zrem(key string, arg1 []byte) (result FutureBool, err Error) // Redis ZCARD command. Zcard(key string) (result FutureInt64, err Error) // Redis ZSCORE command. Zscore(key string, arg1 []byte) (result FutureFloat64, err Error) // Redis ZRANGE command. Zrange(key string, arg1 int64, arg2 int64) (result FutureBytesArray, err Error) // Redis ZREVRANGE command. Zrevrange(key string, arg1 int64, arg2 int64) (result FutureBytesArray, err Error) // Redis ZRANGEBYSCORE command. Zrangebyscore(key string, arg1 float64, arg2 float64) (result FutureBytesArray, err Error) // Redis FLUSHDB command. Flushdb() (status FutureBool, err Error) // Redis FLUSHALL command. Flushall() (status FutureBool, err Error) // Redis MOVE command. Move(key string, arg1 int64) (result FutureBool, err Error) // Redis BGSAVE command. Bgsave() (status FutureBool, err Error) // Redis LASTSAVE command. Lastsave() (result FutureInt64, err Error) // Redis PUBLISH command. // Publishes a message to the named channels. // // Returns the future for number of PubSub subscribers that received the message. // OR error if any. Publish(channel string, message []byte) (recieverCountFuture FutureInt64, err Error) }
The asynchronous client interface provides asynchronous call semantics with future results supporting both blocking and try-and-timeout result accessors.
Each method provides a type-safe future result return value, in addition to any (system) errors encountered in queuing the request.
The returned value may be ignored by clients that are not interested in the future response (for example on SET("foo", data)). Alternatively, the caller may retain the future result referenced and perform blocking and/or timed wait gets on the expected response.
Get() or TryGet() on the future result will return any Redis errors that were sent by the server, or, Go-Redis (system) errors encountered in processing the response.
type AsyncConnection ¶
type AsyncConnection interface {
QueueRequest(cmd *Command, args [][]byte) (*PendingResponse, Error)
}
type Client ¶
type Client interface { // Redis QUIT command. Quit() (err Error) // Redis GET command. Get(key string) (result []byte, err Error) // Redis TYPE command. Type(key string) (result KeyType, err Error) // Redis SET command. Set(key string, arg1 []byte) Error // Redis SAVE command. Save() Error // Redis KEYS command using "*" wildcard AllKeys() (result []string, err Error) // Redis KEYS command. Keys(key string) (result []string, err Error) // Redis EXISTS command. Exists(key string) (result bool, err Error) // Redis RENAME command. Rename(key, arg1 string) Error // Redis INFO command. Info() (result map[string]string, err Error) // Redis PING command. Ping() Error // Redis SETNX command. Setnx(key string, arg1 []byte) (result bool, err Error) // Redis GETSET command. Getset(key string, arg1 []byte) (result []byte, err Error) // Redis MGET command. Mget(key string, arg1 []string) (result [][]byte, err Error) // Redis INCR command. Incr(key string) (result int64, err Error) // Redis INCRBY command. Incrby(key string, arg1 int64) (result int64, err Error) // Redis DECR command. Decr(key string) (result int64, err Error) // Redis DECRBY command. Decrby(key string, arg1 int64) (result int64, err Error) // Redis DEL command. Del(key string) (result bool, err Error) // Redis RANDOMKEY command. Randomkey() (result string, err Error) // Redis RENAMENX command. Renamenx(key string, arg1 string) (result bool, err Error) // Redis DBSIZE command. Dbsize() (result int64, err Error) // Redis EXPIRE command. Expire(key string, arg1 int64) (result bool, err Error) // Redis TTL command. Ttl(key string) (result int64, err Error) // Redis RPUSH command. Rpush(key string, arg1 []byte) Error // Redis LPUSH command. Lpush(key string, arg1 []byte) Error // Redis LSET command. Lset(key string, arg1 int64, arg2 []byte) Error // Redis LREM command. Lrem(key string, arg1 []byte, arg2 int64) (result int64, err Error) // Redis LLEN command. Llen(key string) (result int64, err Error) // Redis LRANGE command. Lrange(key string, arg1 int64, arg2 int64) (result [][]byte, err Error) // Redis LTRIM command. Ltrim(key string, arg1 int64, arg2 int64) Error // Redis LINDEX command. Lindex(key string, arg1 int64) (result []byte, err Error) // Redis LPOP command. Lpop(key string) (result []byte, err Error) // Redis BLPOP command. Blpop(key string, timeout int) (result [][]byte, err Error) // Redis RPOP command. Rpop(key string) (result []byte, err Error) // Redis BRPOP command. Brpop(key string, timeout int) (result [][]byte, err Error) // Redis RPOPLPUSH command. Rpoplpush(key string, arg1 string) (result []byte, err Error) // Redis BRPOPLPUSH command. Brpoplpush(key string, arg1 string, timeout int) (result [][]byte, err Error) // Redis SADD command. Sadd(key string, arg1 []byte) (result bool, err Error) // Redis SREM command. Srem(key string, arg1 []byte) (result bool, err Error) // Redis SISMEMBER command. Sismember(key string, arg1 []byte) (result bool, err Error) // Redis SMOVE command. Smove(key string, arg1 string, arg2 []byte) (result bool, err Error) // Redis SCARD command. Scard(key string) (result int64, err Error) // Redis SINTER command. Sinter(key string, arg1 []string) (result [][]byte, err Error) // Redis SINTERSTORE command. Sinterstore(key string, arg1 []string) Error // Redis SUNION command. Sunion(key string, arg1 []string) (result [][]byte, err Error) // Redis SUNIONSTORE command. Sunionstore(key string, arg1 []string) Error // Redis SDIFF command. Sdiff(key string, arg1 []string) (result [][]byte, err Error) // Redis SDIFFSTORE command. Sdiffstore(key string, arg1 []string) Error // Redis SMEMBERS command. Smembers(key string) (result [][]byte, err Error) // Redis SRANDMEMBER command. Srandmember(key string) (result []byte, err Error) // Redis ZADD command. Zadd(key string, arg1 float64, arg2 []byte) (result bool, err Error) // Redis ZREM command. Zrem(key string, arg1 []byte) (result bool, err Error) // Redis ZCARD command. Zcard(key string) (result int64, err Error) // Redis ZSCORE command. Zscore(key string, arg1 []byte) (result float64, err Error) // Redis ZRANGE command. Zrange(key string, arg1 int64, arg2 int64) (result [][]byte, err Error) // Redis ZREVRANGE command. Zrevrange(key string, arg1 int64, arg2 int64) (result [][]byte, err Error) // Redis ZRANGEBYSCORE command. Zrangebyscore(key string, arg1 float64, arg2 float64) (result [][]byte, err Error) // Redis HGET command. Hget(key string, hashkey string) (result []byte, err Error) // Redis HSET command. Hset(key string, hashkey string, arg1 []byte) Error // Redis HGETALL command. Hgetall(key string) (result [][]byte, err Error) // Redis FLUSHDB command. Flushdb() Error // Redis FLUSHALL command. Flushall() Error // Redis MOVE command. Move(key string, arg1 int64) (result bool, err Error) // Redis BGSAVE command. Bgsave() Error // Redis LASTSAVE command. Lastsave() (result int64, err Error) // Redis PUBLISH command. // Publishes a message to the named channels. This is a blocking call. // // Returns the number of PubSub subscribers that received the message. // OR error if any. Publish(channel string, message []byte) (recieverCout int64, err Error) }
The synchronous call semantics Client interface.
Method names map one to one to the Redis command set. All methods may return an redis.Error, which is either a system error (runtime issue or bug) or Redis error (i.e. user error) See Error in this package for details of its interface.
The synchronous client interface provides blocking call semantics supported by a distinct request/reply sequence at the connector level.
Method names map one to one to the Redis command set.
All methods may return an redis.Error, which is either a Redis error (from the server), or a system error indicating a runtime issue (or bug). See Error in this package for details of its interface.
type Command ¶
type Command struct { Code string ReqType RequestType RespType ResponseType }
Describes a given Redis command
var ( AUTH Command = Command{"AUTH", KEY, STATUS} PING Command = Command{"PING", NO_ARG, STATUS} QUIT Command = Command{"QUIT", NO_ARG, VIRTUAL} SET Command = Command{"SET", KEY_VALUE, STATUS} GET Command = Command{"GET", KEY, BULK} GETSET Command = Command{"GETSET", KEY_VALUE, BULK} MGET Command = Command{"MGET", MULTI_KEY, MULTI_BULK} SETNX Command = Command{"SETNX", KEY_VALUE, BOOLEAN} INCR Command = Command{"INCR", KEY, NUMBER} INCRBY Command = Command{"INCRBY", KEY_NUM, NUMBER} DECR Command = Command{"DECR", KEY, NUMBER} DECRBY Command = Command{"DECRBY", KEY_NUM, NUMBER} EXISTS Command = Command{"EXISTS", KEY, BOOLEAN} DEL Command = Command{"DEL", KEY, BOOLEAN} TYPE Command = Command{"TYPE", KEY, STRING} KEYS Command = Command{"KEYS", KEY, MULTI_BULK} RANDOMKEY Command = Command{"RANDOMKEY", NO_ARG, BULK} RENAME Command = Command{"RENAME", KEY_KEY, STATUS} RENAMENX Command = Command{"RENAMENX", KEY_KEY, BOOLEAN} DBSIZE Command = Command{"DBSIZE", NO_ARG, NUMBER} EXPIRE Command = Command{"EXPIRE", KEY_NUM, BOOLEAN} TTL Command = Command{"TTL", KEY, NUMBER} RPUSH Command = Command{"RPUSH", KEY_VALUE, STATUS} LPUSH Command = Command{"LPUSH", KEY_VALUE, STATUS} LLEN Command = Command{"LLEN", KEY, NUMBER} LRANGE Command = Command{"LRANGE", KEY_NUM_NUM, MULTI_BULK} LTRIM Command = Command{"LTRIM", KEY_NUM_NUM, STATUS} LINDEX Command = Command{"LINDEX", KEY_NUM, BULK} LSET Command = Command{"LSET", KEY_IDX_VALUE, STATUS} LREM Command = Command{"LREM", KEY_CNT_VALUE, NUMBER} LPOP Command = Command{"LPOP", KEY, BULK} BLPOP Command = Command{"BLPOP", KEY, MULTI_BULK} RPOP Command = Command{"RPOP", KEY, BULK} BRPOP Command = Command{"BRPOP", KEY, MULTI_BULK} RPOPLPUSH Command = Command{"RPOPLPUSH", KEY_VALUE, BULK} BRPOPLPUSH Command = Command{"BRPOPLPUSH", KEY_VALUE, MULTI_BULK} SADD Command = Command{"SADD", KEY_VALUE, BOOLEAN} SREM Command = Command{"SREM", KEY_VALUE, BOOLEAN} SCARD Command = Command{"SCARD", KEY, NUMBER} SISMEMBER Command = Command{"SISMEMBER", KEY_VALUE, BOOLEAN} SINTER Command = Command{"SINTER", MULTI_KEY, MULTI_BULK} SINTERSTORE Command = Command{"SINTERSTORE", MULTI_KEY, STATUS} SUNION Command = Command{"SUNION", MULTI_KEY, MULTI_BULK} SUNIONSTORE Command = Command{"SUNIONSTORE", MULTI_KEY, STATUS} SDIFF Command = Command{"SDIFF", MULTI_KEY, MULTI_BULK} SDIFFSTORE Command = Command{"SDIFFSTORE", MULTI_KEY, STATUS} SMEMBERS Command = Command{"SMEMBERS", KEY, MULTI_BULK} SMOVE Command = Command{"SMOVE", KEY_KEY_VALUE, BOOLEAN} SRANDMEMBER Command = Command{"SRANDMEMBER", KEY, BULK} HGET Command = Command{"HGET", KEY_KEY, BULK} HSET Command = Command{"HSET", KEY_KEY_VALUE, STATUS} HGETALL Command = Command{"HGETALL", KEY, MULTI_BULK} ZADD Command = Command{"ZADD", KEY_IDX_VALUE, BOOLEAN} ZREM Command = Command{"ZREM", KEY_VALUE, BOOLEAN} ZCARD Command = Command{"ZCARD", KEY, NUMBER} ZSCORE Command = Command{"ZSCORE", KEY_VALUE, BULK} ZRANGE Command = Command{"ZRANGE", KEY_NUM_NUM, MULTI_BULK} ZREVRANGE Command = Command{"ZREVRANGE", KEY_NUM_NUM, MULTI_BULK} ZRANGEBYSCORE Command = Command{"ZRANGEBYSCORE", KEY_NUM_NUM, MULTI_BULK} SELECT Command = Command{"SELECT", KEY, STATUS} FLUSHDB Command = Command{"FLUSHDB", NO_ARG, STATUS} FLUSHALL Command = Command{"FLUSHALL", NO_ARG, STATUS} MOVE Command = Command{"MOVE", KEY_NUM, BOOLEAN} SORT Command = Command{"SORT", KEY_SPEC, MULTI_BULK} SAVE Command = Command{"SAVE", NO_ARG, STATUS} BGSAVE Command = Command{"BGSAVE", NO_ARG, STATUS} LASTSAVE Command = Command{"LASTSAVE", NO_ARG, NUMBER} SHUTDOWN Command = Command{"SHUTDOWN", NO_ARG, VIRTUAL} INFO Command = Command{"INFO", NO_ARG, BULK} MONITOR Command = Command{"MONITOR", NO_ARG, VIRTUAL} // TODO SORT (RequestType.MULTI_KEY, ResponseType.MULTI_BULK), PUBLISH Command = Command{"PUBLISH", KEY_VALUE, NUMBER} SUBSCRIBE Command = Command{"SUBSCRIBE", MULTI_KEY, MULTI_BULK} UNSUBSCRIBE Command = Command{"UNSUBSCRIBE", MULTI_KEY, MULTI_BULK} PSUBSCRIBE Command = Command{"PSUBSCRIBE", MULTI_KEY, MULTI_BULK} PUNSUBSCRIBE Command = Command{"PUNSUBSCRIBE", MULTI_KEY, MULTI_BULK} )
The supported Command set, with one to one mapping to eponymous Redis command.
type ConnectionSpec ¶
type ConnectionSpec struct {
// contains filtered or unexported fields
}
Defines the set of parameters that are used by the client connections
func DefaultSpec ¶
func DefaultSpec() *ConnectionSpec
Creates a ConnectionSpec using default settings. using the DefaultXXX consts of redis package.
func (*ConnectionSpec) Db ¶
func (spec *ConnectionSpec) Db(db int) *ConnectionSpec
Sets the db for connection spec and returns the reference Note that you should not this after you have already connected.
func (*ConnectionSpec) Heartbeat ¶
func (spec *ConnectionSpec) Heartbeat(period time.Duration) *ConnectionSpec
return the address as string.
func (*ConnectionSpec) Host ¶
func (spec *ConnectionSpec) Host(host string) *ConnectionSpec
Sets the host for connection spec and returns the reference Note that you should not this after you have already connected.
func (*ConnectionSpec) Password ¶
func (spec *ConnectionSpec) Password(password string) *ConnectionSpec
Sets the password for connection spec and returns the reference Note that you should not this after you have already connected.
func (*ConnectionSpec) Port ¶
func (spec *ConnectionSpec) Port(port int) *ConnectionSpec
Sets the port for connection spec and returns the reference Note that you should not this after you have already connected.
func (*ConnectionSpec) Protocol ¶
func (spec *ConnectionSpec) Protocol(protocol Protocol) *ConnectionSpec
return the address as string.
type FutureBool ¶
type FutureBool interface { Get() (val bool, error Error) TryGet(timeoutnano time.Duration) (value bool, error Error, timedout bool) // contains filtered or unexported methods }
FutureBool
type FutureBytes ¶
type FutureBytes interface { Get() (vale []byte, error Error) TryGet(timeoutnano time.Duration) (value []byte, error Error, timedout bool) // contains filtered or unexported methods }
FutureBytes (for []byte)
type FutureBytesArray ¶
type FutureBytesArray interface { Get() (vale [][]byte, error Error) TryGet(timeoutnano time.Duration) (value [][]byte, error Error, timedout bool) // contains filtered or unexported methods }
FutureBytesArray (for [][]byte)
type FutureFloat64 ¶
type FutureFloat64 interface { Get() (float64, Error) TryGet(timeoutnano time.Duration) (v float64, error Error, timedout bool) }
FutureFloat64
type FutureInfo ¶
type FutureInfo interface { Get() (map[string]string, Error) TryGet(timeoutnano time.Duration) (keys map[string]string, error Error, timedout bool) }
FutureInfo
type FutureInt64 ¶
type FutureInt64 interface { Get() (int64, Error) TryGet(timeoutnano time.Duration) (value int64, error Error, timedout bool) // contains filtered or unexported methods }
FutureInt64
type FutureKeyType ¶
type FutureKeyType interface { Get() (KeyType, Error) TryGet(timeoutnano time.Duration) (keys KeyType, error Error, timedout bool) }
FutureKeyType
type FutureKeys ¶
type FutureKeys interface { Get() ([]string, Error) TryGet(timeoutnano time.Duration) (keys []string, error Error, timedout bool) }
FutureKeys
type FutureResult ¶
type FutureResult interface {
// contains filtered or unexported methods
}
FutureResult
A generic future. All type-safe Futures support this interface
type FutureString ¶
type FutureString interface { Get() (string, Error) TryGet(timeoutnano time.Duration) (value string, error Error, timedout bool) // contains filtered or unexported methods }
FutureString
type Message ¶
type Message struct { Type PubSubMType Topic string Body []byte SubscriptionCnt int }
Conforms to the payload as received from wire. If Type is MESSAGE, then Body will contain a message, and SubscriptionCnt will be -1. otherwise, it is expected that SubscriptionCnt will contain subscription-info, e.g. number of subscribed channels, and data will be nil.
type MethodSpec ¶
For use by the generated tests.
func GetMethodSpec ¶
func GetMethodSpec(client, method string) (spec *MethodSpec)
For use by the generated tests.
Get MethodSpec for the given client type (name) and Method.
type PendingResponse ¶
type PendingResponse struct {
// contains filtered or unexported fields
}
Handle to a future response
type PubSubChannel ¶
type PubSubChannel <-chan []byte
PubSubChannels are used by clients to forward received PubSub messages from Redis See PubSubClient interface for details.
type PubSubClient ¶
type PubSubClient interface { // returns the incoming messages channel for this client, or nil // if no such subscription is active. // In event of Unsubscribing from a Redis channel, the // client will close this channel. Messages(topic string) PubSubChannel // return the subscribed channel ids, whether specificly named, or // pattern based. Subscriptions() []string // Redis PSUBSCRIBE command. // Subscribes to one or more pubsub channels. // This is a blocking call. // Channel names can be explicit or pattern based (ending in '*') // // Returns the number of currently subscribed channels OR error (if any) // Subscribe(channel string, otherChannels ...string) (messages PubSubChannel, subscriptionCount int, err Error) Subscribe(topic string, otherTopics ...string) (err Error) // Redis PUNSUBSCRIBE command. // unsubscribe from 1 or more pubsub channels. If arg is nil, // client unsubcribes from ALL subscribed channels. // This is a blocking call. // Channel names can be explicit or pattern based (ending in '*') // // Returns the number of currently subscribed channels OR error (if any) Unsubscribe(channels ...string) (err Error) // Quit closes the client and client reference can be disposed. // This is a blocking call. // Returns error, if any, e.g. network issues. Quit() Error }
PubSub Client
Strictly speaking, this client can only subscribe, receive messages, and unsubscribe. Publishing to Redis PubSub channels is done via the standard clients (either sync or async); see the Publish() method on Client and AsyncClient.
Once created, the PubSub client has a message channel (of type <-chan []byte) that the end-user can select, dequeue, etc.
This client (very) slightly modifies the native pubsub client's semantics in that it does NOT post the 'subscribe' or 'unsubscribe' ACKs of Redis server on the exposed chan. These ACKs are effectively captured and returned via the returned results of the PubSubClient's Subscribe() and Unsubscribe() methods, respectively.
The subscribe and unsubscribe methods are both blocking (synchronous). The messages published via the incoming chan are naturally asynchronous.
Given the fact that Redis PSUBSCRIBE to channel names that do NOT end in * is identical to SUBSCRIBE to the same, PubSubClient only exposes Subscribe and Unsubscribe methods and supporting implementation are expected to always use the Redis PSUBSCRIBE and PUNSUBSCRIBE commands. For example, if one issues PSUBSCRIBE foo/* (via telnet) to Redis, and then UNSUBSCRIBE or PUNSUBSCRIBE foo/bar, messages published to foo/bar will still be received in the (telnet) client. So given that Redis does NOT filter subscriptions and it merely has a 1-1 mapping to subscribed and unsubscribed patterns, PSUBSCRIBE foo is equivalent to SUBSCRIBE foo. These facts inform the design decision to keep the API of PubSubClient simple and not expose explicit pattern or explicit (un)subscription.
Also note that (per Redis semantics) ALL subscribed channels will publish to the single chan exposed by this client. For practical applications, you will minimally want to use one PubSubClient per PubSub channel priority category. For example, if your system has general priority application level and high priority critical system level PubSub channels, you should at least create 2 clients, one per priority category.
Like all Go-Redis clients, you can (and should) Quit() once you are done with the client.
type PubSubConnection ¶
type PubSubConnection interface { Subscriptions() map[string]*Subscription ServiceRequest(cmd *Command, args [][]byte) (pending map[string]FutureBool, err Error) }
type PubSubMType ¶
type PubSubMType int
const ( SUBSCRIBE_ACK PubSubMType = iota UNSUBSCRIBE_ACK MESSAGE )
func (PubSubMType) String ¶
func (t PubSubMType) String() string
type RedisError ¶
type RedisError interface {
Message() string
}
ERR Errors returned by the Redis server e.g. for bad AUTH password.
type RequestType ¶
type RequestType int
Request type defines the characteristic pattern of a cmd request
const ( NO_ARG RequestType KEY KEY_KEY KEY_NUM KEY_SPEC KEY_NUM_NUM KEY_VALUE KEY_IDX_VALUE KEY_KEY_VALUE KEY_CNT_VALUE MULTI_KEY )
type ResponseType ¶
type ResponseType int
const ( VIRTUAL ResponseType = iota BOOLEAN NUMBER STRING // REVU - rename to TYPE STATUS BULK MULTI_BULK )
type Status ¶
type Status bool
Not yet used -- TODO: decide if returning status (say for Set) for non error cases really buys us anything beyond (useless) consistency.
type Subscription ¶
type Subscription struct { // closed FutureBool // REVU - for unsubscribe - necessary? // activated chan bool Channel chan []byte IsActive bool // REVU - not necessary // contains filtered or unexported fields }
REVU - why is this exported?
type SyncConnection ¶
type SystemError ¶
type SystemError interface {
Cause() error
}
A system level error, ranging from connectivity issues to detected bugs. Basically anything other than an Redis Server ERR.
System errors can (and typically do) have an underlying Go std. lib or 3rd party lib error cause, such as net.Error, etc.