108 lines
2.5 KiB
Go
108 lines
2.5 KiB
Go
package redis
|
|
|
|
import (
|
|
"time"
|
|
|
|
"github.com/go-redis/redis"
|
|
)
|
|
|
|
//key: {name:value, name:value, name:value}
|
|
|
|
type Hash struct {
|
|
key string
|
|
client *redis.Client
|
|
}
|
|
|
|
func NewHash(client *redis.Client, key string) *Hash {
|
|
return &Hash{
|
|
key: key,
|
|
client: client,
|
|
}
|
|
}
|
|
|
|
func (s *Hash) Key() string {
|
|
return s.key
|
|
}
|
|
|
|
// Expire 设置集合过期时间
|
|
func (s *Hash) Expire(expiration time.Duration) (bool, error) {
|
|
return s.client.Expire(s.key, expiration).Result()
|
|
}
|
|
|
|
// Delete 删除一个或多个 Name
|
|
func (s *Hash) Delete(names ...string) (int64, error) {
|
|
return s.client.HDel(s.key, names...).Result()
|
|
}
|
|
|
|
// Exists 检测Name是否在哈希表中
|
|
func (s *Hash) Exists(name string) (bool, error) {
|
|
return s.client.HExists(s.key, name).Result()
|
|
}
|
|
|
|
// NameValues 获取所有哈希表数据
|
|
func (s *Hash) NameValues() (map[string]string, error) {
|
|
return s.client.HGetAll(s.key).Result()
|
|
}
|
|
|
|
// Names 获取所有哈希表的 Name
|
|
func (s *Hash) Names() ([]string, error) {
|
|
return s.client.HKeys(s.key).Result()
|
|
}
|
|
|
|
// Values 获取所有哈希表的 Total
|
|
func (s *Hash) Values() ([]string, error) {
|
|
return s.client.HVals(s.key).Result()
|
|
}
|
|
|
|
// SetNX 当name不存在时才向哈希表中设置一对Name:Total
|
|
func (s *Hash) SetNX(name string, value interface{}) (bool, error) {
|
|
return s.client.HSetNX(s.key, name, value).Result()
|
|
}
|
|
|
|
// Set 向哈希表中设置一对Name:Total
|
|
func (s *Hash) Set(name string, value interface{}) (bool, error) {
|
|
return s.client.HSet(s.key, name, value).Result()
|
|
}
|
|
|
|
// Get 获取哈希表中Name对应的Value
|
|
func (s *Hash) Get(name string) (string, error) {
|
|
return s.client.HGet(s.key, name).Result()
|
|
}
|
|
|
|
// IncInt 返回累加之后的新值
|
|
func (s *Hash) IncInt(name string, value int64) (int64, error) {
|
|
return s.client.HIncrBy(s.key, name, value).Result()
|
|
}
|
|
|
|
// IncFloat 返回累加之后的新值
|
|
func (s *Hash) IncFloat(name string, value float64) (float64, error) {
|
|
return s.client.HIncrByFloat(s.key, name, value).Result()
|
|
}
|
|
|
|
// Len 返回哈希表的大小
|
|
func (s *Hash) Len() (int64, error) {
|
|
return s.client.HLen(s.key).Result()
|
|
}
|
|
|
|
// Scan 扫描哈希表数据
|
|
func (s *Hash) Scan(match string, piece int64, callback func(name, value string)) error {
|
|
proc := func(l []string) {
|
|
for i := 0; i+1 < len(l); i += 2 {
|
|
callback(l[i], l[i+1])
|
|
}
|
|
}
|
|
lst, cur, err := s.client.HScan(s.key, 0, match, piece).Result()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
proc(lst)
|
|
for cur > 0 {
|
|
lst, cur, err = s.client.HScan(s.key, cur, match, piece).Result()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
proc(lst)
|
|
}
|
|
return nil
|
|
}
|