一、redis安装

个人使用的redis是使用docker在容器中运行的。

# 使用docker拉取redis镜像
[root@bogon /]# docker pull redis:latest
latest: Pulling from library/redis
Digest: sha256:89051d5ec46a89d4a708467af38eaaf4029450c4b1b9835ffd413cf70625b22e
Status: Image is up to date for redis:latest
docker.io/library/redis:latest# 运行镜像
[root@bogon /]# docker run -tid --name redis_local -p 6379:6379 redis:latest
e60b37960034# 查看镜像
[root@bogon /]# docker ps
CONTAINER ID        IMAGE                                    COMMAND                  CREATED             STATUS              PORTS                               NAMES
e60b37960034        redis:latest                             "docker-entrypoint.s…"   2 days ago          Up About an hour    0.0.0.0:6379->6379/tcp              redis_local
ba6b74098ebd        registry.hangjia.online/base/mysql:5.7   "docker-entrypoint.s…"   4 days ago          Up About an hour    0.0.0.0:3306->3306/tcp, 33060/tcp   mysql5.7

二、go-redis 安装

本人使用 go mod 管理项目依赖包(和包版本)管理
如果是初始项目,在项目根目录下执行

# 在项目目录下初始化 go mod
go mod init
# 下载 go-redis 依赖
go get github.com/go-redis/redis/v8

三、go-redis使用

go-redis 源码

初始化客户端

项目中引入 go-redis 包,初始化 redis 客户端

