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后端相关面试题的,所有问题都是在牛客、知识星球或网上找到的最近最新的面试题,全文回答都是作者按自己的真实水平仿照真实环境的回答,所以答案不一定真实(但回答一定真诚🤣࿰…...
Mysql索引,聚簇索引,非聚簇索引,回表查询
什么是索引 数据库索引是为了实现高效数据查询的一种有序的数据数据结构,类似于书的目录,通过目录可以快速的定位到想要的数据,因为一张表中的数据会有很多,如果直接去表中检索数据效率会很低,所以需要为表中的数据建立…...
Spring完整知识三(完结)
Spring集成MyBatis 注意 Spring注解形式集成MyBatis时,若SQL语句比较复杂则仍采用映射文件形式书写SQL语句;反之则用注解形式书写SQL语句,具体可详见Spring注解形式 环境准备相同步骤 Step1: 导入相关坐标,完整pom.…...
kafka-clients之ConsumerConfig
Kafka ConsumerConfig 中的配置项用于定义消费者的行为,如消费方式、偏移管理、组协调等。以下是ConsumerConfig中的关键配置项及其详细说明: 1. bootstrap.servers 类型:List<String>说明:Kafka集群的地址列表࿰…...
关于“浔川AI翻译”使用情况的调研报告
关于“浔川 AI 翻译”使用情况的调研报告 随着全球化进程加速及外语学习需求攀升,AI 翻译工具愈发普及。“浔川 AI 翻译”作为行业产品之一,为了解其市场表现与用户反馈,特开展本次问卷调查,现将关键结果汇报如下。 一、样本概…...
第一节、电路连接【51单片机-TB6600驱动器-步进电机教程】
摘要:本节介绍如何搭建一个51单片机TB6600驱动器步进电机控制电路,所用材料均为常见的模块,简单高效的方式搭建起硬件环境 一、硬件清单 ①51单片机最小控制系统 ②USB转TTL模块 ③开关电源 ④TB6600步进电机驱动器 ⑤二相四线步进电机 ⑥电…...
编程之路,从0开始:补充篇
Hello大家好!很高兴和大家又见面啦!给生活添点passion,开始今天的编程之路! 我的博客:<但凡. 我的专栏:《编程之路》、《题海拾贝》、《数据结构与算法之美》 欢迎点赞,关注! 这篇…...
<script src = “https://cdn.jsdelivr.net/npm/vue/dist/vue.js“></script>
这行代码是HTML中的一个<script>标签,用于在网页中嵌入Vue.js库。具体来说: <script>:是HTML中的一个标签,用于定义客户端的脚本,比如JavaScript。 src:是<script>标签的一个属性&#…...
RabbitMQ延时队列
RabbitMQ延时队列 什么是延时队列 延时队列顾名思义,即放置在该队列里面的消息是不需要立即消费的,而是等待一段时间之后取出消费。 应用场景 场景一:在订单系统中,一个用户下单之后通常有30分钟的时间进行支付,如…...
Java——异常机制(下)
1 异常处理之(捕获异常) (一般处理运行时异常) (try-catch-finally子句) (finally一般用于文件最后关闭) (catch捕获的子类在前父类在后——>不然父类在前面都让父类捕获掉了,会报错) (Exception是父类放在最后,如果前面没有捕获到,就…...
9. 一分钟读懂“策略模式”
9.1 模式介绍 策略模式是一种行为型设计模式,用于在运行时灵活切换对象的行为或算法,它将算法封装为独立的类,使得它们可以互相替换,而不会影响使用这些算法的客户端代码。 策略模式的核心思想是:定义一系列可互换的算…...
python调用GPT-4o实时音频 Azure OpenAI GPT-4o Audio and /realtime
发现这块网上信息很少,记录一下 微软azure入口 https://learn.microsoft.com/zh-cn/azure/ai-services/openai/realtime-audio-quickstart?pivotsprogramming-language-ai-studio sdk文档 https://github.com/azure-samples/aoai-realtime-audio-sdk?tabread…...
linux查看应用程序执行时间
命令 ps -eo pid,comm,lstart,etime,args | grep -i java ps:是查看进程状态的命令。-eo:是-e和-o参数的组合,-e表示显示所有进程,-o后面跟的是自定义输出格式。pid:表示进程ID。comm:表示命令名&#x…...
mybatis之数据统计与自定义异常处理
文章目录 需求描述定义实体方式一、mybatisPlus实现方式二、自定义SQL实现简单查询过滤查询 异常处理1、SQL拼写异常 在使用Mybatis或MybatisPlus进行数据统计,在【 SpringBoot的Mybatis-plus实战之基础知识】中对mybatisplus引入有介绍,本次要使用其进…...
Jenkins 中自定义Build History中显示构建信息
有时候会遇到一个代码仓库下面会有多个不同的分支,而这写分支表示着不同的开发者在开发新的需求,但是这样就会出现一个问题,在Jenkins上进行多分支构建的时候,很难找到哪一个是属于自己分支构建的,这样的问题大家应该都…...
安装certbot(ubuntu系统)
安装nginx 更新软件包列表 sudo apt update 更新软件包列表 sudo apt install nginx 更新软件包列表 sudo systemctl status nginx 注意:强烈推荐使用,系统直接安装nginx,(不推荐使用docker安装nginx)为后续更简单…...
QTextBrowser按照段落来显示html的文字
在 PyQt5 中,QTextBrowser 是一个用来显示富文本(如 HTML)内容的小部件。要让 QTextBrowser 按照段落来显示 HTML 内容,可以确保 HTML 中的每个段落被正确地封装在 <p> 标签中或其他合适的 HTML 标签中。 基本思路 HTML 格…...
如何让Google快速收录你的页面?
要让Google更快地收录你的网站内容,首先需要理解“爬虫”这个概念。Google的爬虫是帮助它发现和评估网站内容质量的工具,如果你的页面质量高且更新频率稳定,那么Google爬虫更可能频繁光顾。通常情况下,通过Google Search Console&…...
用Linux完成firewall-cmd配置防火墙
注意这里是openeuler的系统 假设在内网架设了一台Web服务器,IP地址是192.168.1.2,端口是80,设置内网网段192.168.1.0/24中的主机均可以访问此Web服务器,如图所示 步骤如下(包含结果) 这里再服务端(192.168.131.10)上配置&#x…...
关于光速的猜想
光速实际也可能是爱因斯坦制造出来的一个量,就像质量(重力mg,有这个关系在,m起的名字后来就演变成了质量)是牛顿造出的一个量,一个常量,刚开始都叫c,只是习以为常后起了个名字罢了&a…...
Mybatis-Flex的简单入门,Mybatis-Flex和其它框架对比
前言 最近做项目,项目组必须要用Mybatis-Flex,然后自己去学了一下,给大家进行分享。 MyBatis-Flex 是 MyBatis 的一个增强工具,旨在简化 MyBatis 的使用并提高开发效率。它通过提供一系列的便捷方法和特性来减少重复代码的编写&am…...
轻量化特征融合 | YOLOv11 引入一种基于增强层间特征相关性的轻量级特征融合网络 | 北理工新作
本改进已同步到Magic框架 摘要—无人机图像中的小目标检测由于分辨率低和背景融合等因素具有挑战性,导致特征信息有限。多尺度特征融合可以通过捕获不同尺度的信息来增强检测,但传统策略效果不佳。简单的连接或加法操作无法充分利用多尺度融合的优势,导致特征之间的相关性不…...
linux的磁盘管理
认识磁盘 从外到内,磁道从0~XXX。扇区默认512字节先读完一个柱面的0号磁道,接着读第二个柱面的0号磁道……直至所有柱面的0号磁道读写完毕,进入下一个磁道。 磁盘命名规则 物理磁盘:sd开头;虚拟磁盘vd开头 sdb1:第二…...
Alibaba EasyExcel 导入导出全家桶
一、阿里巴巴EasyExcel的优势 首先说下EasyExcel相对 Apache poi的优势: EasyExcel也是阿里研发在poi基础上做了封装,改进产物。它替开发者做了注解列表解析,表格填充等一系列代码编写工作,并将此抽象成通用和可扩展的框架。相对p…...
使用Scala编写一个简单的决策树分类测试demo
使用Scala编写一个简单的决策树分类测试demo,我们可以基于Apache Spark的MLlib库来实现。这里将展示如何创建一个简单的决策树分类器,并用它来进行预测。我们将遵循以下步骤: 设置环境和导入必要的包。加载并准备数据集。构建决策树模型。使…...
SQLServer中使用ISNULL替换为指定的替换值
ISNULL (Transact-SQL) 适用于: SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse Analytics 分析平台系统 (PDW)Microsoft Fabric 中的 SQL 分析端点Microsoft Fabric 中的仓库 NULL替换为指定的替换值。 1、语法 ISNULL ( check_expression , rep…...
69 mysql 中 is null 的实现
前言 Mysql 中我们偶尔会用到 字段为 NULL 的情况 这时候 我们只能使用查询 “select * from tz_test_02 where field1 is null;” 来进行 field1 字段为 null 的行的查询 然后如果是使用 “select * from tz_test_02 where field1 null;” 你会发现查询 不出数据 但是如…...
【信息系统项目管理师】第9章:项目范围管理-基础和过程 考点梳理
文章目录 9.1 管理基础9.1.1 产品范围和项目范围9.1.2 管理新实践 9.2 项目范围管理过程9.2.1 过程概述9.2.2 裁剪考虑因素9.2.3 敏捷与适应方法 【学习建议】本章节内容属于10大管理知识领域,选择、案例、论文都会考,建议重点学习。项目范围管理包括确保…...
智能制造标准体系建设指南
一、智能制造系统架构总览 智能制造作为当今制造业转型升级的核心,深度整合了新一代信息技术与传统制造工艺,催生出一个横跨产品全生命周期、纵贯多层级组织架构,并彰显多元智能特性的复杂系统。这一架构从生命周期、系统层级、智能特征三个…...
怎么获取键值对的键的数值?
问: 通过paelData.cardMap.C0002112可以获取到Cooo2112里面的数据,但是有时候接口返回的不是C0002112而是C0002093或者其他值,请问我该怎么写? 后端返回的数据是这样的: cardMap: { C0002112: { name: Item 1, va…...
反向代理后Request.Url.AbsoluteUri获取成了内网IP
出现的问题:用户请求的是域名,而后端通过Request.Url.AbsoluteUri获取用户请求的绝对路径时,变成了内网IP 解决方式: 反向代理配置中加上: proxy_set_header Host $host; # proxy_set_header Host h o s t : host: h…...
NLP论文速读(斯坦福大学)|使用Tree将语法隐藏到Transformer语言模型中正则化
论文速读|Sneaking Syntax into Transformer Language Models with Tree Regularization 论文信息: 简介: 本文的背景是基于人类语言理解的组合性特征,即语言处理本质上是层次化的:语法规则将词级别的意义组合成更大的成分的意义&…...
OpenCV-图像阈值
简单阈值法 此方法是直截了当的。如果像素值大于阈值,则会被赋为一个值(可能为白色),否则会赋为另一个值(可能为黑色)。使用的函数是 cv.threshold。第一个参数是源图像,它应该是灰度图像。第二…...
window系统,照片应用打开图片,但是提示操作系统找不到已输入的环境选项,请问怎么解决,以便能打开图片
文章目录 问题描述问题解决一、先用AI提问,看能否得到解答二、最终的解决方法-修改环境变量 至此问题解决。 问题描述 Windows中,使用默认的图片应用打开图片时,提示: 操作系统找不到已输入的环境选项如下图: 这个问…...
Excel之查找函数-XLOOKUP
背景: 某些数据处理,需要对比两个乱序或者数据不完全相同的数值,取到另外一个数据值,数据量大的情况下,人工对比太耗时,XLOOKUP函数是一个查找函数,可以通过遍历对比某一单元格的值,…...
深入理解 Java 内存管理:堆和栈
深入理解 Java 内存管理:堆和栈的全面解析 在 Java 编程语言中,内存管理是一个至关重要的概念,其中堆(Heap)和栈(Stack)是两个核心的内存区域。理解它们的工作原理、用途以及它们在程序执行过程…...
深度全解析开放开源大模型之BLOOM
BLOOM是 BigScience Large Open-science Open-access Mul-tilingual Language Model首字母的缩写。 BigScience 不是财团(consortium),也不是正式成立的实体。这是一个由HuggingFace、GENCI和IDRIS发起的开放式协作组织,以及一个…...
下载谷歌浏览器的官方离线安装包
网址:https://support.google.com/chrome/answer/95346?hlzh-Hans&coGENIE.Platform%3DDesktop#zippy%2Cwindows...
ORACLE创建用户报错ORA-65096: invalid common user or role name
在高版本的oracle中创建用户时提示错误ORA-65096: invalid common user or role name,官网说明用户名必须使用C##或c##开头。以下方法亲测有效。 通过设置"_ORACLE_SCRIPT"参数为true来临时绕过CDB中创建用户必须以"C##"开头的限制。请注意&…...
河工oj第七周补题题解2024
A.GO LecturesⅠ—— Victory GO LecturesⅠ—— Victory - 问题 - 软件学院OJ 代码 统计 #include<bits/stdc.h> using namespace std;double b, w;int main() {for(int i 1; i < 19; i ) {for(int j 1; j < 19; j ) {char ch; cin >> ch;if(ch B) b …...
运维大屏与设备仪表盘:打造高效运维管理的视觉中枢
在快速发展的信息化时代,运维行业面临着前所未有的挑战。随着业务规模的不断扩大和系统复杂度的日益增加,如何高效、准确地监控和管理设备运行状态,成为运维团队亟待解决的问题。运维大屏与设备仪表盘作为运维管理的重要工具,为运…...
计算机视觉与医学的结合:推动医学领域研究的新机遇
目录 引言医学领域面临的发文难题计算机视觉与医学的结合:发展趋势计算机视觉结合医学的研究方向高区位参考文章结语 引言 计算机视觉(Computer Vision, CV)技术作为人工智能的重要分支,已经在多个领域取得了显著的应用成果&…...
使用setsockopt函数SO_BINDTODEVICE异常,Protocol not available
前言 最近在使用OLT的DHCP Server的时候发现一些异常现象,就是ONU发的一个vlan的discover包其他不同vlan的DHCP地址池也会收到,导致其他服务器也发了offer包,ONU同时会有多个ip地址。一开始是没有使用SO_BINDTODEVICE,后面查到使…...
rpm包转deb包或deb包转rpm包
Debian系(Ubuntu、Deepin、麒麟Destop等)用的安装包是deb的,Red Hat系(CentOS、欧拉、麒麟Server等)用的安装包是rpm的。 如果需要在Ubuntu上安装rpm,或需要在CentOS上安装deb,需要安装alien s…...
ChatGPT 和文心一言哪个更好用?
ChatGPT vs 文心一言:哪个更好用? 引言 在人工智能蓬勃发展的今天,聊天机器人已经成为我们生活和工作中不可或缺的一部分。你可能听说过ChatGPT和文心一言这两个热门的聊天机器人,它们分别来自OpenAI和百度。那么,究…...
T113-S3 Tina 存储类型修改
前面介绍了如何在 Tina 中添加新的板子,本节介绍如何修改板子存储类型。 1、确定存储类型 Tina 支持多种存储类型,包括 SD 卡、eMMC、SPI NAND、SPI NOR 等。在添加板子之前,需要确定板子使用的存储类型。 存储类型修改 在 device/config/…...
【css】基础(一)
本专栏内容为:前端专栏 记录学习前端,分为若干个子专栏,html js css vue等 💓博主csdn个人主页:小小unicorn ⏩专栏分类:css专栏 🚚代码仓库:小小unicorn的代码仓库🚚 &a…...
Linux中inode
磁盘的空间管理 如何对磁盘空间进行管理? 假设在一块大小为500G的磁盘中,500*1024*1024524288000KB。在磁盘中,扇区是磁盘的基本单位(一般大小为512byte),而文件系统访问磁盘的基本单位是4KB,因…...
verilog fpga 如果if语句==号后面是个表达式 运行不稳定
来自 文心一言 在Verilog中编写FPGA代码时,使用if语句进行条件判断是常见的操作。然而,当if语句中的条件判断使用的是表达式(如后面是一个复杂的表达式),确实可能会遇到运行不稳定的问题。这通常是由于以下几个原因导…...