15 Commits

Author SHA1 Message Date
  guzeng bd0e173742 更新import包 8 months ago
  loshiqi fa6ee5b87e 有序集合增加浮点型写入 1 year ago
  guzeng fc77d615ab 增加获取过期时间 1 year ago
  guzeng 74a4aeef10 删除无用方法 1 year ago
  guzeng b768284e21 增加hash查询多个键值 1 year ago
  loshiqi 8d64d44e08 增加rpop 1 year ago
  guzeng 8ed838ada2 修改与配置无关 1 year ago
  guzeng 237b07c53a 修改redis默认地址 1 year ago
  guzeng dc1ba04572 增加ZScoreInt64方法 2 years ago
  guzeng 00352882da 增加hash keys/vals方法 2 years ago
  guzeng 4b10313f40 修改redis连接 2 years ago
  guzeng 8dd1731b3f 增加有序集合处理 2 years ago
  guzeng e940890234 增加HList方法 2 years ago
  guzeng ce70046aea Merge branch 'master' of ssh://git.tetele.net:4001/tgo/redis 2 years ago
  guzeng 627b8d214d 增加exists 2 years ago
15 changed files with 613 additions and 92 deletions
Split View
  1. +3
    -0
      conn.go
  2. +14
    -0
      exists.go
  3. +15
    -0
      exists_test.go
  4. +17
    -0
      expire.go
  5. +24
    -0
      expire_test.go
  6. +1
    -1
      go.mod
  7. +0
    -1
      go.sum
  8. +128
    -0
      hash.go
  9. +41
    -0
      hash_test.go
  10. +30
    -8
      init.go
  11. +13
    -0
      list.go
  12. +0
    -82
      set.go
  13. +17
    -0
      string_test.go
  14. +269
    -0
      zset.go
  15. +41
    -0
      zset_test.go

+ 3
- 0
conn.go View File

@ -6,6 +6,9 @@ import (
//取值
func GetConn() redisdb.Conn {
if Pool == nil {
Conn()
}
return Pool.Get()
}


+ 14
- 0
exists.go View File

@ -0,0 +1,14 @@
package redis
import (
redisdb "github.com/gomodule/redigo/redis"
)
//exists
func Exist(key string) (bool, error) {
c := GetConn()
defer c.Close()
return redisdb.Bool(c.Do("EXISTS", key))
}

+ 15
- 0
exists_test.go View File

@ -0,0 +1,15 @@
package redis
import (
"testing"
)
func Test_Exists(t *testing.T) {
RedisInit("127.0.0.1:6379", "123456")
ret3, err := Exists("60007_product2")
t.Log(ret3)
t.Log(err)
}

+ 17
- 0
expire.go View File

@ -20,3 +20,20 @@ func SetExpire(key string, expire int64) (int64, error) {
}
return redisdb.Int64(reply, err)
}
/**
* 获取有效期
*/
func GetExpire(key string) (int64, error) {
c := GetConn()
var err error
var reply interface{}
reply, err = c.Do("TTL", key)
CloseConn(c)
if err != nil {
return 0, err
}
return redisdb.Int64(reply, err)
}

+ 24
- 0
expire_test.go View File

@ -0,0 +1,24 @@
package redis
import (
// "strconv"
"testing"
// "tgo/helper"
)
func Test_GetExpire(t *testing.T) {
RedisPassword = "123456"
RedisInit("127.0.0.1:6379", RedisPassword)
Set("test1", "sss")
ret3, err := SetExpire("test1", 10)
t.Log(ret3)
t.Log(err)
ret4, err := GetExpire("test1")
t.Log(ret4)
t.Log(err)
}

+ 1
- 1
go.mod View File