package serviceimport ("context""fmt""github.com/go-redis/redis/v8"
)var RedisClient *redis.Client// 初始化 redis
func NewRedisClient() (*redis.Client, error) {RedisClient = redis.NewClient(&redis.Options{Addr:     "192.168.0.74:6379", // 要连接的redis IP:portPassword: "", // redis 密码DB:       0, // 要连接的redis 库})// 检测心跳pong, err := RedisClient.Ping(context.Background()).Result()if err != nil {fmt.Println("connect redis failed")return nil, err}fmt.Printf("redis ping result: %s\n", pong)return RedisClient, nil
}

Ping() 旧版本是不需要参数的,v8 需要参数 context.Context

基本使用

本人对 go-redis 做了基本封装

package serviceimport ("context""errors""fmt""github.com/go-redis/redis/v8"
)var ctx = context.Background()/*向 redis hash 中存值参数:key:存入hash的key值mapData:对应key的map值mapData 格式: map[string]interface{}{"key1": "value1", "key2": "value2"}return:bool(是否添加成功),error(错误信息)
*/
func HashSet(key string, mapData map[string]interface{}) (bool, error) {// 参数非空验证if key == "" || mapData == nil {fmt.Println("key===>", key)fmt.Println("mapData===>", mapData)return false, errors.New("参数为空")}fmt.Println("key===>", key)fmt.Println("mapData===>", mapData)if RedisClient == nil {fmt.Println("客户端为空")return false, errors.New("客户端断开连接")} else {if err := RedisClient.HSet(ctx, key, mapData).Err(); err != nil {return false, errors.New("添加失败")} else {return true, nil}}
}/*根据key,field 获取值参数:key:存入hash的key值field:字段名return:string(返回字段的值),error(错误信息)
*/
func HashGet(key string, field string) (string, error) {// 参数非空判断if key == "" || field == "" {return "", errors.New("参数为空")}value, err := RedisClient.HGet(ctx, key, field).Result()if err == redis.Nil {return "", errors.New("key 不存在")} else if err != nil {return "", errors.New("获取失败")}return value, nil
}/*根据key,field 获取值参数:key:存入hash的key值fields:可变长参数,0到n个fieldreturn:map[string]interface{} 返回一个map
*/
func BatchHashGet(key string, fields ...string) ([]interface{}, error) {if key == "" {return nil, errors.New("参数为空")}resultArray, err := RedisClient.HMGet(ctx, key, fields...).Result()if err != nil {return nil, errors.New("error occur when get data from redis : " + err.Error())}return resultArray, nil
}/*判断 hash key,field是否存在参数:key:存入hash的key值field:字段名返回值:bool:字段是否存在error:错误信息
*/
func HashKeyExist(key, field string) (bool, error) {if key == "" || field == "" {return false, errors.New("参数为空")}b, err := RedisClient.HExists(ctx, key, field).Result()if err != nil {return false, errors.New("异常:" + err.Error())}return b, nil
}/*删除hash field参数:key:存入hash的key值fields:字段名 数组返回值:bool:字段是否存在error:错误信息
*/
func HashDel(key string, fields ...string) (bool, error) {if key == "" {return false, errors.New("参数为空")}r, err := RedisClient.HDel(ctx, key, fields...).Result()if err != nil {return false, errors.New("异常:" + err.Error())}fmt.Println("删除hash key :", r)return true, nil
}
# 使用test单元测试
package testimport ("context""fmt""testing""time""com.hangjia/ych/myadmin/service""github.com/go-redis/redis/v8"
)func TestRedis(t *testing.T) {// 初始化 redisservice.InitRedisClient()if service.RedisClient == nil {fmt.Println("========================= redis client is nil ===================")panic("redis client is nil")}ctx := context.Background()// 准备测试数据var mapData map[string]interface{}mapData = make(map[string]interface{})mapData["name"] = "test_ex"mapData["age"] = 110// 判断 key field 是否存在b, err := service.HashKeyExist("110", "name")if err != nil {fmt.Println("判断key是否存在,异常:", err)} else {fmt.Println("判断key是否存在 ", b)}// 删除if b {b1, err := service.HashDel("110", "name")if err != nil {fmt.Println("hash 删除,异常:", err)}fmt.Println("删除,", b1)}// redis hash setb, err = service.HashSet("110", mapData)if err != nil {fmt.Println("redis 插入失败")}fmt.Println("redis 插入", b)// redis hash gets, err := service.HashGet("110", "name")if err != nil {fmt.Println("redis :", err)}fmt.Println("110 :", s)// redis hash mgetparam := []string{"name", "age"}resultArray, err := service.BatchHashGet("110", param...)if err != nil {fmt.Println(err)} else {fmt.Println("resultArray:===>", resultArray)}fmt.Println("========================= set =========================")// redis set 过期时间err = service.RedisClient.Set(context.Background(), "text_nx", "textnx_value", time.Second*30).Err()if err != nil {fmt.Println("set设置过期时间失败", err)} else {fmt.Println("set设置过期时间成功")}// 获取过期时间var time time.Durationtime, err = service.RedisClient.TTL(ctx, "text_nx").Result()fmt.Println("text_nx 过期时间为:", time)// redis set 取值var value stringvalue, err = service.RedisClient.Get(context.Background(), "text_nx").Result()if err == redis.Nil {fmt.Println("key not exists")} else if err != nil {fmt.Println("get value from key err :===>", err)} else {fmt.Println("get value from key is :===>", value)}
}

go-redis 使用相关推荐

  1. Spring AOP + Redis解决重复提交的问题

    Spring AOP + Redis解决重复提交的问题 用户在点击操作的时候,可能会连续点击多次,虽然前端可以通过设置按钮的disable的属性来控制按钮不可连续点击,但是如果别人拿到请求进行模拟,依 ...

  2. Redis问题——Error: 磁盘在使用中,或被另一个进程锁定。

    Redis出于对数据保护,默认只能本地客户端连接.远程连接就会出现以上错误.如何解决这一问题,看下: server -A,PC-A, 修改server-A的redis.conf:注释掉本地绑定: bi ...

  3. 实现 连续15签到记录_MySQL和Redis实现用户签到,你喜欢怎么实现?

    现在的网站和app开发中,签到是一个很常见的功能 如微博签到送积分,签到排行榜 微博签到 如移动app ,签到送流量等活动, 移动app签到 用户签到是提高用户粘性的有效手段,用的好能事半功倍! 下面 ...

  4. Redis 笔记(16)— info 指令和命令行工具(查看内存、状态、客户端连接数、监控服务器、扫描大key、采样服务器、执行批量命令等)

    Info 命令返回关于 Redis 服务器的各种信息和统计数值.通过给定可选的参数 section ,可以让命令只返回某一部分的信息. 1. 显示模块 server : 一般 Redis 服务器信息, ...

  5. Redis 笔记(15)— 管道 pipeline(客户端将批量命令打包发送用来节省网络开销)

    Redis 是一种基于客户端-服务端模型以及请求/响应协议的 TCP 服务.这意味着通常情况下一个请求会遵循以下步骤: 客户端向服务端发送一个查询请求,并监听 Socket 返回,通常是以阻塞模式,等 ...

  6. Redis 笔记(14)— 持久化及数据恢复(数据持久方式 RDB 和 AOF、数据恢复、混合持久化)

    1. 持久化 所谓持久化是指将数据从内存中以某种形式同步到硬盘中,在 Redis 重启后能够根据硬盘中的记录恢复数据.Redis 持久化有两种方式,分别为 RDB(redis data base) [ ...

  7. Redis 笔记(13)— scan 和 keys 寻找特定前缀key 字段(命令格式、使用示例、定位大key)

    1. keys Redis 提供了一个简单暴力的指令 keys 用来列出所有满足特定正则字符串规则的 key. 127.0.0.1:6379> keys * (empty array) 127. ...

  8. Redis 笔记(12)— 单线程架构(非阻塞 IO、多路复用)和多个异步线程

    Redis 使用了单线程架构.非阻塞 I/O .多路复用模型来实现高性能的内存数据库服务.Redis 是单线程的.那么为什么说是单线程呢? Redis 在 Reactor 模型内开发了事件处理器,这个 ...

  9. Redis 笔记(11)— 文本协议 RESP(单行、多行字符串、整数、错误、数组、空值、空串格式、telnet 登录 redis)

    RESP 是 Redis 序列化协议Redis Serialization Protocol 的简写.它是一种直观的文本协议,优势在于实现异常简单,解析性能极好. ​ Redis 协议将传输的结构数据 ...

  10. Redis 笔记(10)— 发布订阅模式(发布订阅单个信道、订阅信道后的返回值分类、发布订阅多个信道)

    1. 发布-订阅概念 发布-订阅 模式包含两种角色,分别为发布者和订阅者. 订阅者可以订阅一个或者若干个频道(channel): 而发布者可以向指定的频道发送消息,所有订阅此频道的订阅者都可以收到此消 ...

最新文章

  1. web 移动端 ios 浏览器中 animation 动画异常
  2. 【深度学习】基于Pytorch的线性模型概念辨析和实现(二)
  3. QT官方第三方开源工具
  4. 进程与线程的区别联系
  5. Yii2 配置 Nginx 伪静态
  6. SQL查询月初与月末时间
  7. [leetcod] Clone Graph
  8. 那些让老板赞不绝口的可视化大屏,附模板和教程
  9. expected at least 1 bean which qualifies as autowire candidate for this depe (spring无法注入)...
  10. 拓端tecdat|Python使用矩阵分解法找到类似的音乐
  11. java.util.TaskQueue的最小堆排序算法的应用
  12. 新版标准日本语高级_第5课
  13. 怎么把win10右下角的隐藏图标调出来(把倒三角调出来)
  14. 如何让右下角时间显秒
  15. 黄褐斑激光-百花净斑方
  16. 零跑股价再度上涨的原因到底是什么呢?
  17. 蚁群算法解决tsp问题python_蚁群算法在解决TSP问题中的应用
  18. IOS中策略模式初运用
  19. cesium加载接入百度地图(cesium篇.2)
  20. python操作mysql数据库练习

热门文章

  1. 建立完善的员工晋升机制_完善机制,打造晋升方案
  2. 【嵌入式算法】空间向量夹角公式及其应用
  3. 【FFmpeg】pkt->duration = 0, maybe the hls segment duration will not precise
  4. 中国民营医疗产业经营管理模式与“十四五”发展规划建议报告2021-2027年版
  5. html5相对路径写法,相对路径写法
  6. 致2020年的高考:教育改变命运
  7. Python学习:python time模块之time.mktime()
  8. 云计算事业部高性能集群使用手册
  9. 前洛克希德马丁高工谈宽带RF接收机架构
  10. 题解 DTOJ #4016.辉夜的夜空明珠(moon)