【部署篇】Redis-01介绍‌

一、Redis介绍‌

1、什么是Redis?

‌Redis,英文全称是Remote Dictionary Server (远程字典服务),**Redis是一个开源的、使用‌ANSI C语言编写的‌Key-Value存储系统,支持网络、可基于内存亦可持久化。**‌ 它提供了多种数据结构和API,适用于缓存、NoSQL数据库等多种场景。Redis具有高性能、多种数据结构、持久化、高可用性等特点,广泛应用于互联网和大数据领域。

2、Redis的主要特性

  • 速度快‌:数据存储在内存中,可达到10万OPS。
  • 可持久化‌:所有数据保存在内存中,对数据的更新异步地保存在硬盘中。
  • 多种数据结构 ‌:包括String(字符串)、Hash(哈希)、List(列表)、Set(集合)、zset(有序集合)、Bitmap(位图)、HyperLogLog( 基数统计*)*、GEO(地理位置信息)等。
  • 多语言支持 ‌:支持‌JAVA、‌PHP、‌RUBY、‌Python等多种语言的API。
  • 功能丰富‌:包括发布订阅、Lua脚本、事务等。
  • 简单‌:源码只有23000行代码,不依赖外部库,单线程。
  • 可复制和高可用‌:支持主从同步,提供高可用性和分布式部署。

3、Redis的应用场景

  • 缓存‌:Redis常用于缓存数据库查询结果,减少数据库负载。
  • 实时数据分析‌:利用Redis的快速读写能力进行实时数据分析。
  • 消息队列‌:使用Redis的发布/订阅功能实现消息队列。
  • 会话管理‌:在Web应用中管理用户会话。
  • 排行榜‌:利用有序集合实现排行榜功能。

4、Redis的优势

  • 高性能‌:Redis以其高速读写能力在处理大量数据时表现出色。
  • 灵活性‌:支持多种数据结构和操作,适用于多种应用场景。
  • 可靠性‌:通过持久化和主从同步保证数据的安全和可靠性。
  • 易用性‌:提供多种语言的API和简单的源码,易于集成和使用。

二、部署模式

1、单机部署

1)缺点
  • 单点故障,服务不可用
  • 无法处理大量的并发数据
  • 数据无容灾易丢失
  • Redis默认单进程

2、主从模式部署

1)介绍

主从模式是三种模式中最简单的,在主从复制中,数据库分为两类:主数据库(master)和从数据库(slave)。

2)特点

主数据库可以进行读写操作,当读写操作导致数据变化时会自动将数据同步给从数据库; - 从数据库一般是只读的,并且接收主数据库同步过来的数据; - 一个master可以拥有多个slave,但是一个slave只能对应一个master; - slave挂了不影响其他slave的读和master的读和写,重新启动后会将数据从master同步过来; - master挂了以后,不影响slave的读,但redis不再提供写服务,master重启后redis将重新对外提供写服务; - master挂了以后,不会在slave节点中重新选一个master;

3)工作机制

当slave启动后,主动向master发送SYNC命令。master接收到SYNC命令后在后台保存快照(RDB持久化)和缓存保存快照这段时间的命令,然后将保存的快照文件和缓存的命令发送给slave。slave接收到快照文件和命令后加载快照文件和缓存的执行命令。 - 复制初始化后,master每次接收到的写命令都会同步发送给slave,保证主从数据一致性。

4)环境说明

至少3个节点。

3、Sentinel(哨兵)模式

1)简介

主从模式的弊端就是不具备高可用性,当master挂掉以后,Redis将不能再对外提供写入操作,因此sentinel模式应运而生。sentinel中文含义为哨兵,顾名思义,它的作用就是监控redis集群的运行状况

2)特点

sentinel模式是建立在主从模式的基础上,如果只有一个Redis节点,sentinel就没有任何意义;

当master挂了以后,sentinel会在slave中选择一个做为master,并修改它们的配置文件,其他slave的配置文件也会被修改,比如slaveof属性会指向新的master;

当master重新启动后,它将不再是master,而是做为slave接收新的master的同步数据;

sentinel因为也是一个进程,所以有挂掉的可能,所以sentinel也会启动多个形成一个sentinel集群;

多sentinel配置的时候,sentinel之间也会自动监控;

当主从模式配置密码时,sentinel也会同步将配置信息修改到配置文件中;

一个sentinel或sentinel集群可以管理多个主从Redis,多个sentinel也可以监控同一个redis;

sentinel最好不要和Redis部署在同一台机器,不然Redis的服务器挂了以后,sentinel也可能会挂掉。

