Do方法

我们最常用的是Do方法,执行同步指令,通过向Redis Server发送对应的Redis API命令,来使用Redis Server的服务。Do方法最大的特点是内部自行从连接池中获取连接对象,使用完毕后自动丢回连接池中,开发者无需手动调用Close方法,方便使用。

基本使用

  1. package main
  2. import (
  3. "fmt"
  4. "github.com/gogf/gf/v2/frame/g"
  5. "github.com/gogf/gf/v2/os/gctx"
  6. )
  7. func main() {
  8. var (
  9. ctx = gctx.New()
  10. )
  11. v, _ := g.Redis().Do(ctx, "SET", "k", "v")
  12. fmt.Println(v.String())
  13. }

HSET/HGETALL操作

  1. package main
  2. import (
  3. "fmt"
  4. "github.com/gogf/gf/v2/container/gvar"
  5. "github.com/gogf/gf/v2/frame/g"
  6. "github.com/gogf/gf/v2/os/gctx"
  7. )
  8. func main() {
  9. var (
  10. err error
  11. result *gvar.Var
  12. key = "user"
  13. ctx = gctx.New()
  14. )
  15. _, err = g.Redis().Do(ctx, "HSET", key, "id", 10000)
  16. if err != nil {
  17. panic(err)
  18. }
  19. _, err = g.Redis().Do(ctx,"HSET", key, "name", "john")
  20. if err != nil {
  21. panic(err)
  22. }
  23. result, err = g.Redis().Do(ctx,"HGETALL", key)
  24. if err != nil {
  25. panic(err)
  26. }
  27. fmt.Println(result.Map())
  28. // May Output:
  29. // map[id:10000 name:john]
  30. }

HMSET/HMGET操作

我们可以通过map参数执行HMSET操作。

  1. package main
  2. import (
  3. "fmt"
  4. "github.com/gogf/gf/v2/frame/g"
  5. "github.com/gogf/gf/v2/os/gctx"
  6. "github.com/gogf/gf/v2/util/gutil"
  7. )
  8. func main() {
  9. var (
  10. ctx = gctx.New()
  11. key = "user_100"
  12. data = g.Map{
  13. "name": "gf",
  14. "sex": 0,
  15. "score": 100,
  16. }
  17. )
  18. _, err := g.Redis().Do(ctx, "HMSET", append(g.Slice{key}, gutil.MapToSlice(data)...)...)
  19. if err != nil {
  20. g.Log().Fatal(ctx, err)
  21. }
  22. v, err := g.Redis().Do(ctx, "HMGET", key, "name")
  23. if err != nil {
  24. g.Log().Fatal(ctx, err)
  25. }
  26. fmt.Println(v.Slice())
  27. // May Output:
  28. // [gf]
  29. }

我们可以通过 struct 参数执行HMSET操作。

  1. package main
  2. import (
  3. "fmt"
  4. "github.com/gogf/gf/v2/frame/g"
  5. "github.com/gogf/gf/v2/os/gctx"
  6. "github.com/gogf/gf/v2/util/gutil"
  7. )
  8. func main() {
  9. type User struct {
  10. Name string `json:"name"`
  11. Sex int `json:"sex"`
  12. Score int `json:"score"`
  13. }
  14. var (
  15. ctx = gctx.New()
  16. key = "user_100"
  17. data = &User{
  18. Name: "gf",
  19. Sex: 0,
  20. Score: 100,
  21. }
  22. )
  23. _, err := g.Redis().Do(ctx,"HMSET", append(g.Slice{key}, gutil.StructToSlice(data)...)...)
  24. if err != nil {
  25. g.Log().Fatal(ctx, err)
  26. }
  27. v, err := g.Redis().Do(ctx,"HMGET", key, "name")
  28. if err != nil {
  29. g.Log().Fatal(ctx, err)
  30. }
  31. fmt.Println(v.Slice())
  32. // May Output:
  33. // [gf]
  34. }

自动序列化/反序列化

当给定的参数为map, slice, struct时,gredis内部支持自动对其使用json序列化,并且读取数据时可使用gvar.Var的转换功能实现反序列化。

map存取

  1. package main
  2. import (
  3. "fmt"
  4. "github.com/gogf/gf/v2/container/gvar"
  5. "github.com/gogf/gf/v2/frame/g"
  6. "github.com/gogf/gf/v2/os/gctx"
  7. )
  8. func main() {
  9. var (
  10. ctx = gctx.New()
  11. err error
  12. result *gvar.Var
  13. key = "user"
  14. data = g.Map{
  15. "id": 10000,
  16. "name": "john",
  17. }
  18. )
  19. _, err = g.Redis().Do(ctx, "SET", key, data)
  20. if err != nil {
  21. panic(err)
  22. }
  23. result, err = g.Redis().Do(ctx,"GET", key)
  24. if err != nil {
  25. panic(err)
  26. }
  27. fmt.Println(result.Map())
  28. }

struct存取

  1. package main
  2. import (
  3. "fmt"
  4. "github.com/gogf/gf/v2/container/gvar"
  5. "github.com/gogf/gf/v2/frame/g"
  6. "github.com/gogf/gf/v2/os/gctx"
  7. )
  8. func main() {
  9. type User struct {
  10. Id int
  11. Name string
  12. }
  13. var (
  14. ctx = gctx.New()
  15. err error
  16. result *gvar.Var
  17. key = "user"
  18. user = g.Map{
  19. "id": 10000,
  20. "name": "john",
  21. }
  22. )
  23. _, err = g.Redis().Do(ctx, "SET", key, user)
  24. if err != nil {
  25. panic(err)
  26. }
  27. result, err = g.Redis().Do(ctx, "GET", key)
  28. if err != nil {
  29. panic(err)
  30. }
  31. var user2 *User
  32. if err = result.Struct(&user2); err != nil {
  33. panic(err)
  34. }
  35. fmt.Println(user2.Id, user2.Name)
  36. }