[go-redis] go操作redis数据库

铁佛  金牌会员 | 2022-8-30 03:21:55 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 753|帖子 753|积分 2259

先上命令速查网站,菜鸟yyds
https://www.runoob.com/redis/redis-strings.html
操作redis的包是go-redis/redis
官方文档 https://redis.uptrace.dev/guide/
github https://github.com/go-redis/redis
创建项目
创建test文件夹
创建 Redis_test.go 文件
直接上代码,代码解释全写在注释里
  1. package test
  2. import (
  3.         "context"
  4.         "encoding/json"
  5.         "fmt"
  6.         "github.com/go-redis/redis/v8"
  7.         "testing"
  8.         "time"
  9. )
  10. var ctx = context.Background()
  11. var rdb *redis.Client
  12. func init() {
  13.         rdb = redis.NewClient(&redis.Options{
  14.                 //        端口需要改,这里是docker的端口
  15.                 Addr:          "localhost:49153",
  16.                 Password: "redispw", // no password set
  17.                 DB:                  0,  // use default DB
  18.                 PoolSize:15,
  19.                 MinIdleConns: 10, //在启动阶段创建指定数量的Idle连接,并长期维持idle状态的连接数不少于指定数量;。
  20.                 //超时
  21.                 //DialTimeout:  5 * time.Second, //连接建立超时时间,默认5秒。
  22.                 //ReadTimeout:  3 * time.Second, //读超时,默认3秒, -1表示取消读超时
  23.                 //WriteTimeout: 3 * time.Second, //写超时,默认等于读超时
  24.                 //PoolTimeout:  4 * time.Second, //当所有连接都处在繁忙状态时,客户端等待可用连接的最大等待时长,默认为读超时+1秒。
  25.         })
  26. }
  27. //        基础使用
  28. func Test_Base(t *testing.T) {
  29.         //        添加key
  30.         //0表示没有过期时间
  31.         rdb.Set(ctx, "testKey", "xxx", 0)
  32.         //        获取值
  33.         val, err := rdb.Get(ctx, "testKey").Result()
  34.         if err != nil {
  35.                 fmt.Println("错误", err)
  36.         }
  37.         fmt.Println("值:", val)
  38.         //        设置key过期时间 成功true
  39.         rdb.Expire(ctx, "testKey", time.Second*60)
  40.         //        存在返回1
  41.         rdb.Exists(ctx, "testKey")
  42.         //        key不存在时设置值
  43.         rdb.SetNX(ctx, "unkey", "val", 0)
  44.         rdb.Set(ctx, "testKey2", "xxx", 0)
  45.         //        删除key 可删除多个
  46.         rdb.Del(ctx, "testKey2", "testKey")
  47. }
  48. //        字符串
  49. func Test_String(t *testing.T) {
  50.         //        设置值
  51.         rdb.Set(ctx, "strKey", 100, 0)
  52.         rdb.Set(ctx, "straey", 100, 0)
  53.         //        key自增1
  54.         rdb.Incr(ctx, "strKey")
  55.         //        增加 66
  56.         rdb.IncrBy(ctx, "straey", 66)
  57.         //        -1
  58.         rdb.Decr(ctx, "straey")
  59.         //        -5
  60.         rdb.DecrBy(ctx, "straey", 5)
  61.         //        过期时间
  62.         rdb.TTL(ctx, "strKey")
  63.         //        str*ey                : *为任意字符串
  64.         //        str[kKac]ey : 匹配[] 内的单个字符 strkey,strKey,straey,strcey
  65.         //        str?ey                : ? 任意单个字符
  66.         //        扫描key
  67.         iter := rdb.Scan(ctx, 0, "str?ey", 0).Iterator()
  68.         for iter.Next(ctx) {
  69.                 fmt.Println("keys", iter.Val(), ": val", rdb.Get(ctx, iter.Val()).Val())
  70.         }
  71.         if err := iter.Err(); err != nil {
  72.                 panic(err)
  73.         }
  74. }
  75. //        哈希
  76. func Test_Hash(t *testing.T) {
  77.         rdb.HMSet(ctx,"hkey1","name","shushan","age",99,"b",true)
  78.         //        以结构体存入 注意redis tag
  79.         type User struct {
  80.                 Name string `json:"name,omitempty" redis:"name"`
  81.                 Age  int    `json:"age,omitempty" redis:"age"`
  82.                 B    bool   `json:"b,omitempty" redis:"b"`
  83.                 //...
  84.         }
  85.         user1 := User{
  86.                 Name: "shushan2",
  87.                 Age:  55,
  88.                 B:    true,
  89.         }
  90.         //        结构体序列化反序列化map 你也可以用其他包进行转化为map,但是注意转化后的键名大小写问题
  91.         m := make(map[string]interface{})
  92.         buf,_ := json.Marshal(user1)
  93.         _ = json.Unmarshal(buf,&m)
  94.         //        存入
  95.         rdb.HSet(ctx, "user4", m)
  96.         //        取出绑定到结构体 map也行
  97.         var user User
  98.         rdb.HGetAll(ctx,"user4").Scan(&user)
  99.         fmt.Printf(" %#v \n ",user)
  100.         //        test.User{Name:"shushan2", Age:55, B:true}
  101.         //        获取key下的所有值   *匹配方式与string的所有原理一样
  102.         iter := rdb.HScan(ctx,"user4",0,"*",0).Iterator()
  103.         for iter.Next(ctx) {
  104.                 fmt.Println("keys", iter.Val())
  105.         }
  106.         if err := iter.Err(); err != nil {
  107.                 panic(err)
  108.         }
  109. }
  110. //        列表
  111. func Test_List(t *testing.T) {
  112.         //        添加
  113.         rdb.LPush(ctx,"listKey1",111,222,333,444)
  114.         rdb.RPush(ctx,"listKey1",5555)
  115.         //        不存在不添加
  116.         rdb.LPushX(ctx,"unlistKey",111)
  117.         var intf []int
  118.         //        根据索引获取 绑定到数组
  119.         rdb.LRange(ctx,"listKey1",0,10).ScanSlice(&intf)
  120.         fmt.Println(intf)
  121.         var i int
  122.         //        弹出
  123.         rdb.LPop(ctx,"listKey1").Scan(&i)
  124.         fmt.Println(i)
  125.         //....
  126. }
  127. //        集合
  128. func Test_Set(t *testing.T) {
  129.         //        添加
  130.         rdb.SAdd(ctx,"setKey1","m1","onlyk1")
  131.         rdb.SAdd(ctx,"setKey2","m2","xca")
  132.         sl,_:= rdb.SDiff(ctx,"setKey1","setKey2").Result()
  133.         fmt.Println(sl)
  134.         // onlyk1,m1
  135.         //随机移除
  136.         var val string
  137.         rdb.SPop(ctx,"setKey1").Scan(&val)
  138.         fmt.Println(val)
  139.         // .....
  140. }
  141. //        管道
  142. func Test_Pipe(t *testing.T) {
  143.         //         官方描述
  144.         //         Redis 管道允许客户端命令服务器通过执行任务而通过执行任务来提高您的性能。
  145.         //        在管道中,像命令命令一样将编写 + 使用命令来执行任务,并将其用于执行任务,执行任务不是一个地执行100个命令。
  146.         //        理解为命令就像石头,一次运送一个石头
  147.         //        使用管道等于 用车装石头  Exec 时就运送过去
  148.         pipe := rdb.Pipeline()
  149.         incr := pipe.Set(ctx, "pip_test","bt",0)
  150.         pipe.Expire(ctx, "pip_test", time.Hour)
  151.         //        提交
  152.         cmds, err := pipe.Exec(ctx)
  153.         if err != nil {
  154.                 fmt.Println(err)
  155.         }
  156.         for _, cmd := range cmds {
  157.                 fmt.Println(cmd.String())
  158.         }
  159.         // 该值得Exec提交后有效
  160.         fmt.Println(incr.Val())
  161. }
复制代码
其他操作都可以查看go-redis的源码或者直接打出rdb.命令,go-redis 的函数命名方式和redis的命令是差不多的
The end

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

铁佛

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表