3)原理图

4)工作流程

每个sentinel以每秒钟一次的频率向它所知的master,slave以及其他sentinel实例发送一个 PING 命令; - 如果一个实例距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 选项所指定的值, 则这个实例会被sentinel标记为主观下线; - 如果一个master被标记为主观下线,则正在监视这个master的所有sentinel要以每秒一次的频率确认master的确进入了主观下线状态; - 当有足够数量的sentinel(大于等于配置文件指定的值)在指定的时间范围内确认master的确进入了主观下线状态, 则master会被标记为客观下线; - 在一般情况下, 每个sentinel会以每 10 秒一次的频率向它已知的所有master,slave发送 INFO 命令; - 当master被sentinel标记为客观下线时,sentinel向下线的master的所有slave发送 INFO 命令的频率会从 10 秒一次改为 1 秒一次; - 若没有足够数量的sentinel同意master已经下线,master的客观下线状态就会被移除;若master重新向sentinel的 PING 命令返回有效回复,master的主观下线状态就会被移除。

5)环境说明

sentinel 最好跟redis部署在不同的机器上,建议至少各三个节点。

6)缺点

(1)复杂性高:Redis哨兵的部署和维护相对比较复杂,一个Redis集群通常需要至少三个哨兵节点才能正常工作,因为Redis的failover机制是基于哨兵之间的投票机制来实现的。每个哨兵节点都需要配置哨兵的角色和监控条件,这个过程需要耗费一定的时间和精力,并且在集群节点变化时还需要手动修改哨兵配置文件。除此之外,Redis哨兵还需要安装和配置多个Redis节点,每个节点都需要开放相应的端口才能完成数据通信,这也增加了配置的复杂性。

(2)可用性不稳定:Redis哨兵的故障恢复速度相对较慢,当一个主节点发生故障时,哨兵可能需要等待一段时间才能检测到,然后再进行自动故障转移,这个过程可能需要数秒到数十秒不等,导致业务中断的时间比较长。此外,当一个次级节点在进行故障切换时,还需要采取复杂的投票机制来确保数据的一致性,这也会导致故障转移的速度比较慢,对业务的影响比较大。

(3)性能损失:Redis哨兵本身也会对Redis集群的性能造成一定的影响,因为每个哨兵节点需要定期向Redis节点发送心跳包进行状态检测,这会占用部分系统资源。此外,Redis哨兵的自动故障转移也需要消耗相应的网络带宽和计算资源,会降低Redis的整体性能。

4、Cluster(集群)模式

1)简介

Redis 的哨兵模式基本已经可以实现高可用,读写分离 ,但是在这种模式下每台 Redis 服务器都存储相同的数据,很浪费内存,所以在 redis3.0上加入了 Cluster 集群模式,实现了 Redis 的分布式存储,也就是说每台 Redis 节点上存储不同的内容。

2)特点

sentinel模式基本可以满足一般生产的需求,具备高可用性。但是当数据量过大到一台服务器存放不下的情况时,主从模式或sentinel模式就不能满足需求了,这个时候需要对存储的数据进行分片,将数据存储到多个Redis实例中。cluster模式的出现就是为了解决单机Redis容量有限的问题,将Redis的数据根据一定的规则分配到多台机器。

cluster可以说是sentinel+主从模式的结合体,通过cluster可以实现主从和master重选功能,所以如果配置两个副本三个分片的话,就需要六个Redis实例。因为Redis的数据是根据一定规则分配到cluster的不同机器的,当数据量过大时,可以新增机器进行扩容。

使用集群,只需要将redis配置文件中的cluster-enable配置打开即可,每个集群中至少需要三个主数据库才能正常运行,新增节点非常方便。

3)原理图

可以看到,Cluster 集群模式有如下一些特点: - 多个redis节点网络互联,数据共享; - 所有的节点都是一主一从(也可以是一主多从),其中从不提供服务,仅作为备用; - 不支持同时处理多个key(如MSET/MGET),因为redis需要把key均匀分布在各个节点上,并发量很高的情况下同时创建key-value会降低性能并导致不可预测的行为; - 支持在线增加、删除节点; - 客户端可以连接任何一个主节点进行读写。

4)环境说明

至少三台机器,然后分别开启三个redis服务,即每个节点都要是一主两从模式。

三、核心参数

生产环境daemonize改为yes,不然我每次启动都得在redis-server命令后面加符号&,否则只要回到Linux控制台则redis服务会自动关闭,同时也将bind注释,将protected-mode设置为no。这样启动后我就可以在远程访问了。

