Golang 如何使用Redis服务
程序员文章站
2024-03-03 19:12:46
...
在做开发的时候,如果有缓存的需求,可能就要给后台增加一块Redis块,核心包使用到开源的
github.com/garyburd/redigo
该包提供了连接redis服务,以及封装了redis各种命令函数
1.首先,先给电脑安装redis服务:https://godoc.org/github.com/garyburd/redigo/redis#pkg-variables
2.安装完成后,打开cmd,执行redis-server.exe redis.windows.conf
如果遇到,不存在该命令,则需要在环境变量中path,把redis的路径,即redis-server.exe这个东西所在的目录放进path里
3.执行完毕后可以看到下图,代表服务启动了
4.编写go文件进行访问和操作
main.go
package main
import (
"fmt"
"github.com/garyburd/redigo/redis"
"time"
"encoding/json"
)
func main() {
//1.连接redis
c, err := redis.Dial("tcp", "127.0.0.1:6379")
if err != nil {
fmt.Println("1.连接redis失败", err)
return
}
fmt.Println("1.连接成功",c)
defer c.Close()
//2.数据读写 : SET命令和GET命令
// 2.1 创建key=user_name,value="ft"的redis数据对象,写入
_, err = c.Do("MSET", "user_name", "ft")
if err != nil {
fmt.Println("数据设置失败:", err)
}
username, err := redis.String(c.Do("GET", "user_name"))
if err != nil {
fmt.Println("数据获取失败:", err)
} else {
fmt.Println("2.1.获取user_name",username)
}
// 2.2写入一段时限为5秒过期的内容: EX命令
_, err = c.Do("SET", "user_name2", "ft2","EX", "5")
if err != nil {
fmt.Println("数据设置失败:", err)
}
//未过期
username2, err := redis.String(c.Do("GET", "user_name2"))
if err != nil {
fmt.Println("数据获取失败:", err)
} else {
fmt.Printf("2.2直接获取未过期的 user_name2: %v \n", username2)
}
//延迟8秒,过期
time.Sleep(8 * time.Second)
username2, err = redis.String(c.Do("GET", "user_name2"))
if err != nil {
fmt.Println("2.2过期后数据获取失败:", err)
} else {
fmt.Printf("2.2延迟后获取不到过期的 user_name2: %v \n", username2)
}
//2.3 批量写入和批量写出:MSET,MGET命令
_, err = c.Do("MSET", "user_name", "ft","class_name","UD01")
if err != nil {
fmt.Println("批量数据设置失败:", err)
}
results, err := redis.Strings(c.Do("MGET", "user_name","class_name"))
if err != nil {
fmt.Println("数据获取失败:", err)
} else {
fmt.Println("2.3批量获取成功",results)
}
//2.4 判断是否存在某键值对
If_Exit, err := redis.Bool(c.Do("EXISTS", "class_name"))
if err != nil {
fmt.Println("error:", err)
} else {
fmt.Printf("2.4 class_name是否存在: %v \n", If_Exit)
}
//3 删除键
affectCount,err:=redis.Int(c.Do("DEL","class_name"))
if err != nil {
fmt.Println("error:", err)
} else {
fmt.Printf("3.class_name已经删除,受影响行数: %v \n", affectCount)
}
//4 存取json对象 :SETNX 等价于SET if not exist
key := "jsonKey"
imap := map[string]string{"username": "666", "phonenumber": "888"}
value, _ := json.Marshal(imap)
_,err = c.Do("SETNX", key, value)
if err != nil {
fmt.Println(err)
}
var result map[string]string
buf, err := redis.Bytes(c.Do("GET", key))
if err != nil {
fmt.Println(err)
}
errShal := json.Unmarshal(buf, &result)
if errShal != nil {
fmt.Println(err)
}
fmt.Println("4.获取json对象成功:userName",result["username"])
fmt.Println(" phonenumber",result["phonenumber"])
//5.设置过期时间 : EXPIRE
_,err= c.Do("EXPIRE", key, 24*60*60)
if err != nil {
fmt.Println(err)
}
//6.管道 按照队列先进先出的原则进行send,receive操作
c.Send("SET", "userId", "DF123")
c.Send("GET", "userId")
c.Flush()
c.Receive() // reply from SET
valueGet, errr := c.Receive() // reply from GET
fmt.Println(redis.String(valueGet,errr))
}
补充一个连接池,以及使用连接池获取连接的方法:
func GetRedis(url string) *redis.Pool {
fmt.Println("get redis url",url)
return &redis.Pool{
MaxIdle: 200,
//MaxActive: 0,
IdleTimeout: 180 * time.Second,
Dial: func() (redis.Conn, error) {
c, err := redis.DialURL(url)
if err != nil {
fmt.Println(err)
return nil, err
}
return c, err
},
TestOnBorrow: func(c redis.Conn, t time.Time) error {
_, err := c.Do("PING")
return err
},
}
}
//如何使用这个redisPool
func TestPool(t *testing.T){
Pool =GetRedis("redis://localhost:6379")
con := pool.Get()
defer con.Close()
fmt.Println("1.连接成功")
_, err = con.Do("SET","key", "value")
...
}
结果:
1.连接成功 &{{0 0} 0 <nil> 0xc042064030 0 0xc0420362a0 0 0xc042040280 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]}
2.1.获取user_name ft
2.2直接获取未过期的 user_name2: ft2
2.2过期后数据获取失败: redigo: nil returned
2.3批量获取成功 [ft UD01]
2.4 class_name是否存在: true
3.class_name已经删除,受影响行数: 1
4.获取json对象成功:userName 666
phonenumber 888
bar <nil>
推荐阅读
-
Golang 如何使用Redis服务
-
Redis系列三 - Spring boot如何使用redis做缓存及缓存注解的用法总结
-
如何使用Spring RestTemplate访问restful服务
-
如何使用redis实现分布式锁 博客分类: spring MVC分布式锁 分布式锁redis
-
Java使用Jedis操作Redis服务器的实例代码
-
如何在 Java 中实现一个 redis 缓存服务
-
如何在 Java 中利用 redis 实现 LBS 服务
-
ASP.NETWeb服务器验证控件如何使用
-
如何使用Spring+redis实现对session的分布式管理
-
如何使用redis 做队列操作 ?redis操作实例代码总结