Redis 基础篇

news2025/1/10 3:43:32

一、redis 概念及特性

1.1 Redis 概念

Redis(Remote Dictionary Server),即远程字典服务,是一个开源的高性能键值存储数据库,可以用作数据库、缓存和消息中间件。

redis 官网:Redis - The Real-time Data Platform

redis 中文文档:Redis中文学习网 - Redis开发与运维技术、Redis教程、使用手册

1.2 Redis特性

  • 高性能:Redis的速度非常快,官方给出的读写性能可以达到10万次/秒,这得益于其内存存储、C语言实现、单线程架构以及优秀的源代码。
  • 丰富的功能:除了基本的Key-Value存储外,Redis还支持发布/订阅机制、事务、Lua脚本、流水线、键过期等功能。
  • 持久化:Redis提供了两种持久化方式:RDB(快照)和AOF(追加文件),以确保数据的可靠性和持久性。
  • 主从复制:Redis支持主从同步,数据可以从主服务器向任意数量的从服务器上同步,这有助于实现数据的冗余和读取操作的扩展性。
  • 高可用性和分布式:Redis提供了高可用实现Redis Sentinel和分布式实现Redis Cluster,以确保在分布式环境中的高可用性和读写、容量的扩展性。

1.3 docker 安装 redis

// 拉取镜像
docker pull redis

// 在后台运行 redis
docker run -v /usr/redis/redis3.conf:/usr/redis/redis.conf -p 6379:6379 --name myredis -d redis

// 在后台运行 redis
docker run -v /usr/redis/redis2.conf:/usr/redis/redis.conf -v /usr/redis/data:/data --privileged=true -p 6380:6380 --name redis_slave80 -d redis redis-server /usr/redis/redis.conf

二、redis 常用数据类型及命令

2.1 查看和设置配置

查看所有配置:config get * 

查看某项配置:CONFIG GET CONFIG_SETTING_NAME

设置某项配置:CONFIG SET CONFIG_SETTING_NAME NEW_CONFIG_VALUE

2.2 常用数据类型

2.2.1 String 

// 设置字符串的命令 SET key value [EX seconds|PX milliseconds|KEEPTTL] [NX|XX] [GET]

// 当 Key 值不存在时,才进行设置
set mykey 111 nx

// 当 Key 值存在时,才进行设置
set myKey 222 xx

// 设置过期时间(秒)
set myKey 333 ex 10

// 设置过期时间(毫秒)
set myKey 444 px 5000

// 保留 Key 之前设置的过期时间
set myKey 555 ex 30
set myKey 666 keepttl

// 同时设置多个键值对
mset k1 v1 k2 v2

// 同时获取多个键值对
mget k1 k2

// 获取字符串的一部分内容
getrange mykey 0 3  // 0 -1 表示全部

// 对存储的数字加 1
set k1 100
incr k1

应用场景:喜欢的视频或商品,点一次加1 

2.2.2 List

应用场景:微信公众号订阅文章 

2.2.3 Hash

应用场景:早期购物车 

2.2.4 Set

应用场景:社交场景中的共同好友、可能认识的人、抽奖活动

2.2.5 Sorted set

应用场景:商品销量排序

参考 redis 命令手册

三、redis 持久化

redis 提供了多种不同级别的持久化方式:

  • RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot)
  • AOF 持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集

AOF配置:

通过修改配置文件来打开 AOF 功能: appendonly yes

AOF工作流程: 

三种写回策略:

  • always:每次有新命令追加到 AOF 文件时就执行一次 fsync :非常慢,也非常安全。
  • everysec:每秒 fsync 一次,redis默认的写回策略。足够快(和使用 RDB 持久化差不多),并且在故障时只会丢失 1 秒钟的数据。
  • no:从不 fsync :将数据交给操作系统来处理。更快,也更不安全的选择。

四、redis 事务

5.1 概念

redis 事务可以将命令组合在一起以便于它们作为一个单独的事务执行。

5.2 命令

Redis使用 MULTI 命令标记事务开始,它总是返回OK。MULTI执行之后,客户端可以发送多条命令,Redis会把这些命令保存在队列当中,而不是立刻执行这些命令。所有的命令会在调用EXEC 命令之后执行。  如果不调用EXEC,调用 DISCARD 会清空事务队列并退出事务。

