安装redis(docker)
sudo docker pull redis
sudo docker images
在官网下载redis.conf配置文件
redis官网:http://www.redis.cn/download.html
将下载后的压缩包解压得到redis.conf文件,放到自己的目录,我的是/home/yi/Project/redis/redis.conf
同时在redis目录下创建data文件夹用于存放redis数据
redis.conf 主流配置
bind 127.0.0.1 #注释掉这部分,使redis可以外部访问
daemonize no#用守护线程的方式启动
requirepass 你的密码#给redis设置密码
appendonly yes#redis持久化 默认是no
tcp-keepalive 300 #防止出现远程主机强迫关闭了一个现有的连接的错误 默认是300
protected-mode no #可以让别的域名访问
启动redis实例
sudo docker run -p 6379:6379 --name redis -v /home/yi/Project/redis/redis.conf:/etc/redis/redis.conf -v /home/yi/Project/redis/data:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes
需要通过-v容器卷的方式将redis.conf与redis/data目录映射到redis实例中。
redis-server /etc/redis/redis.conf:这个是关键配置,让redis不是无配置启动,而是按照这个redis.conf的配置启动
查看是否启动成功
sudo docker ps
sudo docker logs redis
进入容器运行redis命令行:
docker exec -it redis redis-cli
ping
收到pong则为成功.
go-redis
redis官网: https://redis.io/docs/clients/go/
安装包
go get github.com/redis/go-redis/v9
基本查询
client := redis.NewClient(&redis.Options{
Addr: "10.3.89.117:6379",
Password: "", //no password
DB: 0, //use default DB
})
//Set方法
err := client.Set(context.Background(), "test2", "t2", 0).Err()
if err != nil {
panic(err)
}
//Get方法
val, err := client.Get(context.Background(), "test2").Result()
if err != nil {
panic(err)
}
fmt.Println("val:", val)
//原生语句
val2, err := client.Do(context.Background(), "get", "test").Result()
println(val2.(string))
map插入哈希
session := map[string]string{"name": "John", "surname": "Smith", "company": "Redis", "age": "29"}
for k, v := range session {
err := client.HSet(ctx, "user-session:123", k, v).Err()
if err != nil {
panic(err)
}
}
userSession := client.HGetAll(ctx, "user-session:123").Val()
fmt.Println(userSession)
发布订阅机制
由channel、发布者、多个订阅者组成,发布者、订阅者都为redis客户端。
发布者在指定channel发布消息后,订阅者会通过channel接受发布的消息,类似于组播。
图自:https://juejin.cn/post/7202521955366879288#heading-3文章来源:https://www.toymoban.com/news/detail-522957.html
//subscribe
go func() {
sub := client.Subscribe(context.Background(), "channel1")
for msg := range sub.Channel() {
fmt.Println("Subscribe:", msg.Channel, msg.Payload) //Subscribe:channel1 hellox
}
}()
time.Sleep(time.Second)
//publish
go func() {
for i := 0; i < 10; i++ {
client.Publish(context.Background(), "channel1", "hello"+strconv.Itoa(i))
}
}()
time.Sleep(time.Second * 5)
事务
需要注意在调用exec函数后事务才会被执行,res.Result() /Val()等查询结果需要在exec函数之后执行。文章来源地址https://www.toymoban.com/news/detail-522957.html
go func() {
//开启事务
txPipeline := client.TxPipeline()
//Do something
res1 := txPipeline.SMembers(context.Background(), "set1")
res2 := txPipeline.Get(context.Background(), "test")
txPipeline.Set(context.Background(), "test", "99", 0)
//执行事务
_, err := txPipeline.Exec(context.Background())
if err != nil {
panic(err)
}
fmt.Println(res1.Result())
fmt.Println(res2.Val())
fmt.Println("tx end!")
}()
到了这里,关于go-redis的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!