概述
如果您没有Golang的基础,应该学习如下前置课程。
- Golang零基础入门
- Golang面向对象编程
- Go Web 基础
- Go语言开发REST API接口_20240728
- Go语言操作MySQL开发用户管理系统API教程_20240729
- Redis零基础快速入门_20231227
基础不好的同学每节课的代码最好配合视频进行阅读和学习,如果基础比较扎实,则阅读本教程巩固一下相关知识点即可,遇到不会的知识点再看视频。
视频课程
最近发现越来越多的公司在用Golang了,所以精心整理了一套视频教程给大家,这个是其中的第6部,后续还会有很多。
视频已经录制完成,完整目录截图如下:
本套课程的特色是每节课都是一个核心知识点,每个视频控制在十分钟左右,精简不废话,拒绝浪费大家的时间。
课程目录
- 01 概述
- 02 建立Redis连接对象
- 03 edis的打开和关闭方法
- 04 通过Do执行get和set命令
- 05 通过String自动转换字符串
- 06 通过Do实现mset和mget的操作
- 07 通过Do实现hset和hget的操作
- 08 通过Do实现lpush和lpop以及llen的操作
- 09 edis的连接池介绍
- 10 edis连接池的创建和使用
- 11 edis的管道操作
- 12 edis的事务操作
- 13 实现redigo的本地化
- 14 对zdpgo_redis的包结构进行调整
- 15 发布zdpgo_redisv1.1.0版本
- 16 新增用户
- 17 修改用户
- 18 删除用户
- 19 查询所有用户
- 20 实现查询所有用户的接口并进行测试
- 21 实现新增用户的接口并进行测试
- 22 解决ID唯一性的问题
- 23 实现修改用户的接口并进行测试
- 24 实现删除用户的接口并进行测试
- 25 实现根据ID查询用户的接口并进行测试
- 26 总结
完整代码
01 概述
02 建立Redis连接对象
03 edis的打开和关闭方法
package main
import (
"fmt"
"github.com/gomodule/redigo/redis"
)
var (
r redis.Conn
err error
)
func InitRedis() {
r, err = redis.Dial("tcp", "127.0.0.1:6379")
if err != nil {
fmt.Println(err)
return
}
}
func CloseRedis() {
r.Close()
}
func main() {
InitRedis()
defer CloseRedis()
fmt.Println("主程序的操作。。。")
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
04 通过Do执行get和set命令
package main
import (
"fmt"
"github.com/gomodule/redigo/redis"
)
var (
r redis.Conn
err error
)
func InitRedis() {
r, err = redis.Dial("tcp", "127.0.0.1:6379")
if err != nil {
fmt.Println(err)
return
}
}
func CloseRedis() {
r.Close()
}
func main() {
InitRedis()
defer CloseRedis()
// set 操作
_, err = r.Do("SET", "name", "张三")
if err != nil {
fmt.Println(err)
return
}
// get 操作
var reply interface{}
reply, err = r.Do("GET", "name")
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(reply.([]byte)))
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
05 通过String自动转换字符串
package main
import (
"fmt"
"github.com/gomodule/redigo/redis"
)
var (
r redis.Conn
err error
)
func InitRedis() {
r, err = redis.Dial("tcp", "127.0.0.1:6379")
if err != nil {
fmt.Println(err)
return
}
}
func CloseRedis() {
r.Close()
}
func main() {
InitRedis()
defer CloseRedis()
// set 操作
_, err = r.Do("SET", "name", "张三")
if err != nil {
fmt.Println(err)
return
}
// get 操作
var reply string
reply, err = redis.String(r.Do("GET", "name"))
if err != nil {
fmt.Println(err)
return
}
fmt.Println(reply)
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
06 通过Do实现mset和mget的操作
package main
import (
"fmt"
"github.com/gomodule/redigo/redis"
)
var (
r redis.Conn
err error
)
func InitRedis() {
r, err = redis.Dial("tcp", "127.0.0.1:6379")
if err != nil {
fmt.Println(err)
return
}
}
func CloseRedis() {
r.Close()
}
func main() {
InitRedis()
defer CloseRedis()
// set 操作
// 也一定要注意,是:key1,value1,key2,value2... 的格式
_, err = r.Do("MSET", "name", "张三", "age", 22, "gender", "男")
if err != nil {
fmt.Println(err)
return
}
// get 操作
// 这个传递的是想要哪些key
var reply []string
reply, err = redis.Strings(r.Do("MGET", "name", "age", "gender"))
if err != nil {
fmt.Println(err)
return
}
fmt.Println(reply)
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
07 通过Do实现hset和hget的操作
package main
import (
"fmt"
"github.com/gomodule/redigo/redis"
)
var (
r redis.Conn
err error
)
func InitRedis() {
r, err = redis.Dial("tcp", "127.0.0.1:6379")
if err != nil {
fmt.Println(err)
return
}
}
func CloseRedis() {
r.Close()
}
func main() {
InitRedis()
defer CloseRedis()
_, err = r.Do("HSET", "user", "name", "张三")
if err != nil {
fmt.Println(err)
return
}
var reply string
reply, err = redis.String(r.Do("HGET", "user", "name"))
if err != nil {
fmt.Println(err)
return
}
fmt.Println(reply)
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
08 通过Do实现lpush和lpop以及llen的操作
package main
import (
"fmt"
"github.com/gomodule/redigo/redis"
)
var (
r redis.Conn
err error
)
func InitRedis() {
r, err = redis.Dial("tcp", "127.0.0.1:6379")
if err != nil {
fmt.Println(err)
return
}
}
func CloseRedis() {
r.Close()
}
func main() {
InitRedis()
defer CloseRedis()
_, err = r.Do("LPUSH", "arr", "张三", "李四", "王五")
if err != nil {
fmt.Println(err)
return
}
var reply string
reply, err = redis.String(r.Do("LPOP", "arr"))
if err != nil {
fmt.Println(err)
return
}
fmt.Println(reply)
var length int
length, err = redis.Int(r.Do("LLEN", "arr"))
if err != nil {
fmt.Println(err)
return
}
fmt.Println(length)
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
09 Redis的连接池介绍
10 Redis连接池的创建和使用
package main
import (
"fmt"
"github.com/gomodule/redigo/redis"
)
var (
pool *redis.Pool
err error
)
func InitRedis() {
pool = &redis.Pool{
MaxIdle: 16,
MaxActive: 1024,
IdleTimeout: 300,
Dial: func() (redis.Conn, error) {
return redis.Dial("tcp", "127.0.0.1:6379")
},
}
}
func main() {
InitRedis()
r := pool.Get()
defer r.Close()
_, err = r.Do("LPUSH", "arr", "张三", "李四", "王五")
if err != nil {
fmt.Println(err)
return
}
var reply string
reply, err = redis.String(r.Do("LPOP", "arr"))
if err != nil {
fmt.Println(err)
return
}
fmt.Println(reply)
var length int
length, err = redis.Int(r.Do("LLEN", "arr"))
if err != nil {
fmt.Println(err)
return
}
fmt.Println(length)
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
11 Redis的管道操作
package main
import (
"fmt"
"github.com/gomodule/redigo/redis"
)
var (
pool *redis.Pool
err error
)
func InitRedis() {
pool = &redis.Pool{
MaxIdle: 16,
MaxActive: 1024,
IdleTimeout: 300,
Dial: func() (redis.Conn, error) {
return redis.Dial("tcp", "127.0.0.1:6379")
},
}
}
func main() {
InitRedis()
r := pool.Get()
defer r.Close()
// 写入缓冲
r.Send("SET", "name1", "张三")
r.Send("SET", "name2", "李四")
// 清空缓冲,写入服务端(Redis)
r.Flush()
// 读取:先进先出
receive, err := r.Receive()
fmt.Printf("receive:%#v, err:%v\n", receive, err)
receive, err = r.Receive()
fmt.Printf("receive:%#v, err:%v\n", receive, err)
// 因为没有数据了,所以会一直处于等待状态
receive, err = r.Receive()
fmt.Printf("receive:%#v, err:%v\n", receive, err)
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
12 Redis的事务操作
package main
import (
"fmt"
"github.com/gomodule/redigo/redis"
)
var (
pool *redis.Pool
err error
)
func InitRedis() {
pool = &redis.Pool{
MaxIdle: 16,
MaxActive: 1024,
IdleTimeout: 300,
Dial: func() (redis.Conn, error) {
return redis.Dial("tcp", "127.0.0.1:6379")
},
}
}
func main() {
InitRedis()
r := pool.Get()
defer r.Close()
r.Send("MULTI") // 开启事务
// 事务过程中的一些业务操作
r.Send("INCR", "num1")
r.Send("INCR", "num2")
reply, err := r.Do("EXEC") // 执行事务
fmt.Printf("%#v err:%v\n", reply, err)
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
13 实现redigo的本地化
14 对zdpgo_redis的包结构进行调整
15 发布zdpgo_redisv1.1.0版本
16 新增用户
package main
import (
"encoding/json"
"fmt"
"github.com/zhangdapeng520/zdpgo_redis"
)
var (
pool *zdpgo_redis.Pool
err error
)
func InitRedis() {
pool = &zdpgo_redis.Pool{
MaxIdle: 16,
MaxActive: 1024,
IdleTimeout: 300,
Dial: func() (zdpgo_redis.Conn, error) {
return zdpgo_redis.Dial("tcp", "127.0.0.1:6379")
},
}
}
type User struct {
Id int `json:"id"`
Name string `json:"name"`
Age int `json:"age"`
}
func main() {
InitRedis()
r := pool.Get()
defer r.Close()
// string hash list
// string hash users:{1:{id:1,xxx},2:xxx}
// string 代码会更简单
zs := User{2, "李四", 23}
key := fmt.Sprintf("user/%d", zs.Id)
zsBytes, _ := json.Marshal(zs)
value := string(zsBytes)
r.Do("SET", key, value)
value2, _ := zdpgo_redis.String(r.Do("GET", key))
fmt.Println(value2)
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
17 修改用户
package main
import (
"encoding/json"
"fmt"
"github.com/zhangdapeng520/zdpgo_redis"
)
var (
pool *zdpgo_redis.Pool
err error
)
func InitRedis() {
pool = &zdpgo_redis.Pool{
MaxIdle: 16,
MaxActive: 1024,
IdleTimeout: 300,
Dial: func() (zdpgo_redis.Conn, error) {
return zdpgo_redis.Dial("tcp", "127.0.0.1:6379")
},
}
}
type User struct {
Id int `json:"id"`
Name string `json:"name"`
Age int `json:"age"`
}
func main() {
InitRedis()
r := pool.Get()
defer r.Close()
id := 1
name := "李四"
// 查询
key := fmt.Sprintf("user/%d", id)
value2, _ := zdpgo_redis.String(r.Do("GET", key))
fmt.Println(value2)
// 解析
var user User
json.Unmarshal([]byte(value2), &user)
fmt.Println(user)
// 修改
user.Name = name
// 重新存储
jsonBytes, _ := json.Marshal(user)
fmt.Println(string(jsonBytes))
r.Do("SET", key, string(jsonBytes))
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
- 53.
- 54.
- 55.
- 56.
- 57.
- 58.
18 删除用户
package main
import (
"fmt"
"github.com/zhangdapeng520/zdpgo_redis"
)
var (
pool *zdpgo_redis.Pool
err error
)
func InitRedis() {
pool = &zdpgo_redis.Pool{
MaxIdle: 16,
MaxActive: 1024,
IdleTimeout: 300,
Dial: func() (zdpgo_redis.Conn, error) {
return zdpgo_redis.Dial("tcp", "127.0.0.1:6379")
},
}
}
type User struct {
Id int `json:"id"`
Name string `json:"name"`
Age int `json:"age"`
}
func main() {
InitRedis()
r := pool.Get()
defer r.Close()
id := 1
// 查询
key := fmt.Sprintf("user/%d", id)
value2, _ := zdpgo_redis.String(r.Do("GET", key))
fmt.Println(value2)
// 删除
r.Do("DEL", key)
// 再查询
value2, _ = zdpgo_redis.String(r.Do("GET", key))
fmt.Println(value2)
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
19 查询所有用户
package main
import (
"encoding/json"
"fmt"
"github.com/zhangdapeng520/zdpgo_redis"
)
var (
pool *zdpgo_redis.Pool
err error
)
func InitRedis() {
pool = &zdpgo_redis.Pool{
MaxIdle: 16,
MaxActive: 1024,
IdleTimeout: 300,
Dial: func() (zdpgo_redis.Conn, error) {
return zdpgo_redis.Dial("tcp", "127.0.0.1:6379")
},
}
}
type User struct {
Id int `json:"id"`
Name string `json:"name"`
Age int `json:"age"`
}
func main() {
InitRedis()
r := pool.Get()
defer r.Close()
// 获取所有的key
userKeys, _ := zdpgo_redis.Strings(r.Do("KEYS", "user/*"))
fmt.Println(userKeys)
// 查询
var users []User
for _, key := range userKeys {
var user User
userStr, _ := zdpgo_redis.String(r.Do("GET", key))
json.Unmarshal([]byte(userStr), &user)
users = append(users, user)
}
fmt.Println(users)
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
20 实现查询所有用户的接口并进行测试
package main
import (
"encoding/json"
"github.com/zhangdapeng520/zdpgo_httprouter"
"github.com/zhangdapeng520/zdpgo_redis"
"net/http"
"time"
)
type User struct {
Id int `json:"id"`
Name string `json:"name"`
Age int `json:"age"`
}
var (
pool *zdpgo_redis.Pool
)
func InitRedis() {
pool = &zdpgo_redis.Pool{
MaxIdle: 16,
MaxActive: 1024,
IdleTimeout: 300,
Dial: func() (zdpgo_redis.Conn, error) {
return zdpgo_redis.Dial("tcp", "127.0.0.1:6379")
},
}
}
func RouterGetUser(w http.ResponseWriter, r *http.Request, _ zdpgo_httprouter.Params) {
rdb := pool.Get()
defer rdb.Close()
// 获取所有的key
userKeys, _ := zdpgo_redis.Strings(rdb.Do("KEYS", "user/*"))
// 查询
var users []User
for _, key := range userKeys {
var user User
userStr, _ := zdpgo_redis.String(rdb.Do("GET", key))
json.Unmarshal([]byte(userStr), &user)
users = append(users, user)
}
zdpgo_httprouter.ResponseSuccess(w, users)
}
func main() {
InitRedis()
router := zdpgo_httprouter.New()
router.GET("/user", RouterGetUser)
server := &http.Server{
Addr: "0.0.0.0:8888",
Handler: router,
ReadTimeout: 5 * time.Second,
WriteTimeout: 5 * time.Second,
}
server.ListenAndServe()
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
- 53.
- 54.
- 55.
- 56.
- 57.
- 58.
- 59.
- 60.
- 61.
- 62.
- 63.
- 64.
- 65.
package main
import (
"fmt"
"io"
"net/http"
)
func main() {
resp, err := http.Get("http://localhost:8888/user")
if err != nil {
fmt.Println(err)
return
}
body := resp.Body
bodyBytes, err := io.ReadAll(body)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(bodyBytes))
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
21 实现新增用户的接口并进行测试
package main
import (
"encoding/json"
"fmt"
"github.com/zhangdapeng520/zdpgo_httprouter"
"github.com/zhangdapeng520/zdpgo_redis"
"net/http"
"time"
)
type User struct {
Id int `json:"id"`
Name string `json:"name"`
Age int `json:"age"`
}
var (
pool *zdpgo_redis.Pool
)
func InitRedis() {
pool = &zdpgo_redis.Pool{
MaxIdle: 16,
MaxActive: 1024,
IdleTimeout: 300,
Dial: func() (zdpgo_redis.Conn, error) {
return zdpgo_redis.Dial("tcp", "127.0.0.1:6379")
},
}
}
func RouterGetUser(w http.ResponseWriter, r *http.Request, _ zdpgo_httprouter.Params) {
rdb := pool.Get()
defer rdb.Close()
// 获取所有的key
userKeys, _ := zdpgo_redis.Strings(rdb.Do("KEYS", "user/*"))
// 查询
var users []User
for _, key := range userKeys {
var user User
userStr, _ := zdpgo_redis.String(rdb.Do("GET", key))
json.Unmarshal([]byte(userStr), &user)
users = append(users, user)
}
zdpgo_httprouter.ResponseSuccess(w, users)
}
func RouterAddUser(w http.ResponseWriter, r *http.Request, _ zdpgo_httprouter.Params) {
rdb := pool.Get()
defer rdb.Close()
var user User
zdpgo_httprouter.GetJson(r, &user)
id := time.Now().Nanosecond()
user.Id = id
// 新增
key := fmt.Sprintf("user/%d", user.Id)
zsBytes, _ := json.Marshal(user)
value := string(zsBytes)
rdb.Do("SET", key, value)
// 返回
zdpgo_httprouter.ResponseSuccess(w, user)
}
func main() {
InitRedis()
router := zdpgo_httprouter.New()
router.POST("/user", RouterAddUser)
router.GET("/user", RouterGetUser)
server := &http.Server{
Addr: "0.0.0.0:8888",
Handler: router,
ReadTimeout: 5 * time.Second,
WriteTimeout: 5 * time.Second,
}
server.ListenAndServe()
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
- 53.
- 54.
- 55.
- 56.
- 57.
- 58.
- 59.
- 60.
- 61.
- 62.
- 63.
- 64.
- 65.
- 66.
- 67.
- 68.
- 69.
- 70.
- 71.
- 72.
- 73.
- 74.
- 75.
- 76.
- 77.
- 78.
- 79.
- 80.
- 81.
- 82.
- 83.
- 84.
- 85.
- 86.
- 87.
package main
import (
"fmt"
"github.com/zhangdapeng520/zdpgo_httprouter"
"io"
)
func main() {
targetUrl := "http://localhost:8888/user"
data := map[string]interface{}{
"name": "王五",
"age": 35,
}
resp, err := zdpgo_httprouter.SendJson("POST", targetUrl, data)
if err != nil {
fmt.Println(err)
return
}
body := resp.Body
bodyBytes, err := io.ReadAll(body)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(bodyBytes))
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
22 解决ID唯一性的问题
package main
import (
"encoding/json"
"fmt"
"github.com/zhangdapeng520/zdpgo_httprouter"
"github.com/zhangdapeng520/zdpgo_redis"
"net/http"
"time"
)
type User struct {
Id int64 `json:"id"`
Name string `json:"name"`
Age int `json:"age"`
}
var (
pool *zdpgo_redis.Pool
)
func InitRedis() {
pool = &zdpgo_redis.Pool{
MaxIdle: 16,
MaxActive: 1024,
IdleTimeout: 300,
Dial: func() (zdpgo_redis.Conn, error) {
return zdpgo_redis.Dial("tcp", "127.0.0.1:6379")
},
}
}
func RouterGetUser(w http.ResponseWriter, r *http.Request, _ zdpgo_httprouter.Params) {
rdb := pool.Get()
defer rdb.Close()
// 获取所有的key
userKeys, _ := zdpgo_redis.Strings(rdb.Do("KEYS", "user/*"))
// 查询
var users []User
for _, key := range userKeys {
var user User
userStr, _ := zdpgo_redis.String(rdb.Do("GET", key))
json.Unmarshal([]byte(userStr), &user)
users = append(users, user)
}
zdpgo_httprouter.ResponseSuccess(w, users)
}
func RouterAddUser(w http.ResponseWriter, r *http.Request, _ zdpgo_httprouter.Params) {
rdb := pool.Get()
defer rdb.Close()
var user User
zdpgo_httprouter.GetJson(r, &user)
id := time.Now().UnixNano()
user.Id = id
// 新增
key := fmt.Sprintf("user/%d", user.Id)
zsBytes, _ := json.Marshal(user)
value := string(zsBytes)
rdb.Do("SET", key, value)
// 返回
zdpgo_httprouter.ResponseSuccess(w, user)
}
func main() {
InitRedis()
router := zdpgo_httprouter.New()
router.POST("/user", RouterAddUser)
router.GET("/user", RouterGetUser)
server := &http.Server{
Addr: "0.0.0.0:8888",
Handler: router,
ReadTimeout: 5 * time.Second,
WriteTimeout: 5 * time.Second,
}
server.ListenAndServe()
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
- 53.
- 54.
- 55.
- 56.
- 57.
- 58.
- 59.
- 60.
- 61.
- 62.
- 63.
- 64.
- 65.
- 66.
- 67.
- 68.
- 69.
- 70.
- 71.
- 72.
- 73.
- 74.
- 75.
- 76.
- 77.
- 78.
- 79.
- 80.
- 81.
- 82.
- 83.
- 84.
- 85.
- 86.
- 87.
package main
import (
"fmt"
"github.com/zhangdapeng520/zdpgo_httprouter"
"io"
)
func main() {
targetUrl := "http://localhost:8888/user"
data := map[string]interface{}{
"name": "王五",
"age": 35,
}
resp, err := zdpgo_httprouter.SendJson("POST", targetUrl, data)
if err != nil {
fmt.Println(err)
return
}
body := resp.Body
bodyBytes, err := io.ReadAll(body)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(bodyBytes))
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
23 实现修改用户的接口并进行测试
package main
import (
"encoding/json"
"fmt"
"github.com/zhangdapeng520/zdpgo_httprouter"
"github.com/zhangdapeng520/zdpgo_redis"
"net/http"
"time"
)
type User struct {
Id int64 `json:"id"`
Name string `json:"name"`
Age int `json:"age"`
}
var (
pool *zdpgo_redis.Pool
)
func InitRedis() {
pool = &zdpgo_redis.Pool{
MaxIdle: 16,
MaxActive: 1024,
IdleTimeout: 300,
Dial: func() (zdpgo_redis.Conn, error) {
return zdpgo_redis.Dial("tcp", "127.0.0.1:6379")
},
}
}
func RouterGetUser(w http.ResponseWriter, r *http.Request, _ zdpgo_httprouter.Params) {
rdb := pool.Get()
defer rdb.Close()
// 获取所有的key
userKeys, _ := zdpgo_redis.Strings(rdb.Do("KEYS", "user/*"))
// 查询
var users []User
for _, key := range userKeys {
var user User
userStr, _ := zdpgo_redis.String(rdb.Do("GET", key))
json.Unmarshal([]byte(userStr), &user)
users = append(users, user)
}
zdpgo_httprouter.ResponseSuccess(w, users)
}
func RouterAddUser(w http.ResponseWriter, r *http.Request, _ zdpgo_httprouter.Params) {
rdb := pool.Get()
defer rdb.Close()
var user User
zdpgo_httprouter.GetJson(r, &user)
id := time.Now().UnixNano()
user.Id = id
// 新增
key := fmt.Sprintf("user/%d", user.Id)
zsBytes, _ := json.Marshal(user)
value := string(zsBytes)
rdb.Do("SET", key, value)
// 返回
zdpgo_httprouter.ResponseSuccess(w, user)
}
func RouterUpdateUser(w http.ResponseWriter, r *http.Request, ps zdpgo_httprouter.Params) {
rdb := pool.Get()
defer rdb.Close()
var user User
var idStr = ps.ByName("id")
zdpgo_httprouter.GetJson(r, &user)
// 查询
key := fmt.Sprintf("user/%s", idStr)
userJson, _ := zdpgo_redis.String(rdb.Do("GET", key))
// 解析
var dbUser User
json.Unmarshal([]byte(userJson), &dbUser)
// 修改
dbUser.Name = user.Name
dbUser.Age = user.Age
// 重新存储
jsonBytes, _ := json.Marshal(dbUser)
rdb.Do("SET", key, string(jsonBytes))
// 返回
zdpgo_httprouter.ResponseSuccess(w, dbUser)
}
func main() {
InitRedis()
router := zdpgo_httprouter.New()
router.POST("/user", RouterAddUser)
router.GET("/user", RouterGetUser)
router.PUT("/user/:id", RouterUpdateUser)
server := &http.Server{
Addr: "0.0.0.0:8888",
Handler: router,
ReadTimeout: 5 * time.Second,
WriteTimeout: 5 * time.Second,
}
server.ListenAndServe()
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
- 53.
- 54.
- 55.
- 56.
- 57.
- 58.
- 59.
- 60.
- 61.
- 62.
- 63.
- 64.
- 65.
- 66.
- 67.
- 68.
- 69.
- 70.
- 71.
- 72.
- 73.
- 74.
- 75.
- 76.
- 77.
- 78.
- 79.
- 80.
- 81.
- 82.
- 83.
- 84.
- 85.
- 86.
- 87.
- 88.
- 89.
- 90.
- 91.
- 92.
- 93.
- 94.
- 95.
- 96.
- 97.
- 98.
- 99.
- 100.
- 101.
- 102.
- 103.
- 104.
- 105.
- 106.
- 107.
- 108.
- 109.
- 110.
- 111.
- 112.
- 113.
- 114.
- 115.
- 116.
package main
import (
"fmt"
"github.com/zhangdapeng520/zdpgo_httprouter"
"io"
)
func main() {
targetUrl := "http://localhost:8888/user/108534300"
data := map[string]interface{}{
"name": "王六",
"age": 35,
}
resp, err := zdpgo_httprouter.SendJson("PUT", targetUrl, data)
if err != nil {
fmt.Println(err)
return
}
body := resp.Body
bodyBytes, err := io.ReadAll(body)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(bodyBytes))
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
24 实现删除用户的接口并进行测试
package main
import (
"encoding/json"
"fmt"
"github.com/zhangdapeng520/zdpgo_httprouter"
"github.com/zhangdapeng520/zdpgo_redis"
"net/http"
"time"
)
type User struct {
Id int64 `json:"id"`
Name string `json:"name"`
Age int `json:"age"`
}
var (
pool *zdpgo_redis.Pool
)
func InitRedis() {
pool = &zdpgo_redis.Pool{
MaxIdle: 16,
MaxActive: 1024,
IdleTimeout: 300,
Dial: func() (zdpgo_redis.Conn, error) {
return zdpgo_redis.Dial("tcp", "127.0.0.1:6379")
},
}
}
func RouterGetUser(w http.ResponseWriter, r *http.Request, _ zdpgo_httprouter.Params) {
rdb := pool.Get()
defer rdb.Close()
// 获取所有的key
userKeys, _ := zdpgo_redis.Strings(rdb.Do("KEYS", "user/*"))
// 查询
var users []User
for _, key := range userKeys {
var user User
userStr, _ := zdpgo_redis.String(rdb.Do("GET", key))
json.Unmarshal([]byte(userStr), &user)
users = append(users, user)
}
zdpgo_httprouter.ResponseSuccess(w, users)
}
func RouterAddUser(w http.ResponseWriter, r *http.Request, _ zdpgo_httprouter.Params) {
rdb := pool.Get()
defer rdb.Close()
var user User
zdpgo_httprouter.GetJson(r, &user)
id := time.Now().UnixNano()
user.Id = id
// 新增
key := fmt.Sprintf("user/%d", user.Id)
zsBytes, _ := json.Marshal(user)
value := string(zsBytes)
rdb.Do("SET", key, value)
// 返回
zdpgo_httprouter.ResponseSuccess(w, user)
}
func RouterUpdateUser(w http.ResponseWriter, r *http.Request, ps zdpgo_httprouter.Params) {
rdb := pool.Get()
defer rdb.Close()
var user User
var idStr = ps.ByName("id")
zdpgo_httprouter.GetJson(r, &user)
// 查询
key := fmt.Sprintf("user/%s", idStr)
userJson, _ := zdpgo_redis.String(rdb.Do("GET", key))
// 解析
var dbUser User
json.Unmarshal([]byte(userJson), &dbUser)
// 修改
dbUser.Name = user.Name
dbUser.Age = user.Age
// 重新存储
jsonBytes, _ := json.Marshal(dbUser)
rdb.Do("SET", key, string(jsonBytes))
// 返回
zdpgo_httprouter.ResponseSuccess(w, dbUser)
}
func RouterDeleteUser(w http.ResponseWriter, r *http.Request, ps zdpgo_httprouter.Params) {
rdb := pool.Get()
defer rdb.Close()
var idStr = ps.ByName("id")
// 查询
key := fmt.Sprintf("user/%s", idStr)
rdb.Do("DEL", key)
// 返回
zdpgo_httprouter.ResponseSuccess(w, nil)
}
func main() {
InitRedis()
router := zdpgo_httprouter.New()
router.POST("/user", RouterAddUser)
router.GET("/user", RouterGetUser)
router.PUT("/user/:id", RouterUpdateUser)
router.DELETE("/user/:id", RouterDeleteUser)
server := &http.Server{
Addr: "0.0.0.0:8888",
Handler: router,
ReadTimeout: 5 * time.Second,
WriteTimeout: 5 * time.Second,
}
server.ListenAndServe()
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
- 53.
- 54.
- 55.
- 56.
- 57.
- 58.
- 59.
- 60.
- 61.
- 62.
- 63.
- 64.
- 65.
- 66.
- 67.
- 68.
- 69.
- 70.
- 71.
- 72.
- 73.
- 74.
- 75.
- 76.
- 77.
- 78.
- 79.
- 80.
- 81.
- 82.
- 83.
- 84.
- 85.
- 86.
- 87.
- 88.
- 89.
- 90.
- 91.
- 92.
- 93.
- 94.
- 95.
- 96.
- 97.
- 98.
- 99.
- 100.
- 101.
- 102.
- 103.
- 104.
- 105.
- 106.
- 107.
- 108.
- 109.
- 110.
- 111.
- 112.
- 113.
- 114.
- 115.
- 116.
- 117.
- 118.
- 119.
- 120.
- 121.
- 122.
- 123.
- 124.
- 125.
- 126.
- 127.
- 128.
- 129.
- 130.
- 131.
package main
import (
"fmt"
"github.com/zhangdapeng520/zdpgo_httprouter"
"io"
)
func main() {
targetUrl := "http://localhost:8888/user/53"
data := map[string]interface{}{}
resp, err := zdpgo_httprouter.SendJson("DELETE", targetUrl, data)
if err != nil {
fmt.Println(err)
return
}
body := resp.Body
bodyBytes, err := io.ReadAll(body)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(bodyBytes))
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
25 实现根据ID查询用户的接口并进行测试
package main
import (
"encoding/json"
"fmt"
"github.com/zhangdapeng520/zdpgo_httprouter"
"github.com/zhangdapeng520/zdpgo_redis"
"net/http"
"time"
)
type User struct {
Id int64 `json:"id"`
Name string `json:"name"`
Age int `json:"age"`
}
var (
pool *zdpgo_redis.Pool
)
func InitRedis() {
pool = &zdpgo_redis.Pool{
MaxIdle: 16,
MaxActive: 1024,
IdleTimeout: 300,
Dial: func() (zdpgo_redis.Conn, error) {
return zdpgo_redis.Dial("tcp", "127.0.0.1:6379")
},
}
}
func RouterGetUser(w http.ResponseWriter, r *http.Request, _ zdpgo_httprouter.Params) {
rdb := pool.Get()
defer rdb.Close()
// 获取所有的key
userKeys, _ := zdpgo_redis.Strings(rdb.Do("KEYS", "user/*"))
// 查询
var users []User
for _, key := range userKeys {
var user User
userStr, _ := zdpgo_redis.String(rdb.Do("GET", key))
json.Unmarshal([]byte(userStr), &user)
users = append(users, user)
}
zdpgo_httprouter.ResponseSuccess(w, users)
}
func RouterAddUser(w http.ResponseWriter, r *http.Request, _ zdpgo_httprouter.Params) {
rdb := pool.Get()
defer rdb.Close()
var user User
zdpgo_httprouter.GetJson(r, &user)
id := time.Now().UnixNano()
user.Id = id
// 新增
key := fmt.Sprintf("user/%d", user.Id)
zsBytes, _ := json.Marshal(user)
value := string(zsBytes)
rdb.Do("SET", key, value)
// 返回
zdpgo_httprouter.ResponseSuccess(w, user)
}
func RouterUpdateUser(w http.ResponseWriter, r *http.Request, ps zdpgo_httprouter.Params) {
rdb := pool.Get()
defer rdb.Close()
var user User
var idStr = ps.ByName("id")
zdpgo_httprouter.GetJson(r, &user)
// 查询
key := fmt.Sprintf("user/%s", idStr)
userJson, _ := zdpgo_redis.String(rdb.Do("GET", key))
// 解析
var dbUser User
json.Unmarshal([]byte(userJson), &dbUser)
// 修改
dbUser.Name = user.Name
dbUser.Age = user.Age
// 重新存储
jsonBytes, _ := json.Marshal(dbUser)
rdb.Do("SET", key, string(jsonBytes))
// 返回
zdpgo_httprouter.ResponseSuccess(w, dbUser)
}
func RouterDeleteUser(w http.ResponseWriter, r *http.Request, ps zdpgo_httprouter.Params) {
rdb := pool.Get()
defer rdb.Close()
var idStr = ps.ByName("id")
// 查询
key := fmt.Sprintf("user/%s", idStr)
rdb.Do("DEL", key)
// 返回
zdpgo_httprouter.ResponseSuccess(w, nil)
}
func RouterGetUserId(w http.ResponseWriter, r *http.Request, ps zdpgo_httprouter.Params) {
rdb := pool.Get()
defer rdb.Close()
var idStr = ps.ByName("id")
// 查询
key := fmt.Sprintf("user/%s", idStr)
userJson, _ := zdpgo_redis.String(rdb.Do("GET", key))
var dbUser User
json.Unmarshal([]byte(userJson), &dbUser)
// 返回
zdpgo_httprouter.ResponseSuccess(w, dbUser)
}
func main() {
InitRedis()
router := zdpgo_httprouter.New()
router.POST("/user", RouterAddUser)
router.GET("/user", RouterGetUser)
router.PUT("/user/:id", RouterUpdateUser)
router.DELETE("/user/:id", RouterDeleteUser)
router.GET("/user/:id", RouterGetUserId)
server := &http.Server{
Addr: "0.0.0.0:8888",
Handler: router,
ReadTimeout: 5 * time.Second,
WriteTimeout: 5 * time.Second,
}
server.ListenAndServe()
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
- 53.
- 54.
- 55.
- 56.
- 57.
- 58.
- 59.
- 60.
- 61.
- 62.
- 63.
- 64.
- 65.
- 66.
- 67.
- 68.
- 69.
- 70.
- 71.
- 72.
- 73.
- 74.
- 75.
- 76.
- 77.
- 78.
- 79.
- 80.
- 81.
- 82.
- 83.
- 84.
- 85.
- 86.
- 87.
- 88.
- 89.
- 90.
- 91.
- 92.
- 93.
- 94.
- 95.
- 96.
- 97.
- 98.
- 99.
- 100.
- 101.
- 102.
- 103.
- 104.
- 105.
- 106.
- 107.
- 108.
- 109.
- 110.
- 111.
- 112.
- 113.
- 114.
- 115.
- 116.
- 117.
- 118.
- 119.
- 120.
- 121.
- 122.
- 123.
- 124.
- 125.
- 126.
- 127.
- 128.
- 129.
- 130.
- 131.
- 132.
- 133.
- 134.
- 135.
- 136.
- 137.
- 138.
- 139.
- 140.
- 141.
- 142.
- 143.
- 144.
- 145.
- 146.
- 147.
- 148.
- 149.
package main
import (
"fmt"
"io"
"net/http"
)
func main() {
resp, err := http.Get("http://localhost:8888/user/1")
if err != nil {
fmt.Println(err)
return
}
body := resp.Body
bodyBytes, err := io.ReadAll(body)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(bodyBytes))
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
总结
本套教程主要讲解Go语言操作Redis基础知识,然后还讲解了管道,连接池,事务等高级用户。借助用户管理这个业务为中心,详细讲解了如何使用Go语言加Redis实现用户的增删改查操作,之后有结合httprouter的用法,开发用户管理的增删改查API接口。
人生苦短,我用Python,我是您身边的Python私教~