127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set k1 2222
QUEUED
127.0.0.1:6379(TX)> incr k1
QUEUED
127.0.0.1:6379(TX)> hset k2 name snow age 18 address beijing
QUEUED
127.0.0.1:6379(TX)> exec
1) OK
2) (integer) 2223
3) (integer) 3

 5.3 redis事务与关系型数据库事务的区别

5.4 为什么 redis 事务不支持回滚

Redis事务中的命令允许失败,但是Redis会继续执行其它的命令而不是回滚所有命令。

这么做的原因有两点:

①Redis 命令只在两种情况失败:

  • 语法错误的时候才失败(在命令输入的时候不检查语法)。
  • 要执行的key数据类型不匹配:这种错误实际上是编程错误,这应该在开发阶段被测试出来,而不是生产上。

②因为不需要回滚,所以Redis内部实现简单并高效。

五、redis 管道

5.1 管道定义

pipeline 是为了解决命令RTT(round-trip time)往返时间,仅仅将命令打包一次性发送,对整个redis的执行不造成任何影响。

 5.2 管道的使用方法

使用命令:

cat cmd.txt | redis-cli --pipe

举例说明: 

5.3 管道和原生批处理命令的区别

  • 原生批量命令是原子性(例如:mset mget),pipeline是非原子性
  • 原生批量命令一次只能执行一种命令,pipeline支持批量执行不同命令
  • 原生批命令是服务端实现,而pipelne需要服务端与客户端共同完成

5.4 注意事项 

  • pipeline缓冲的指令只是会依次执行,不保证原子性,如果执行中指令发生异常,将会继续执行后续的指令
  • 使用pipeline组装的命令个数不能太多,不然数据量过大客户端阻塞的时间可能过久,同时服务端此时也被迫回复一个队列答复,占用很多内存

六、redis 复制

6.1 概念

主从复制,master 以写为主,slave 以读为主,当 master 数据变化的时候,自动将新的数据以异步的方式同步到其他 slave 数据库。

6.2 特性

  • 读写分离
  • 容灾恢复
  • 数据备份
  • 水平扩容支撑高并发

6.3 主从复制的命令

// 主从复制
replicaof 主库IP 主库端口

// 变更主库
slaveof 新主库IP 新主库端口

// 取消从库
slave no one

redis搭建一主二从复制的具体操作见 阿里云环境下用docker搭建redis主从复制-CSDN博客

6.4 主从复制的工作原理

  • slave启动,同步初请
  • 首次连接,全量复制
  • 心跳持续,保持通信
  • 进入平稳,增量复制
  • 从机下线,重连续传

6.5 主从复制的缺点

复制延时,信号衰减

master服务故障

七、redis 哨兵

7.1 概念

吹哨人巡查监控后台master主机是否出现故障,如果出现故障,则根据投票数自动将某一个从库转为新主库,继续对外提供服务。俗称无人值守运维。

八、redis 集群

8.1 概念

redis 集群是一个可以提供在多个redis节点间共享数据的程序集,redis 集群可以支持多个 master。

8.2 特性

  • redis 集群支持多个 master,每个 master 后可以挂载多个 slave,支持读写分离、高可用,支持海量数据的读写存储操作
  • redis 集群自带 sentinel 故障转移机制,无需再去使用哨兵功能
  • 客户端与 redis 的节点连接,不再需要连接集群中的所有节点,只需要任意连接集群中的一个可用节点即可
  • 槽位 slot 负责分配到各个物理服务节点,由对应的集群来维护各个槽位、节点、数据之间的关系 

8.3 槽位

redis 集群有16384个哈希槽。每个key通过CRC16校验后对16384取模来决定放置到哪个槽,集群中的每个节点负责一部分hash槽。

8.4 分片

使用 redis 集群存储数据时,我们会将数据分散到多台 redis 机器上,这就是分片。

8.5 哈希槽映射

  • 哈希取余分区

hash(key) % N个机器台数,取模的值决定将数据映射到哪个节点上。

优点:简单高效

缺点:扩容缩容时客户端到服务端的映射发生改变

  • 一致性哈希算法分区

一致性哈希算法在1997年由麻省理工学院中提出的,设计目标是为了解决分布式缓存数据变动和映射问题,某个机器宕机了,分母数量改变了,自然取余数不OK了。

①算法构建一致性哈希环:

