Documentation
¶
Overview ¶
Package bluto is redis library wrapper over redigo which adds type safety, chained commands and managed connection pool which makes it easier for developers to use the library and reduce runtime bugs.
bluto instance is completely thread-safe which means you can pass bluto objects to different goroutines without race condition, it also automatically returns finished connections to connection pool.
pool also supports config for connections like timeout and health-check for better management.
commander is borrowed from bluto instance which can be used to chain multiple commands together and run all of them with commit. This chaining reduces the time when the connection is kept so it improves the pool connection reuse latency.
Example (CommandChain) ¶
package main import ( "fmt" "log" "github.com/alibaba-go/bluto/bluto" "github.com/alibaba-go/bluto/commander" ) func main() { bluto, _ := bluto.New(bluto.Config{ Address: "localhost:6379", ConnectTimeoutSeconds: 10, ReadTimeoutSeconds: 10, }) defer bluto.ClosePool() key1 := "SomeKey" key2 := "Other" var selectResult string var setResult1 string var setResult2 string var keysResult []string var delResult int var getResult1 int var getResult2 int var flushResult string errCmd := bluto.Borrow(). Select(&selectResult, 0). Set(&setResult1, key1, 9, commander.SetOptionNX{}, commander.SetOptionEX{EX: 2}). Set(&setResult2, key2, 9). Keys(&keysResult, "*Key*"). Del(&delResult, key1, "NotExistKey"). Get(&getResult1, key1). FlushAll(&flushResult, commander.FlushAllOptionAsync{}). Get(&getResult2, key2). Commit() if errCmd != nil { log.Fatal(errCmd) } fmt.Println(keysResult) }
Output: [SomeKey]
Example (Scanner) ¶
package main import ( "fmt" "log" "github.com/alibaba-go/bluto/bluto" "github.com/alibaba-go/bluto/commander" "github.com/gomodule/redigo/redis" ) // Fields are the properties of each consumed message type Fields struct { Key string `redis:"Key"` } // Message represents each consumed message type Message struct { ID string Fields *Fields } // RedisScan is the redis.Scanner interface implementation func (m *Message) RedisScan(src interface{}) error { message, err := redis.Values(src, nil) if err != nil { return err } messageID, err := redis.String(message[0], nil) if err != nil { return err } m.ID = messageID msgFieldDetails, err := redis.Values(message[1], nil) if err != nil { return err } var msgField Fields err = redis.ScanStruct(msgFieldDetails, &msgField) if err != nil { return err } m.Fields = &msgField return nil } // Stream represents each stream type Stream struct { Name string Messages []*Message } // RedisScan is the redis.Scanner interface implementation func (s *Stream) RedisScan(src interface{}) error { stream, err := redis.Values(src, nil) if err != nil { return err } name, err := redis.String(stream[0], nil) if err != nil { return err } s.Name = name messages, err := redis.Values(stream[1], nil) if err != nil { return err } for i := range messages { message := messages[i] msgDetails, err := redis.Values(message, nil) if err != nil { return err } msgID, err := redis.String(msgDetails[0], nil) if err != nil { return err } msgFieldDetails, err := redis.Values(msgDetails[1], nil) if err != nil { return err } var msgField Fields err = redis.ScanStruct(msgFieldDetails, &msgField) if err != nil { return err } s.Messages = append(s.Messages, &Message{ ID: msgID, Fields: &msgField, }) } return nil } func main() { bluto, _ := bluto.New(bluto.Config{ Address: "localhost:6379", ConnectTimeoutSeconds: 10, ReadTimeoutSeconds: 10, }) defer bluto.ClosePool() groupName := "testGroup" consumerName := "testConsumer" key := "SomeKey" var flushResult string var xgroupCreateResult string var xaddResult string var xreadgroupResult []Stream err := bluto.Borrow().FlushAll(&flushResult).Commit() if err != nil { log.Panic(err) } err = bluto.Borrow().XGroupCreate(&xgroupCreateResult, "testStream", groupName, "0-0", commander.XGroupCreateOptionMKStream{}).Commit() if err != nil { log.Panic(err) } err = bluto.Borrow().XAdd(&xaddResult, "testStream", "*", &Fields{Key: key}).Commit() if err != nil { log.Panic(err) } err = bluto.Borrow().XReadGroup(&xreadgroupResult, groupName, consumerName, []string{"testStream"}, []string{">"}).Commit() if err != nil { log.Panic(err) } fmt.Println(xreadgroupResult[0].Messages[0].Fields.Key) }
Output: SomeKey
Directories
¶
Path | Synopsis |
---|---|
Package bluto is a Redis connection pool which can lend Redis connections.
|
Package bluto is a Redis connection pool which can lend Redis connections. |
Package commander is basically a connection to redis which supports multiple chained commands, and it can return the connection to the pool when finished It also handle scanning the results.
|
Package commander is basically a connection to redis which supports multiple chained commands, and it can return the connection to the pool when finished It also handle scanning the results. |