文章目录
1. 知识储备2. 安装redis客户端3. 常见的全局命令4. Redis的string类型操作5. Redis的hash类型操作6. Redis的list类型操作7. Redis的set类型操作8. Redis的zset类型操作9. Redis简单的订阅/发布
1. 知识储备
知道Redis是个啥?知道Redis的基础命令怎么操作测试的环境中安装了Redis的服务端(无论是win还Linux环境)Go语言基础知识
Redis命令参考
2. 安装redis客户端
Go语言的Redi客户端包很多,我们只取最常见的Redis包.
如下我们列出Redis常见的包,这些包在github都可以查询到,如下列出的两个包更新较快,功能齐全
包名github地址参考文档
go-redis/redishttps://github.com/go-redis/redishttps://godoc.org/github.com/go-redis/redisgomodule/redigohttps://github.com/gomodule/redigohttps://godoc.org/github.com/gomodule/redigo/redis
我们选择安装其中一个包即可,此处选择是go-redis这个包
go get -u github.com/go-redis/redis
3. 常见的全局命令
全局命令是对任意类型的键都有效果的
代码中展示的只是部分命令的使用
package main
import (
"fmt"
"github.com/go-redis/redis"
"time"
)
const (
REDIS_IP
= "127.0.0.1"
REDIS_PORT
= "6379"
REDIS_PWD
= ""
REDIS_DB
= 0
)
var client
*redis
.Client
func init() {
client
= redis
.NewClient(&redis
.Options
{
Addr
: REDIS_IP
+ ":" + REDIS_PORT
,
Password
: REDIS_PWD
,
DB
: REDIS_DB
,
PoolSize
: 20,
})
}
func main() {
keys
:= client
.Keys("*").Val()
fmt
.Println(keys
)
size
:= client
.DbSize().Val()
fmt
.Println(size
)
exist
:= client
.Exists("age","name").Val()
fmt
.Println(exist
)
del
:= client
.Del("unknownKey").Val()
fmt
.Println(del
)
ttl
:= client
.TTL("age").Val()
fmt
.Println(ttl
)
expire
:= client
.Expire("age",time
.Second
*86400).Val()
fmt
.Println(expire
)
Rtype
:= client
.Type("store:finish:bill:list").Val()
fmt
.Println(Rtype
)
Rname
:= client
.RenameNX("age","newAge").Val()
fmt
.Println(Rname
)
key
:= client
.RandomKey().Val()
fmt
.Println(key
)
}
4. Redis的string类型操作
package main
import (
"fmt"
"github.com/go-redis/redis"
"time"
)
const (
REDIS_IP
= "127.0.0.1"
REDIS_PORT
= "6379"
REDIS_PWD
= ""
REDIS_DB
= 0
)
var client
*redis
.Client
func init() {
client
= redis
.NewClient(&redis
.Options
{
Addr
: REDIS_IP
+ ":" + REDIS_PORT
,
Password
: REDIS_PWD
,
DB
: REDIS_DB
,
PoolSize
: 20,
})
}
func main() {
defer client
.Close()
defer func() {
if err
:= recover(); err
!= nil {
fmt
.Println(err
)
}
}()
set1
:= client
.Set("age", 10, time
.Hour
*24).Val()
fmt
.Println(set1
)
set2
:= client
.SetNX("age", "20", time
.Hour
*12).Val()
fmt
.Println(set2
)
set3
:= client
.SetXX("age", "30", time
.Second
*86400).Val()
fmt
.Println(set3
)
set4
:= client
.MSet("age1", "40", "age2", "50").Val()
fmt
.Println(set4
)
get1
:= client
.Get("age2").Val()
fmt
.Println(get1
)
get2
:= client
.MGet("age", "age1", "age2").Val()
fmt
.Println(get2
)
incr1
:= client
.Incr("age").Val()
fmt
.Println(incr1
)
decr1
:= client
.Decr("age1").Val()
fmt
.Println(decr1
)
incr2
:= client
.IncrBy("age", 10).Val()
fmt
.Println(incr2
)
decr2
:= client
.DecrBy("age1", 10).Val()
fmt
.Println(decr2
)
append1
:= client
.Append("age2", "abcd").Val()
fmt
.Println(append1
)
strlen1
:= client
.StrLen("age2").Val()
fmt
.Println(strlen1
)
getset1
:= client
.GetSet("age2", "hello golang").Val()
fmt
.Println(getset1
)
_ = client
.SetRange("age2", 0, "H")
fmt
.Println(client
.Get("age2").Val())
newStr
:= client
.GetRange("age2", 6, 11).Val()
fmt
.Println(newStr
)
}
5. Redis的hash类型操作
package main
import (
"fmt"
"github.com/go-redis/redis"
)
const (
REDIS_IP
= "127.0.0.1"
REDIS_PORT
= "6379"
REDIS_PWD
= ""
REDIS_DB
= 0
)
var client
*redis
.Client
func init() {
client
= redis
.NewClient(&redis
.Options
{
Addr
: REDIS_IP
+ ":" + REDIS_PORT
,
Password
: REDIS_PWD
,
DB
: REDIS_DB
,
PoolSize
: 20,
})
}
func main() {
defer client
.Close()
defer func() {
if err
:= recover(); err
!= nil {
fmt
.Println(err
)
}
}()
key
:= "account"
field1
:= "name"
fields
:= map[string]interface{}{
"addr":"beijing",
"age":99,
"skills":"golang",
"demo1":"aaa",
"demo2":"bbb",
}
_ = client
.HSet(key
,field1
,"zhangsan")
status
:= client
.HMSet(key
,fields
).Val()
fmt
.Println(status
)
_ = client
.HDel(key
,"demo2").Val()
name
:= client
.HGet(key
,"name").Val()
fmt
.Println(name
)
values
:= client
.HMGet(key
,"name","age").Val()
fmt
.Println(values
)
valueAll
:= client
.HGetAll(key
).Val()
fmt
.Println(valueAll
)
fs
:= client
.HKeys(key
).Val()
fmt
.Println(fs
)
vs
:= client
.HVals(key
).Val()
fmt
.Println(vs
)
e
:= client
.HExists(key
,"skills").Val()
fmt
.Println(e
)
n
:= client
.HIncrBy(key
,"age",1).Val()
fmt
.Println(n
)
}
6. Redis的list类型操作
package main
import (
"fmt"
"github.com/go-redis/redis"
"strconv"
)
const (
REDIS_IP
= "127.0.0.1"
REDIS_PORT
= "6379"
REDIS_PWD
= ""
REDIS_DB
= 0
)
var client
*redis
.Client
func init() {
client
= redis
.NewClient(&redis
.Options
{
Addr
: REDIS_IP
+ ":" + REDIS_PORT
,
Password
: REDIS_PWD
,
DB
: REDIS_DB
,
PoolSize
: 20,
})
}
func main() {
defer client
.Close()
defer func() {
if err
:= recover(); err
!= nil {
fmt
.Println(err
)
}
}()
key
:= "demo"
client
.Del(key
)
for i
:= 0; i
< 5; i
++ {
client
.LPush(key
, "e-"+strconv
.Itoa(i
))
}
length
:= client
.LLen(key
).Val()
fmt
.Println(length
)
value1
:= client
.LIndex(key
, 0).Val()
fmt
.Println(value1
)
vs
:= client
.LRange(key
, 0, -1).Val()
fmt
.Println(vs
)
status
:= client
.LSet(key
, 0, "golang").Val()
fmt
.Println(status
)
client
.RPush(key
, "e-right")
client
.LPush(key
, "e-left")
v1
:= client
.RPop(key
).Val()
fmt
.Println(v1
)
v2
:= client
.LPop(key
).Val()
fmt
.Println(v2
)
n
:= client
.LRem(key
, 0, "e-3").Val()
fmt
.Println(n
)
status1
:= client
.LTrim(key
, 0, 1).Val()
fmt
.Println(status1
)
}
7. Redis的set类型操作
package main
import (
"fmt"
"github.com/go-redis/redis"
"strconv"
)
const (
REDIS_IP
= "127.0.0.1"
REDIS_PORT
= "6379"
REDIS_PWD
= ""
REDIS_DB
= 0
)
var client
*redis
.Client
func init() {
client
= redis
.NewClient(&redis
.Options
{
Addr
: REDIS_IP
+ ":" + REDIS_PORT
,
Password
: REDIS_PWD
,
DB
: REDIS_DB
,
PoolSize
: 20,
})
}
func main() {
defer client
.Close()
defer func() {
if err
:= recover(); err
!= nil {
fmt
.Println(err
)
}
}()
key
:= "sdemo"
key1
:= "sdemo1"
client
.Del(key
)
client
.Del(key1
)
for i
:= 0; i
< 6; i
++ {
client
.SAdd(key
, "ele-"+strconv
.Itoa(i
))
}
for i
:= 3; i
< 9; i
++ {
client
.SAdd(key1
, "ele-"+strconv
.Itoa(i
))
}
n1
:= client
.SCard(key
).Val()
fmt
.Println(n1
)
e1
:= client
.SIsMember(key
, "ele-0").Val()
fmt
.Println(e1
)
v1
:= client
.SRandMember(key
).Val()
fmt
.Println(v1
)
v2
:= client
.SRandMemberN(key
, 3).Val()
fmt
.Println(v2
)
v3
:= client
.SMembers(key
).Val()
fmt
.Println(v3
)
v4
:= client
.SPop(key
).Val()
fmt
.Println(v4
)
n2
:= client
.SRem(key
, "ele-5").Val()
fmt
.Println(n2
)
s1
:= client
.SInter(key
, key1
).Val()
fmt
.Println(s1
)
s2
:= client
.SUnion(key
, key1
).Val()
fmt
.Println(s2
)
s3
:= client
.SDiff(key
, key1
).Val()
fmt
.Println(s3
)
s4
:= client
.SInterStore("sdemo2", key
, key1
).Val()
fmt
.Println(s4
)
fmt
.Println(client
.SMembers("sdemo2").Val())
s5
:= client
.SUnionStore("sdemo3", key
, key1
).Val()
fmt
.Println(s5
)
fmt
.Println(client
.SMembers("sdemo3").Val())
s6
:= client
.SDiffStore("sdemo4", key
, key1
).Val()
fmt
.Println(s6
)
fmt
.Println(client
.SMembers("sdemo4").Val())
}
8. Redis的zset类型操作
package main
import (
"fmt"
"github.com/go-redis/redis"
"math/rand"
"strconv"
)
const (
REDIS_IP
= "127.0.0.1"
REDIS_PORT
= "6379"
REDIS_PWD
= ""
REDIS_DB
= 0
)
var client
*redis
.Client
func init() {
client
= redis
.NewClient(&redis
.Options
{
Addr
: REDIS_IP
+ ":" + REDIS_PORT
,
Password
: REDIS_PWD
,
DB
: REDIS_DB
,
PoolSize
: 20,
})
}
func randString(n
int) string {
s
:= "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
b
:= make([]byte, n
)
for i
:= range b
{
b
[i
] = s
[rand
.Intn(len(s
))]
}
return string(b
)
}
func main() {
defer client
.Close()
defer func() {
if err
:= recover(); err
!= nil {
fmt
.Println(err
)
}
}()
key
:= "zdemo"
key1
:= "zdemo1"
client
.Del(key
)
client
.Del(key1
)
for i
:= 0; i
< 10; i
++ {
score
:= float64(rand
.Intn(100) - 50)
member
:= "golang-" + strconv
.Itoa(i
)
data
:= &redis
.Z
{
score
,
member
,
}
client
.ZAdd(key
, data
).Val()
}
for i
:= 0; i
< 5; i
++ {
score
:= float64(rand
.Intn(100) - 50)
member
:= "golang-" + strconv
.Itoa(i
)
data
:= &redis
.Z
{
score
,
member
,
}
client
.ZAdd(key1
, data
).Val()
}
n1
:= client
.ZCard(key
).Val()
fmt
.Println(n1
)
s1
:= client
.ZScore(key
, "golang-6").Val()
fmt
.Println(s1
)
v1
:= client
.ZIncrBy(key
, 60.00, "golang-6").Val()
fmt
.Println(v1
)
s2
:= client
.ZRank(key
, "golang-6").Val()
fmt
.Println(s2
)
s3
:= client
.ZRevRank(key
, "golang-6").Val()
fmt
.Println(s3
)
s4
:= client
.ZRange(key
, 0, n1
-5).Val()
fmt
.Println(s4
)
s5
:= client
.ZRevRange(key
, 0, n1
-5).Val()
fmt
.Println(s5
)
v2
:= client
.ZRem(key
, "golang-6").Val()
fmt
.Println(v2
)
key2
:= "zdemo2"
kslice
:= []string{key
, key1
}
wslice
:= []float64{1.00, 1.00}
z
:= &redis
.ZStore
{
kslice
,
wslice
,
"SUM",
}
r1
:= client
.ZInterStore(key2
, z
).Val()
fmt
.Println(r1
)
key3
:= "zdemo3"
r2
:= client
.ZUnionStore(key3
,z
).Val()
fmt
.Println(r2
)
}
9. Redis简单的订阅/发布
订阅多频道的demo
subscription.go
package main
import (
"fmt"
"github.com/go-redis/redis"
)
const (
REDIS_IP
= "127.0.0.1"
REDIS_PORT
= "6379"
REDIS_PWD
= ""
REDIS_DB
= 0
)
var client
*redis
.Client
func init() {
client
= redis
.NewClient(&redis
.Options
{
Addr
: REDIS_IP
+ ":" + REDIS_PORT
,
Password
: REDIS_PWD
,
DB
: REDIS_DB
,
PoolSize
: 20,
})
}
func main() {
defer client
.Close()
defer func() {
if err
:= recover(); err
!= nil {
fmt
.Println(err
)
}
}()
sub
:= client
.PSubscribe("news", "it", "sports", "shopping")
_, err
:= sub
.Receive()
if err
!= nil {
fmt
.Println(err
)
}
ch
:= sub
.Channel()
for message
:= range ch
{
fmt
.Println(message
.Channel
, message
.Payload
)
}
}
go run subscription.go
发布信息到不同频道的demo
publish.go
package main
import (
"fmt"
"github.com/go-redis/redis"
"math/rand"
)
const (
REDIS_IP
= "127.0.0.1"
REDIS_PORT
= "6379"
REDIS_PWD
= ""
REDIS_DB
= 0
)
var client
*redis
.Client
func init() {
client
= redis
.NewClient(&redis
.Options
{
Addr
: REDIS_IP
+ ":" + REDIS_PORT
,
Password
: REDIS_PWD
,
DB
: REDIS_DB
,
PoolSize
: 20,
})
}
func randString(n
int) string {
s
:= "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"
b
:= make([]byte, n
)
for i
:= range b
{
b
[i
] = s
[rand
.Intn(len(s
))]
}
return string(b
)
}
func main() {
defer client
.Close()
defer func() {
if err
:= recover(); err
!= nil {
fmt
.Println(err
)
}
}()
var data
string
var channels
[]string = []string{"news", "it", "sports", "shopping"}
for {
fmt
.Printf("please input some data:")
fmt
.Scanln(&data
)
if data
== "quit" {
break
}
channel
:= channels
[rand
.Intn(4)]
result
:= client
.Publish(channel
, data
+randString(10)).Val()
if result
== 1 {
fmt
.Println("send info to", channel
,"success")
}
}
}
go run publish.go
测试
在发布消息的代码执行窗口,输入任意的消息
please input some data:asjdasd
send info to it success
please input some data:asdasd
send info to shopping success
please input some data:iii
send info to news success
在订阅代码的执行窗口接收消息
it asdasdpLnfgDsc3W
it asjdasdpLnfgDsc3W
shopping asdasd9F3qNfHK6a
news iii5jjJkwzDkh