项目作者: pete911

项目描述 :
golang redigo examples
高级语言:
项目地址: git://github.com/pete911/examples-redigo.git
创建时间: 2016-11-16T10:23:01Z
项目社区:https://github.com/pete911/examples-redigo

开源协议:

下载


examples-redigo

Examples on using redigo library. First file contains initialized redis pool
that is stored in Pool variable. Pool connects by default localhost:6379.
This can be changed by passing REDIS_HOST environment variable.

redis/pool.go file

  1. package redis
  2. import (
  3. "github.com/gomodule/redigo/redis"
  4. "os"
  5. "os/signal"
  6. "syscall"
  7. "time"
  8. )
  9. var (
  10. Pool *redis.Pool
  11. )
  12. func init() {
  13. redisHost := os.Getenv("REDIS_HOST")
  14. if redisHost == "" {
  15. redisHost = ":6379"
  16. }
  17. Pool = newPool(redisHost)
  18. cleanupHook()
  19. }
  20. func newPool(server string) *redis.Pool {
  21. return &redis.Pool{
  22. MaxIdle: 3,
  23. IdleTimeout: 240 * time.Second,
  24. Dial: func() (redis.Conn, error) {
  25. c, err := redis.Dial("tcp", server)
  26. if err != nil {
  27. return nil, err
  28. }
  29. return c, err
  30. },
  31. TestOnBorrow: func(c redis.Conn, t time.Time) error {
  32. _, err := c.Do("PING")
  33. return err
  34. },
  35. }
  36. }
  37. func cleanupHook() {
  38. c := make(chan os.Signal, 1)
  39. signal.Notify(c, os.Interrupt)
  40. signal.Notify(c, syscall.SIGTERM)
  41. signal.Notify(c, syscall.SIGKILL)
  42. go func() {
  43. <-c
  44. Pool.Close()
  45. os.Exit(0)
  46. }()
  47. }

Util file provides basic (most common) redis operations. This is supposed to be
an example not full list of all operations.

redis/util.go file

  1. package redis
  2. import (
  3. "fmt"
  4. "github.com/gomodule/redigo/redis"
  5. )
  6. func Ping() error {
  7. conn := Pool.Get()
  8. defer conn.Close()
  9. _, err := redis.String(conn.Do("PING"))
  10. if err != nil {
  11. return fmt.Errorf("cannot 'PING' db: %v", err)
  12. }
  13. return nil
  14. }
  15. func Get(key string) ([]byte, error) {
  16. conn := Pool.Get()
  17. defer conn.Close()
  18. var data []byte
  19. data, err := redis.Bytes(conn.Do("GET", key))
  20. if err != nil {
  21. return data, fmt.Errorf("error getting key %s: %v", key, err)
  22. }
  23. return data, err
  24. }
  25. func Set(key string, value []byte) error {
  26. conn := Pool.Get()
  27. defer conn.Close()
  28. _, err := conn.Do("SET", key, value)
  29. if err != nil {
  30. v := string(value)
  31. if len(v) > 15 {
  32. v = v[0:12] + "..."
  33. }
  34. return fmt.Errorf("error setting key %s to %s: %v", key, v, err)
  35. }
  36. return err
  37. }
  38. func Exists(key string) (bool, error) {
  39. conn := Pool.Get()
  40. defer conn.Close()
  41. ok, err := redis.Bool(conn.Do("EXISTS", key))
  42. if err != nil {
  43. return ok, fmt.Errorf("error checking if key %s exists: %v", key, err)
  44. }
  45. return ok, err
  46. }
  47. func Delete(key string) error {
  48. conn := Pool.Get()
  49. defer conn.Close()
  50. _, err := conn.Do("DEL", key)
  51. return err
  52. }
  53. func GetKeys(pattern string) ([]string, error) {
  54. conn := Pool.Get()
  55. defer conn.Close()
  56. iter := 0
  57. keys := []string{}
  58. for {
  59. arr, err := redis.Values(conn.Do("SCAN", iter, "MATCH", pattern))
  60. if err != nil {
  61. return keys, fmt.Errorf("error retrieving '%s' keys", pattern)
  62. }
  63. iter, _ = redis.Int(arr[0], nil)
  64. k, _ := redis.Strings(arr[1], nil)
  65. keys = append(keys, k...)
  66. if iter == 0 {
  67. break
  68. }
  69. }
  70. return keys, nil
  71. }
  72. func Incr(counterKey string) (int, error) {
  73. conn := Pool.Get()
  74. defer conn.Close()
  75. return redis.Int(conn.Do("INCR", counterKey))
  76. }