②服务器节点映射

③Key 落到服务器的落键规则

优点:容错性、扩展性

缺点:数据倾斜问题

  • 哈希槽分区 

哈希槽实质就是一个数组,数组[0, 2^14 -1] 形成哈希槽空间。

哈希槽的作用:

解决数据均匀分配的问题,在数据和节点之间又加了一层,把这层称为哈希槽,用于管理数据和节点之间的关系。

一个集群只能有16384(2^14)个槽,对 key 取哈希值,然后对 16384 取模,余数是几,key就落到对应的槽里。因为槽的数量是固定的,所以移动数据比较容易。

为什么最大哈希槽数是16384?

①redis 每秒都要发送心跳包,如果槽位是2^16(65536),消息头达8k(65536/8/1024),过于庞大,浪费带宽

②redis 集群中主节点数量基本不可能超过1000个,16384个槽位基本够用了。

③槽位越小,节点少的情况下,压缩比高,容易传输

 8.6 搭建 redis 集群

  •  开启集群功能
port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
  • 构建集群关系
redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 

127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 

--cluster-replicas 1

// 选项 --cluster-replicas 1 表示为每一个主服务器配一个从服务器
  • 查看集群信息
// 查看主从关系
info replication

// 查看某一个节点的集群信息
cluster info

// 查看集群节点关系
cluster nodes

redis 集群搭建实例待补充!

参考视频:尚硅谷Redis零基础到进阶,最强redis7教程,阳哥亲自带练(附redis面试题)_哔哩哔哩_bilibili

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2274134.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DAY15 神经网络的参数和变量

DAY15 神经网络的参数和变量 一、参数和变量 在神经网络中,参数和变量是两个关键概念,它们分别指代不同类型的数据和设置。 参数(Parameters) 定义:参数是指在训练过程中学习到的模型内部变量,这些变量…

[离线数仓] 总结二、Hive数仓分层开发

接 [离线数仓] 总结一、数据采集 5.8 数仓开发之ODS层 ODS层的设计要点如下: (1)ODS层的表结构设计依托于从业务系统同步过来的数据结构。 (2)ODS层要保存全部历史数据,故其压缩格式应选择压缩比率,较高的,此处选择gzip。 CompressedStorage - Apache Hive - Apac…

Chromium源码windows下载和编译

官方地址:chromium/docs/windows_build_instructions.md at main chromium/chromium GitHub Chromium介绍 Chromium 是一个开源浏览器项目,旨在为所有用户构建更安全、更快、更稳定的网络体验方式。掌握Chromium的编译和开发是浏览器项目相关的开发者…

maven如何从外部导包

1.找到你项目的文件位置,将外部要导入的包复制粘贴进你当前要导入的项目下。 2.从你的项目目录下选中要导入的包的pom文件即可导包成功 注意一定是选中对应的pom文件 导入成功之后对应的pom.xml文件就会被点亮

力扣 跳跃游戏

每次更新目标位置时,实际上是在做一个局部的最优选择,选择跳跃能够到达当前目标位置的最远位置。因为每次更新目标位置时,都是基于当前能跳跃到的最远位置,因此最终的结果是全局最优的。 题目 从前往后遍历,更新可以到…

第二十八周学习周报