配置项名称 配置项值范围 说明
daemonize yes、no yes表示启用守护进程,默认是no即不以守护进程方式运行。其中Windows系统下不支持启用守护进程方式运行
port 指定 Redis 监听端口,默认端口为 6379
bind 绑定的主机地址,如果需要设置远程访问则直接将这个属性备注下或者改为bind * 即可,这个属性和下面的protected-mode控制了是否可以远程访问 。
protected-mode yes 、no 保护模式,该模式控制外部网是否可以连接redis服务,默认是yes,所以默认我们外网是无法访问的,如需外网连接rendis服务则需要将此属性改为no
timeout 300 当客户端闲置多长时间后关闭连接,如果指定为 0,表示关闭该功能
loglevel debug、verbose、notice、warning 日志级别,默认为 notice
databases 16 设置数据库的数量,默认的数据库是0。整个通过客户端工具可以看得到
rdbcompression yes、no 指定存储至本地数据库时是否压缩数据,默认为 yes,Redis 采用 LZF 压缩,如果为了节省 CPU 时间,可以关闭该选项,但会导致数据库文件变的巨大。
dbfilename 指定本地数据库文件名,默认值为 dump.rdb
dir 指定本地数据库存放目录
requirepass 设置 Redis 连接密码,如果配置了连接密码,客户端在连接 Redis 时需要通过 AUTH <password> 命令提供密码,默认关闭
maxclients 0 设置同一时间最大客户端连接数,默认无限制,Redis 可以同时打开的客户端连接数为 Redis 进程可以打开的最大文件描述符数,如果设置 maxclients 0,表示不作限制。当客户端连接数到达限制时,Redis 会关闭新的连接并向客户端返回 max number of clients reached 错误信息
maxmemory XXX <bytes> 指定 Redis 最大内存限制,Redis 在启动时会把数据加载到内存中,达到最大内存后,Redis 会先尝试清除已到期或即将到期的 Key,当此方法处理 后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis 新的 vm 机制,会把 Key 存放内存,Value
save save 900 1 save 300 10 save 60 10000 save是用来控制Redis进行数据保存的频率,以下是配置示例说明: * 如果在900秒以内有1个key被改动,则进行数据保存。 * 如果在300秒以内有10个key被改动,则进行数据保存。 * 如果在60秒以内有10000个key被改动,则进行数据保存。

四、可视化管理工具

RedisClient

是否收费:免费。

项目介绍:Java 编写的 Redis 连接客户端,功能丰富,并且是免费的。

支持平台:Windows。

项目地址GitHub - caoxinyu/RedisClient: Java Redis Client GUI Tool

RedisStudio

是否收费:免费。

项目介绍:一款 C++ 编写的 Redis 管理工具,比较老,好久没更新了。

支持平台:Windows。

项目地址GitHub - cinience/RedisStudio: RedisStudio Redis GUI client(tool) for windows

AnotherRedisDesktopManager

是否收费:免费。

项目介绍:一款基于 Node.js 开发的 Redis 桌面管理器,它的特点就是相对来说比较稳定,在数据量比较大的时候不会崩溃。

支持平台:Windows、macOS、Linux。

项目地址:github - qishibo/AnotherRedisDesktopManager

五、更多Redis文章跟篇

【部署篇】Redis-01介绍
【部署篇】Redis-02单机模式部署(源码方式安装)
【部署篇】Redis-03主从模式部署(源码方式安装)
【部署篇】Redis-04哨兵模式部署(源码方式安装)

相关推荐
cq_run37 分钟前
springboot3导出数据库数据到excel
java·数据库·excel
原机小子39 分钟前
Spring Boot助力中小型医院网站开发
数据库·spring boot·mysql
微刻时光1 小时前
影刀RPA实战:操作Mysql数据库
数据库·mysql·oracle·自动化·rpa·影刀·影刀rpa
leidata1 小时前
MySQL系列—14.锁
数据库·mysql
观测云1 小时前
PostgreSQL 可观测性最佳实践
数据库·postgresql
ShyTan2 小时前
Java工具类--OkHttp工具类
数据库·okhttp
abcnull2 小时前
更改mysql用户密码
数据库·mysql
etsuyou2 小时前
MySQL中localhost和127.0.0.1的区别
数据库·mysql·adb
点点滴滴的记录2 小时前
Redisson使用全解
redis
一只小小汤圆2 小时前
c# sring \\W1.235; 先判断是否包含\\W 如果包含 获取\\W和;之间的数
java·数据库·c#