redis.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. package kvdb
  2. import (
  3. "github.com/go-redis/redis"
  4. "strings"
  5. )
  6. type (
  7. RedisDb struct {
  8. addr string
  9. db int
  10. password string
  11. engine *redis.Client
  12. }
  13. redisIterator struct {
  14. pos int //当前位置
  15. cursor uint64 //游标位置
  16. key string //当前获取的key
  17. keys []string //存储的keys数组
  18. prefix string //搜索的前缀
  19. flag int32 //是否结束搜索
  20. client *redis.Client
  21. }
  22. )
  23. func (i *redisIterator) Next() bool {
  24. if (i.keys == nil || i.pos >= len(i.keys)) && i.flag != 1 {
  25. ret := i.client.Scan(i.cursor, i.prefix, 100)
  26. if ret.Err() != nil {
  27. return false
  28. }
  29. i.keys, i.cursor = ret.Val()
  30. if i.cursor == 0 {
  31. i.flag = 1
  32. }
  33. i.pos = 0
  34. }
  35. if i.pos < len(i.keys) {
  36. i.key = i.keys[i.pos]
  37. i.pos++
  38. return true
  39. }
  40. return false
  41. }
  42. func (i *redisIterator) Key() string {
  43. return strings.TrimPrefix(i.key,"kv:db$:")
  44. }
  45. func (i *redisIterator) Value() []byte {
  46. cmd := i.client.Get(i.key)
  47. if cmd.Err() == nil {
  48. return []byte(cmd.Val())
  49. } else {
  50. return nil
  51. }
  52. }
  53. func (i *redisIterator) Close() error {
  54. i.pos = 0
  55. return nil
  56. }
  57. func newRedisIterator(c *redis.Client, prefix string) *redisIterator {
  58. if !strings.HasSuffix(prefix, "*") {
  59. prefix = prefix + "*"
  60. }
  61. return &redisIterator{client: c, prefix: prefix}
  62. }
  63. func (db *RedisDb) Open() error {
  64. db.engine = redis.NewClient(&redis.Options{
  65. Addr: db.addr,
  66. Password: db.password,
  67. DB: db.db,
  68. })
  69. return db.engine.Ping().Err()
  70. }
  71. func (db *RedisDb) generateKey(s string) string {
  72. return "kv:db$:" + s
  73. }
  74. func (db *RedisDb) Put(s string, bytes []byte) error {
  75. return db.engine.Set(db.generateKey(s), string(bytes), 0).Err()
  76. }
  77. func (db *RedisDb) Get(s string) ([]byte, error) {
  78. cmd := db.engine.Get(db.generateKey(s))
  79. if cmd.Err() == nil {
  80. return []byte(cmd.Val()), nil
  81. } else {
  82. return nil, cmd.Err()
  83. }
  84. }
  85. func (db *RedisDb) Delete(s string) error {
  86. return db.engine.Del(db.generateKey(s)).Err()
  87. }
  88. func (db *RedisDb) Iterator(s string) (Iterator, error) {
  89. return newRedisIterator(db.engine, db.generateKey(s)), nil
  90. }
  91. func (db *RedisDb) Close() error {
  92. return db.engine.Close()
  93. }
  94. func NewRedis(addr, password string, db int) *RedisDb {
  95. return &RedisDb{
  96. addr: addr,
  97. password: password,
  98. db: db,
  99. }
  100. }