30天学会Go--第7天 GO语言 Redis 学习与实践
30天学会Go–第7天 GO语言 Redis 学习与实践
文章目录
- 30天学会Go--第7天 GO语言 Redis 学习与实践
- 前言
- 一、Redis 基础知识
- 1.1 Redis 的核心特性
- 1.2 Redis 常见使用场景
- 二、安装 Redis
- 2.1 在 Linux 上安装
- 2.2 在 Windows 上安装
- 2.3 使用 Docker 安装 Redis
- 三、Redis 常用命令
- 3.1 基本操作
- 3.2 数据结构操作
- 字符串(String)
- 哈希(Hash)
- 列表(List)
- 集合(Set)
- 有序集合(Sorted Set)
- 四、在 Go 中使用 Redis
- 4.1 安装 go-redis
- 4.2 使用示例
- 代码示例
- 4.3 代码解读
- 五、Redis 高级功能
- 5.1 发布/订阅(Pub/Sub)
- 代码示例
- 5.2 使用 Redis 实现分布式锁
- 代码示例
- 六、总结
前言
Redis 是一个高性能的开源内存数据库,常用于缓存、消息队列、会话存储等场景。它支持多种数据结构(如字符串、哈希、列表、集合、有序集合等)和丰富的操作命令,具有极高的性能和灵活性。
以下是 Redis 的基础知识、安装、常用命令,以及在 Go 中使用 Redis 的方法。
go语言官方编程指南:https://pkg.go.dev/stdopen in new window
go语言的官方文档学习笔记很全,推荐去官网学习
30天学会Go–第7天 GO语言 Redis 学习与实践(改):30天学会Go–第7天 GO语言 Redis 学习与实践(改)
本章讲redis有所欠缺,请移步新的blog
30天学会Go–第6天 GO语言 RESTful API 学习与实践:30天学会Go–第6天 GO语言 RESTful API 学习与实践-CSDN博客
一、Redis 基础知识
1.1 Redis 的核心特性
- 内存存储:所有数据存储在内存中,读写速度极快。
- 多种数据结构:支持字符串(String)、哈希(Hash)、列表(List)、集合(Set)、有序集合(Sorted Set)等。
- 持久化:支持将内存数据持久化到磁盘(RDB 和 AOF 两种方式)。
- 高可用:支持主从复制、哨兵模式和集群模式,提供高可用性和扩展性。
- 丰富的功能:如发布/订阅(Pub/Sub)、事务、Lua 脚本等。
1.2 Redis 常见使用场景
- 缓存:将经常访问的数据存储到 Redis 中,提高读取性能。
- 会话存储:存储用户登录状态等会话信息。
- 排行榜:利用有序集合(Sorted Set)实现排行榜功能。
- 消息队列:使用列表(List)或发布/订阅功能实现消息队列。
- 分布式锁:利用 Redis 的原子操作实现分布式锁。
二、安装 Redis
2.1 在 Linux 上安装
- 下载 Redis:
wget http://download.redis.io/redis-stable.tar.gz
- 解压并编译:
tar xzf redis-stable.tar.gz cd redis-stable make
- 启动 Redis:
src/redis-server
2.2 在 Windows 上安装
- 下载 Redis for Windows:
- Redis 官方不支持 Windows,但可以下载社区版:https://github.com/microsoftarchive/redis/releases
- 解压后运行
redis-server.exe
启动服务。
2.3 使用 Docker 安装 Redis
- 拉取 Redis 镜像:
docker pull redis
- 启动 Redis 容器:
docker run -d --name redis -p 6379:6379 redis
三、Redis 常用命令
3.1 基本操作
-
连接 Redis:
redis-cli
-
设置键值对:
SET key value
-
获取键值:
GET key
-
删除键:
DEL key
-
检查键是否存在:
EXISTS key
-
设置过期时间(秒):
EXPIRE key seconds
-
查看剩余过期时间:
TTL key
3.2 数据结构操作
字符串(String)
-
增加值(适用于数值类型):
INCR key INCRBY key increment DECR key DECRBY key decrement
哈希(Hash)
- 设置哈希字段:
HSET key field value
- 获取哈希字段值:
HGET key field
- 获取所有字段和值:
HGETALL key
列表(List)
-
从左插入元素:
LPUSH key value1 value2
-
从右插入元素:
RPUSH key value1 value2
-
获取列表范围内的元素:
LRANGE key start stop
-
弹出最左边的元素:
LPOP key
集合(Set)
- 添加元素到集合:
SADD key member1 member2
- 获取集合中的所有元素:
SMEMBERS key
- 检查元素是否存在:
SISMEMBER key member
有序集合(Sorted Set)
- 添加元素并设置分数:
ZADD key score1 member1 score2 member2
- 获取有序集合中的元素:
ZRANGE key start stop WITHSCORES
四、在 Go 中使用 Redis
在 Go 中使用 Redis,通常使用第三方库 go-redis。
4.1 安装 go-redis
运行以下命令安装:
go get github.com/redis/go-redis/v9
4.2 使用示例
以下是一个简单的示例,展示如何在 Go 中使用 Redis。
代码示例
package mainimport ("context""fmt""github.com/redis/go-redis/v9"
)var ctx = context.Background()func main() {// 1. 连接到 Redisrdb := redis.NewClient(&redis.Options{Addr: "localhost:6379", // Redis 地址Password: "", // 如果没有设置密码,留空DB: 0, // 使用默认数据库})// 2. 写入数据err := rdb.Set(ctx, "key", "value", 0).Err()if err != nil {panic(err)}// 3. 读取数据val, err := rdb.Get(ctx, "key").Result()if err != nil {panic(err)}fmt.Println("key:", val)// 4. 检查键是否存在exists, err := rdb.Exists(ctx, "key").Result()if err != nil {panic(err)}fmt.Println("key exists:", exists)// 5. 删除键err = rdb.Del(ctx, "key").Err()if err != nil {panic(err)}fmt.Println("key deleted")
}
4.3 代码解读
-
连接 Redis:
- 使用
redis.NewClient
创建 Redis 客户端。 - 配置地址、密码和数据库编号。
- 使用
-
写入数据:
- 使用
Set
方法写入键值对。 - 第三个参数为过期时间,
0
表示不过期。
- 使用
-
读取数据:
- 使用
Get
方法读取键的值。
- 使用
-
检查键是否存在:
- 使用
Exists
方法检查键是否存在。
- 使用
-
删除键:
- 使用
Del
方法删除键。
- 使用
五、Redis 高级功能
5.1 发布/订阅(Pub/Sub)
Redis 支持发布/订阅模式,可以实现消息广播。
代码示例
// 发布消息
rdb.Publish(ctx, "channel1", "Hello, Redis!").Err()// 订阅消息
sub := rdb.Subscribe(ctx, "channel1")
ch := sub.Channel()
for msg := range ch {fmt.Println("Received message:", msg.Payload)
}
5.2 使用 Redis 实现分布式锁
Redis 的原子操作可以用来实现分布式锁。
代码示例
// 加锁
ok, err := rdb.SetNX(ctx, "lock_key", "lock_value", 10*time.Second).Result()
if err != nil || !ok {fmt.Println("Failed to acquire lock")return
}// 执行业务逻辑
fmt.Println("Lock acquired, executing task...")// 解锁
rdb.Del(ctx, "lock_key")
六、总结
Redis 是一个功能强大且灵活的内存数据库,在 Go 中使用 Redis 非常简单。通过学习 Redis 的基本命令和在 Go 中的集成,你可以轻松实现缓存、消息队列、分布式锁等功能。
相关文章:
30天学会Go--第7天 GO语言 Redis 学习与实践
30天学会Go–第7天 GO语言 Redis 学习与实践 文章目录 30天学会Go--第7天 GO语言 Redis 学习与实践前言一、Redis 基础知识1.1 Redis 的核心特性1.2 Redis 常见使用场景 二、安装 Redis2.1 在 Linux 上安装2.2 在 Windows 上安装2.3 使用 Docker 安装 Redis 三、Redis 常用命令…...
java 使用JSqlParser和CCJSqlParser 解析sql
maven <dependency><groupId>com.github.jsqlparser</groupId><artifactId>jsqlparser</artifactId><version>4.9</version> </dependency>解析SQL String sql "select aa,bb from b"; Statement statementCCJSq…...
基于spring boot的高校专业实习管理系统的设计与实现
文末获取源码和万字论文,制作不易,感谢点赞支持。 设计题目:基于spring boot的高校专业实习管理系统的设计与实现 摘 要 随着国内市场经济这几十年来的蓬勃发展,突然遇到了从国外传入国内的互联网技术,互联网产业从开…...
OpenCV相机标定与3D重建(11)机器人世界手眼标定函数calibrateRobotWorldHandEye()的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 计算机器人世界/手眼标定: w T b _{}^{w}\textrm{T}_b wTb 和 c T g _{}^{c}\textrm{T}_g cTg。 cv::calibrateRobotWorldHa…...
计算机网络ENSP课设--三层架构企业网络
本课程设计搭建一个小型互联网,并模拟Internet的典型Web服务过程。通过此次课程设计,可以进一步理解Internet的工作原理和协议过程,并提高综合知识的运用能力和分析能力。具体目标包括: (1)掌握网络拓扑的…...
【openwrt】openwrt-21.02 基于IP地址使用ipset实现策略路由操作说明
openwrt版本信息 DISTRIB_ID=OpenWrt DISTRIB_RELEASE=21.02-SNAPSHOT DISTRIB_REVISION=r0-6bf6af1d5 DISTRIB_TARGET=mediatek/mt7981 DISTRIB_ARCH=aarch64_cortex-a53 DISTRIB_DESCRIPTION=OpenWrt 21.02-SNAPSHOT r0-6bf6af1d5 DISTRIB_TAINTS=no-all busybox override …...
Git:常用命令
一、查看当前分支 git branch 二、查看所有分支 git branch -a 三、切换到远程分支 git checkout origin/分支名 示例:git checkout origin/dev 四、拉取远程分支代码 git pull origin 分支名 示例:git pull origin dev 五、常用指令 查看暂存区…...
【2025最新版】搭建个人博客教程
【2025最新版】搭建个人博客教程 –小记: 在搭建我的这个博客之前我在CSDN也发布过一些文章,目前应该也是几千粉丝了,但是看到别人都是用自己博客写的就感觉自己很LOW,所以就想自己来搭建一个属于自己的个人博客。当然搭建博客的…...
微信小程序实现联动删除输入验证码框
以下是json代码 {"component": true,"usingComponents": {} }以下是wxml代码 <van-popup show"{{ show }}" bind:close"onClose" custom-class"extract"><image src"../../images/extract/icon1.png"…...
数据库中decimal、float 和 double区别
在计算机科学中,decimal、float 和 double 是用于表示和处理数值的不同数据类型。 - decimal 是一种精确的十进制浮点数表示,通常用于需要高精度计算的场景,比如财务应用。它能够精确表示小数,并且不会出现浮点数运算误差。 - flo…...
网络编程01
1. 概念 通过网络,让两个主机之间能够进行通信,基于这样的通信完成一定的功能 只要满足进程不同即可,即使是同一个主机,只要是不同的进程,基于网络完成编程 进行网络编程时,需要操作系统提供一组API&…...
el-dialog修改其样式不生效加deep也没用
场景 el-dialog标签直接写在了template下。 解决方法 在template中先写一层div,包裹住el-dialog。...
三天精通一算法之快速排序
力扣链接912. 排序数组 - 力扣(LeetCode)注意这题快排不能用递归,否则堆会爆 快速排序(Quicksort)是一种高效的排序算法,通常使用分治法来将一个列表分成较小的子列表,然后递归地排序这些子列表…...
互联网、物联网的相关标准
互联网的相关标准 网络通信协议: HTTP(Hypertext Transfer Protocol):用于在网络中传输文本、图像、音频和视频等数据的协议。它基于请求-响应模型,客户端发送请求给服务器,服务器返回响应。HTTPS&a…...
Linux题库及答案
填空题 1. 建立用户账号的命令是__useradd________。 2. 修改账号密码的命令是__passwd________。 3. 更改用户密码过期信息的命令是__chage________。 4. 创建一个新组的命令是___groupadd_______。 5. 用于在不注销的情况下切换到系统中的另一个用户的命令是___su_…...
Android 镜像模式和扩展模式区别探讨-Android14
Android 镜像模式和扩展模式区别探讨 1、区分镜像模式和扩展模式1.1 扩展屏是否有显示内容1.2 镜像模式显示条件 2、镜像模式界面 同屏显示和异屏显示探讨DisplayManagerService启动及主屏添加-Android13 Android主副屏显示-Android14 1、区分镜像模式和扩展模式 LogicalDispla…...
深度学习笔记之BERT(五)TinyBERT
深度学习笔记之TinyBERT 引言回顾:DistilBERT模型TinyBERT模型结构TinyBERT模型策略Transformer层蒸馏嵌入层蒸馏预测层蒸馏 TinyBERT模型的训练效果展示 引言 上一节介绍了 DistilBERT \text{DistilBERT} DistilBERT模型,本节将继续介绍优化性更强的知…...
【时间序列预测】基于PyTorch实现CNN_BiLSTM算法
文章目录 1. CNN与BiLSTM2. 完整代码实现3. 代码结构解读3.1 CNN Layer3.2 BiLSTM Layer3.3 Output Layer3.4 forward Layer 4. 应用场景5. 总结 本文将详细介绍如何使用Pytorch实现一个结合卷积神经网络(CNN)和双向长短期记忆网络(BiLSTM&am…...
联想Y7000 2024版本笔记本 RTX4060安装ubuntu22.04双系统及深度学习环境配置
目录 1..制作启动盘 2.Windows 磁盘分区,删除原来ubuntu的启动项 3.四个设置 4.安装ubuntu 5.ubuntu系统配置 1..制作启动盘 先下载镜像文件,注意版本对应。Rufus - 轻松创建 USB 启动盘 用rufus制作时,需要注意选择正确的分区类型和系统类型。不然安装的系统会有问题…...
VuePress学习
1.介绍 VuePress 由两部分组成:第一部分是一个极简静态网站生成器 (opens new window),它包含由 Vue 驱动的主题系统和插件 API,另一个部分是为书写技术文档而优化的默认主题,它的诞生初衷是为了支持 Vue 及其子项目的文档需求。…...
一次“okhttp访问间隔60秒,提示unexpected end of stream“的问题排查过程
一、现象 okhttp调用某个服务,如果第二次访问间隔上一次访问时间超过60s,返回错误:"unexpected end of stream"。 二、最终定位原因: 空闲连接如果超过60秒,服务端会主动关闭连接。此时客户端恰巧访问了这…...
SQL最佳实践:避免使用COUNT=0
如果你遇到类似下面的 SQL 查询: SELECT * FROM customer c WHERE 0 (SELECT COUNT(*)FROM orders oWHERE o.customer_id c.customer_id);意味着有人没有遵循 SQL 最佳实践。该语句的作用是查找没有下过订单的客户,其中子查询使用了 COUNT 函数统计客…...
PG与ORACLE的差距
首先必须是XID 64,一个在极端环境下会FREEZE的数据库无论如何都无法承担关键业务系统的重任的,我们可以通过各种配置,提升硬件的性能,通过各种IT管控措施来尽可能避免在核心系统上面临FREEZE的风险,不过并不是每个企业…...
树莓派3B+驱动开发(2)- LED驱动(传统模式)
github主页:https://github.com/snqx-lqh 本项目github地址:https://github.com/snqx-lqh/RaspberryPiDriver 本项目硬件地址:https://oshwhub.com/from_zero/shu-mei-pai-kuo-zhan-ban 欢迎交流 笔记说明 如我在驱动开发总览中说的那样&…...
超详细搭建PhpStorm+PhpStudy开发环境
刚开始接触PHP开发,搭建开发环境是第一步,网上下载PhpStorm和PhpStudy软件,怎样安装和激活就不详细说了,我们重点来看一看怎样搭配这两个开发环境。 前提:现在假设你已经安装完PhpStorm和PhpStudy软件。 我的PhpStor…...
分析比对vuex和store模式
在 Vue 中,Vuex 和 store 模式 是两个不同的概念,它们紧密相关,主要用于管理应用的状态。下面我会详细介绍这两个概念,并通过例子帮助你更好地理解。 1. Vuex 是什么? Vuex 是 Vue.js 的一个状态管理库,用…...
C# 网络编程--基础核心内容
在现今软件开发中,网络编程是非常重要的一部分,本文简要介绍下网络编程的概念和实践。 C#网络编程的主要内容包括以下几个方面: : 上图引用大佬的图,大家也关注一下,有技术有品质,有国有家,情…...
【C++游戏程序】easyX图形库还原游戏《贪吃蛇大作战》(三)
承接上一篇文章:【C游戏程序】easyX图形库还原游戏《贪吃蛇大作战》(二),我们这次来补充一些游戏细节,以及增加吃食物加长角色长度等设定玩法,也是本游戏的最后一篇文章。 一.玩家边界检测 首先是用来检测…...
uni-app H5端使用注意事项 【跨端开发系列】
🔗 uniapp 跨端开发系列文章:🎀🎀🎀 uni-app 组成和跨端原理 【跨端开发系列】 uni-app 各端差异注意事项 【跨端开发系列】uni-app 离线本地存储方案 【跨端开发系列】uni-app UI库、框架、组件选型指南 【跨端开…...
SpringBoot中的@Configuration注解
在Spring Boot中,Configuration注解扮演着非常重要的角色,它是Spring框架中用于定义配置类的一个核心注解。以下是Configuration注解的主要作用: 定义配置类: 使用Configuration注解的类表示这是一个配置类,Spring容器…...
搬家网站建设公司/北京网上推广
本文由Tim Severien进行同行评审。 感谢所有SitePoint的同行评审人员使SitePoint内容达到最佳状态! 每天,成千上万的JavaScript开发人员都使用浏览器供应商尚未实现的语言版本。 他们中的许多人使用的语言功能仅是提案,无法保证它们会被纳入规…...
女生做网站编辑好不好/临沂头条新闻今日头条
广东金融学院2020录取分数线是多少,各专业录取分数线是多少,是每个填报广东金融学院的考生最关注的问题,随着各省高考录取批次相继公布,考生也开始关心是否被广东金融学院的录取,一品高考网整理相关信息供参考…...
大学生怎么做网站支付模块/百度推广登陆入口
过去几天我一直在努力解决这个问题.我使用JBPM 6.1.0.Final构建.我使用了这个mavenexample webapp project.关于环境设置的快速警告:我只能在JBoss EAP 6.3中部署该项目.我在Wildfly 8.1和8.2中尝试过,但我一直遇到错误,我无法弄清楚如何修复,所以你的milage可能会有…...
wordpress迁移后地址没变/google下载官网
在我们了解linux操作系统之前我们首先要先知道虚拟机的运行架构,我们在初学linux的时候,如果在我们的真实PC上做操作你就会发现,你很多时候都是在重装系统的状态下,当然你也可以在linux操作系统上去装一个KVM虚拟机,不…...
wordpress 在线qq客服/2023今天的新闻联播
5.3.5.4 Configmap Why:配置信息和镜像解耦What:将配置信息放到configmap对象中,然后在pod的对象中导入configmap对象,实现导入配置的操作How:声明一个ConfigMap的对象,作为Volume挂载到pod中配置变更: 直接把服务的配置文件(nginx.conf)放到镜像里configmap,把配置和…...
网站的图片滚动怎么做的/爱站网长尾关键词挖掘查询工具
针对每个测试需求设计测试用例,测试用例设计的遵守的原则: 1.每一个测试需求至少有一个测试用例与之对应; 2. 每个测试用例包含的测试步骤尽量不要超过10个;如果过多就进行拆分; 3. 每一步step只包含有一种情况&#x…...