@ -1,6 +1,6 @@
module git.tetele.net/tgo/redis
go 1.17
go 1.16
require (
git.tetele.net/tgo/helper v0.3.1


+ 0
- 1
go.sum View File

@ -9,7 +9,6 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

+ 128
- 0
hash.go View File

@ -96,6 +96,65 @@ func HGetAll(key string) ([]map[string]string, error) {
}
//hash取所有值
func HGetList(key string) ([]string, error) {
c := GetConn()
ret, err := c.Do("HGETAll", key)
reply := make([][]byte, 0)
if err == nil {
reply, err = redisdb.ByteSlices(ret, err)
}
// var info map[string]string
var all []string
if len(reply) > 0 {
for key, item := range reply {
if (key+1)%2 == 0 { //只处理偶数位
all = append(all, string(item))
}
}
}
CloseConn(c)
return all, err
}
//hash取所有值
func HGetAllItem(key string) (map[string]string, error) {
c := GetConn()
ret, err := c.Do("HGETAll", key)
reply := make([][]byte, 0)
if err == nil {
reply, err = redisdb.ByteSlices(ret, err)
}
var info map[string]string = make(map[string]string)
if len(reply) > 0 {
for key, item := range reply {
if key%2 == 0 { //只处理奇数位
info[string(item)] = string(reply[key+1])
}
}
}
CloseConn(c)
return info, err
}
/*
* hash存值,
* key
@ -168,6 +227,39 @@ func HMSet(args ...interface{}) (interface{}, error) {
return reply, err
}
/*
* hash批量查询,
* args (key,field,field,field...) , ...
* 2020/06/06
*/
func HMGet(args ...interface{}) (interface{}, error) {
c := GetConn()
reply, err := c.Do("HMGET", args...)
CloseConn(c)
return reply, err
}
/*
* hash批量查询,
* args (key,field,field,field...) , ...
* 2020/06/06
*/
func HMGetString(args ...interface{}) ([]string, error) {
c := GetConn()
reply, err := c.Do("HMGET", args...)
CloseConn(c)
list := make([]string, 0)
if err == nil {
list, err = redisdb.Strings(reply, err)
}
return list, err
}
/*
* hash存值,
* key
@ -199,3 +291,39 @@ func HExists(key, field string) (int64, error) {
return redisdb.Int64(reply, nil)
}
}
/**
* hash 键名
*/
func HKeys(key string) ([]string, error) {
c := GetConn()
ret, err := c.Do("HKEYS", key)
reply := make([]string, 0)
if err == nil {
reply, err = redisdb.Strings(ret, err)
}
CloseConn(c)
return reply, err
}
/**
* hash 键值
*/
func HVals(key string) ([]string, error) {
c := GetConn()
ret, err := c.Do("HVALS", key)
reply := make([]string, 0)
if err == nil {
reply, err = redisdb.Strings(ret, err)
}
CloseConn(c)
return reply, err
}

+ 41
- 0
hash_test.go View File

@ -0,0 +1,41 @@
package redis
import (
// "strconv"
"testing"
// "tgo/helper"
)
func Test_HVals(t *testing.T) {
ret3, err := HVals("sites")
t.Log(ret3)
t.Log(err)
ret4, err := HKeys("sites")
t.Log(ret4)
t.Log(err)
}
func Test_HGetAllItem(t *testing.T) {
RedisPassword = "123456"
ret3, err := HGetAllItem("60007_config")
t.Log(ret3)
t.Log(err)
}
func Test_HMGet(t *testing.T) {
RedisPassword = "123456"
ret3, err := HMGetString("60007_config", "wx_mp_appsecret", "wx_mp_appid", "withdrawal_rate")
t.Log(ret3)
t.Log(err)
}
func Test_HGetAll(t *testing.T) {
RedisPassword = "123456"
ret3, err := HGetAll("60007_user")
t.Log(ret3)
t.Log(err)
}

+ 30
- 8
init.go View File

@ -3,22 +3,39 @@ package redis
import (
"log"
"time"
redisdb "github.com/gomodule/redigo/redis"
)
// 定义redis链接池
var Pool *redisdb.Pool
var redisServerUrl string = "127.0.0.1:6379"
// redis服务地址,如需更改,在api服务中设置
var RedisServerUrl string = "127.0.0.1:6379"
// redis密码,如需更改,在api服务中设置
var RedisPassword string = ""
var MaxActive, MaxIdle int = 1, 1 //最大的激活连接数,最大的空闲连接数
// func init() {
// if Pool == nil {
// RedisInit()
// }
// }
// 初始化redis链接池
func RedisInit(serverUrl string,max ...int) {
func Conn() {
RedisInit(RedisServerUrl, RedisPassword, MaxActive, MaxIdle)
}
/*
* 初始化redis链接池
* @param serverUrl 服务地址
* @param password 密码
* @param max 最大的激活连接数,最大的空闲连接数
*/
func RedisInit(serverUrl, password string, max ...int) {
var MaxActive, MaxIdle int
if len(max) > 0 {
MaxActive = max[0]
}
@ -27,7 +44,10 @@ func RedisInit(serverUrl string,max ...int) {
}
if serverUrl != "" {
redisServerUrl = serverUrl
RedisServerUrl = serverUrl
}
if password != "" {
RedisPassword = password
}
Pool = &redisdb.Pool{
@ -40,16 +60,18 @@ func RedisInit(serverUrl string,max ...int) {
func redisConn() (redisdb.Conn, error) {
dbOption := redisdb.DialDatabase(0)
pwOption := redisdb.DialPassword("")
pwOption := redisdb.DialPassword(RedisPassword)
// **重要** 设置读写超时
readTimeout := redisdb.DialReadTimeout(time.Second * time.Duration(2))
writeTimeout := redisdb.DialWriteTimeout(time.Second * time.Duration(5))
conTimeout := redisdb.DialConnectTimeout(time.Second * time.Duration(2))
c, err := redisdb.Dial("tcp", redisServerUrl, dbOption, pwOption, readTimeout, writeTimeout, conTimeout)
c, err := redisdb.Dial("tcp", RedisServerUrl, dbOption, pwOption, readTimeout, writeTimeout, conTimeout)
if err != nil {
log.Println("redis server connect failed", err)
log.Println("redis connect failed", err)
return nil, err
} else {
log.Println("redis connected", RedisServerUrl)
}
return c, nil
}

+ 13
- 0
list.go View File

@ -18,7 +18,20 @@ func Rpush(key string, field interface{}) (int64, error) {
return redisdb.Int64(reply, nil)
}
//移除列表的最后一个元素,返回值为移除的元素。
func Rpop(key string) ([]byte, error) {
c := GetConn()
ret, err := c.Do("RPOP", key)
CloseConn(c)
if err != nil {
return nil, err
}
reply, err := redisdb.Bytes(ret, err)
return reply, err
}
//list 头部增加值
func Lpush(key string, field interface{}) (int64, error) {


+ 0
- 82
set.go View File

@ -1,8 +1,6 @@
package redis
import (
"errors"
redisdb "github.com/gomodule/redigo/redis"
)
@ -93,83 +91,3 @@ func SMembers(key string) ([]byte, error) {
return reply, err
}
func ZAdd(key, score, member string) (int64, error) {
c := GetConn()
reply, err := c.Do("ZADD", key, score, member)
CloseConn(c)
if err != nil {
return 0, err
} else {
return redisdb.Int64(reply, nil)
}
}
func ZIncrBy(key, inc, member string) (int64, error) {
c := GetConn()
reply, err := c.Do("ZINCRBY", key, inc, member)
CloseConn(c)
if err != nil {
return 0, err
} else {
return redisdb.Int64(reply, nil)
}
}
func ZRange(key string, start, stop int64) ([]map[string]string, error) {
c := GetConn()
defer CloseConn(c)
values, err := redisdb.Values(c.Do("ZRANGE", key, start, stop, "WITHSCORES"))
if err != nil {
return nil, err
}
if len(values)%2 != 0 {
return nil, errors.New("redigo: ZRange expects even number of values result")
}
var l []map[string]string
for i := 0; i < len(values); i += 2 {
key, okKey := values[i].([]byte)
value, okValue := values[i+1].([]byte)
if !okKey || !okValue {
return nil, errors.New("redigo: ZRange key not a bulk string value")
}
l = append(l, map[string]string{
"member": string(key),
"score": string(value),
})
}
return l, nil
}
func ZScan(key, field string, len int64) ([]string, error) {
c := GetConn()
defer CloseConn(c)
zscanResult, err := redisdb.Values(c.Do("ZSCAN", key, "0", "MATCH", field, "COUNT", len))
if err != nil {
return nil, err
}
var cursor int
var membersAndScores []string
var member []string
redisdb.Scan(zscanResult, &cursor, &membersAndScores)
for i, v := range membersAndScores {
if i%2 == 0 {
member = append(member, v)
}
}
return member, nil
}

+ 17
- 0
string_test.go View File

@ -0,0 +1,17 @@
package redis
import (
// "strconv"
"testing"
// "tgo/helper"
)
func Test_Exists(t *testing.T) {
RedisInit("127.0.0.1:6379", "123456")
ret3, err := Exists("60007_product")
t.Log(ret3)
t.Log(err)
}

+ 269
- 0
zset.go View File

@ -0,0 +1,269 @@
package redis
import (
"errors"
redisdb "github.com/gomodule/redigo/redis"
)
/**
* 集合成员数量
*/
func ZCard(key interface{}) (int64, error) {
c := GetConn()
reply, err := c.Do("ZCARD", key)
CloseConn(c)
if err != nil {
return 0, err
} else {
return redisdb.Int64(reply, nil)
}
}
/*
* 存值
* key
* member 成员
* score 分值
*/
func ZAdd(key string, score, member interface{}) (int64, error) {
c := GetConn()
reply, err := c.Do("ZADD", key, score, member)
CloseConn(c)
if err != nil {
return 0, err
} else {
return redisdb.Int64(reply, nil)
}
}
/*
* 存值
* key
* member 成员
* score 分值
*/
func ZAddFloat(key string, score, member interface{}) (float64, error) {
c := GetConn()
reply, err := c.Do("ZADD", key, score, member)
CloseConn(c)
if err != nil {
return 0, err
} else {
return redisdb.Float64(reply, nil)
}
}
/*
* 删除hash值
*/
func ZRem(key, member interface{}) (int64, error) {
c := GetConn()
reply, err := c.Do("ZREM", key, member)
CloseConn(c)
if err != nil {
return 0, err
} else {
return redisdb.Int64(reply, nil)
}
}
/*
* 区间数量
* key
* min/max 最小/最大值
*/
func ZCount(key string, min, max interface{}) (int64, error) {
c := GetConn()
reply, err := c.Do("ZCOUNT", key, min, max)
CloseConn(c)
if err != nil {
return 0, err
} else {
return redisdb.Int64(reply, nil)
}
}
/*
* 自增
* key
* member 成员
* inc 分值
*/
func ZIncrBy(key string, inc, member interface{}) (int64, error) {
c := GetConn()
reply, err := c.Do("ZINCRBY", key, inc, member)
CloseConn(c)
if err != nil {
return 0, err
} else {
return redisdb.Int64(reply, nil)
}
}
/*
* 自增
* key
* member 成员
* inc 分值
*/
func ZIncrByFloat(key string, inc, member interface{}) (float64, error) {
c := GetConn()
reply, err := c.Do("ZINCRBY", key, inc, member)
CloseConn(c)
if err != nil {
return 0, err
} else {
return redisdb.Float64(reply, nil)
}
}
func ZRange(key string, start, stop int64) ([]map[string]string, error) {
c := GetConn()
defer CloseConn(c)
values, err := redisdb.Values(c.Do("ZRANGE", key, start, stop, "WITHSCORES"))
if err != nil {
return nil, err
}
if len(values)%2 != 0 {
return nil, errors.New("redigo: ZRange expects even number of values result")
}
var l []map[string]string
for i := 0; i < len(values); i += 2 {
key, okKey := values[i].([]byte)
value, okValue := values[i+1].([]byte)
if !okKey || !okValue {
return nil, errors.New("redigo: ZRange key not a bulk string value")
}
l = append(l, map[string]string{
"member": string(key),
"score": string(value),
})
}
return l, nil
}
func ZScan(key, field string, len int64) ([]string, error) {
c := GetConn()
defer CloseConn(c)
zscanResult, err := redisdb.Values(c.Do("ZSCAN", key, "0", "MATCH", field, "COUNT", len))
if err != nil {
return nil, err
}
var cursor int
var membersAndScores []string
var member []string
redisdb.Scan(zscanResult, &cursor, &membersAndScores)
for i, v := range membersAndScores {
if i%2 == 0 {
member = append(member, v)
}
}
return member, nil
}
/*
* 回有序集合中指定成员的索引(从小到大排名)
* key
* member 成员
*/
func ZRank(key string, member interface{}) (int64, error) {
c := GetConn()
reply, err := c.Do("ZRANK", key, member)
CloseConn(c)
if err != nil {
return 0, err
} else {
return redisdb.Int64(reply, nil)
}
}
/*
* 有序集合中指定成员的索引(从大到小排名)
* key
* member 成员
*/
func ZRevrank(key string, member interface{}) (int64, error) {
c := GetConn()
reply, err := c.Do("ZREVRANK", key, member)
CloseConn(c)
if err != nil {
return 0, err
} else {
return redisdb.Int64(reply, nil)
}
}
/*
* 指定成员的分数
* key
* member 成员
*/
func ZScore(key string, member interface{}) (float64, error) {
c := GetConn()
reply, err := c.Do("ZSCORE", key, member)
CloseConn(c)
if err != nil {
return 0, err
} else {
return redisdb.Float64(reply, nil)
}
}
/*
* 指定成员的分数, 返回int64
* key
* member 成员
*/
func ZScoreInt64(key string, member interface{}) (int64, error) {
c := GetConn()
reply, err := c.Do("ZSCORE", key, member)
CloseConn(c)
if err != nil {
return 0, err
} else {
return redisdb.Int64(reply, nil)
}
}

+ 41
- 0
zset_test.go View File

@ -0,0 +1,41 @@
package redis
import (
"testing"
)
func Test_Zset(t *testing.T) {
Conn()
ret3, err := ZAdd("zset", 9, 9)
t.Log(ret3)
t.Log(err)
ret3, err = ZCard("zset")
t.Log(ret3)
t.Log(err)
// ret3, err = ZRem("zset", 9)
// t.Log(ret3)
// t.Log(err)
ret3, err = ZCount("zset", 0, 100)
t.Log(ret3)
t.Log(err)
ret3, err = ZIncrBy("zset", 10, 9)
t.Log(ret3)
t.Log(err)
ret3, err = ZRank("zset", 9)
t.Log(ret3)
t.Log(err)
ret3, err = ZRevrank("zset", 9)
t.Log(ret3)
t.Log(err)
ret4, err := ZScore("zset", 9)
t.Log(ret4)
t.Log(err)
}

Loading…
Cancel
Save