目录 摘要Abstract1 GFPGAN1.1 总体结构1.2 实验研究1.3 代码分析 总结 摘要 本周主要的学习内容是GFPGAN模型。GFPGAN是一种基于生成对抗网络(GAN)的模型,其利用封装在预训练的人脸GAN中的丰富多样的先验进行人脸图像的修复。这种生成面部先验(GFP&…

成为LabVIEW自由开发者

成为LabVIEW自由开发者的体验可以非常丰富且具有挑战性,同时也充满了自我成长和多样化项目的机会。 ​ 1. 高度的灵活性与自由度 工作时间与地点:作为自由开发者,你可以自由选择工作时间和地点。你可以在家工作,也可以选择在咖啡…

Electron快速入门——跨平台桌面端应用开发框架

个人简介 👀个人主页: 前端杂货铺 🙋‍♂️学习方向: 主攻前端方向,正逐渐往全干发展 📃个人状态: 研发工程师,现效力于中国工业软件事业 🚀人生格言: 积跬步…

SpringBoot之核心配置

学习目标: 1.熟悉Spring Boot全局配置文件的使用 2.掌握Spring Boot配置文件属性值注入 3.熟悉Spring Boot自定义配置 4.掌握Profile多环境配置 5.了解随机值设置以及参数间引用 1.全局配置文件 Spring Boot使用 application.properties 或者application.yaml 的文…

openai swarm agent框架源码详解及应用案例实战

文章目录 简介数据类型Agent类Response类Result类Swarm类run_demo_loop交互式会话 基础应用agent-handsofffunction-callingcontext_variablestriage_agent 高阶应用通用客服机器人(support bot)构建航班服务agent 参考资料 openai 在24年10月份开源了一个教育性质的多agents协…

JVM vs JDK vs JRE

JVM是Java虚拟机的缩写, 用于实现Java的一次编译,处处运行。 Java代码写成.class后,由本地的虚拟机运行。 JDK(Java Development Kit)是一个功能齐全的 Java 开发工具包,供开发者使用。 JDK包含了JRE。…

【网页自动化】篡改猴入门教程

安装篡改猴 打开浏览器扩展商店(Edge、Chrome、Firefox 等)。搜索 Tampermonkey 并安装。 如图安装后,浏览器右上角会显示一个带有猴子图标的按钮。 创建用户脚本 已进入篡改猴管理面板点击创建 脚本注释说明 name:脚本名称。…

微信小程序用的SSL证书有什么要求吗?

微信小程序主要建立在手机端使用,然而手机又涉及到各种系统及版本,所以对SSL证书也有要求,如果要小程序可以安全有效的访问需要满足以下要求: 1、原厂SSL证书(原厂封)。 2、DV单域名或者DV通配符。 3、兼…

【电子通识】PWM驱动让有刷直流电机恒流工作

电机的典型驱动方法包括电压驱动、电流驱动以及PWM驱动。本文将介绍采用PWM驱动方式的恒流工作。 首先介绍的是什么是PWM驱动的电机恒流工作,其次是PWM驱动电机恒流工作时电路的工作原理。 PWM驱动 当以恒定的电流驱动电机时,电机会怎样工作呢&#xff1…

Unity学习之UGUI进阶

一、事件监听接口 1、作用 用于实现类型长按、双击、拖拽等基础控件无法实现的功能 所有控件都能够添加更多的事件监听来处理对应的逻辑 2、事件监听接口类型 (1)常用事件接口 (2)不常用事件接口 3、使用事件监听接口 &#…

电脑硬盘系统迁移及问题处理

一、系统迁移准备 1、确认你的电脑主板是否支持安装两块硬盘,如电脑主板有多个M2硬盘接口,我们将新硬盘安装到主板上,原来的老硬盘安装在第二个接口上,主板只有一个M2接口的话可以使用移动硬盘盒。 2、新硬盘安装好后,我们进入原来的系统,在 此电脑–右键–管理–磁盘管…

【NLP高频面题 - Transformer篇】Transformer的输入中为什么要添加位置编码?

Transformer的输入中为什么要添加位置编码? 重要性:★★★ Transformer 将句子中的所有词并行地输入到神经网络中。并行输入有助于缩短训练时间,同时有利于学习长期依赖。不过,并行地将词送入 Transformer,却不保留词…

http range 下载大文件分片

摘自:https://www.jianshu.com/p/32c16103715a 上传分片下载也能分 HTTP 协议范围请求允许服务器只发送 HTTP 消息的一部分到客户端。范围请求在传送大的媒体文件,或者与文件下载的断点续传功能搭配使用时非常有用。 检测服务器端是否支持范围请求 假…

Improving Language Understanding by Generative Pre-Training GPT-1详细讲解

Improving Language Understanding by Generative Pre-Training 2018.06 GPT-1 0.有监督、半监督、无监督 CV:ImageNet pre-trained model NLP:pre-trained model? 在计算机视觉中任务包含分类、检测、分割,任务类别数少,对应…

onLoad 生命周期函数是否执行取决于跳转的方式和小程序的页面栈管理机制

文章目录 1. 页面跳转方式2. 你的场景分析3. 页面生命周期4. 总结5. 建议 在微信小程序中,页面跳转时, onLoad 生命周期函数是否执行取决于跳转的方式和小程序的页面栈管理机制。以下是详细说明: 1. 页面跳转方式 微信小程序提供了多种页面…