1. 任意方法安装Redis

apt install redis -y


2. redis的配置文件在哪里?默认端口是多少

默认端口: Redis 的默认端口是 6379。

配置文件:通过 Linux 包管理器(如 apt 或 yum)安装,通常位于 /etc/redis/redis.conf。


3. redis主要功能是什么?与MySQL有什么不同

Redis(Remote Dictionary Server) 是一个开源的 内存型键值数据库(In-memory Key-Value Store),它支持多种数据结构,并提供了丰富的功能,主要用于 缓存、消息队列、会话管理、分布式锁 等场景。

Redis 的主要功能

功能

描述

高速缓存(Caching)

利用内存读写速度快的特点,缓存热点数据,提升系统响应速度

持久化(Persistence)

支持 RDB(快照)和 AOF(追加日志)两种方式将数据持久化到磁盘

数据结构丰富

支持 String、Hash、List、Set、Sorted Set、Bitmap、HyperLogLog、Stream 等数据结构

分布式锁(Distributed Lock)

利用 SETNX、Lua 脚本等实现跨服务的分布式锁机制

发布/订阅(Pub/Sub)

实现消息队列功能,支持一对多的消息广播

事务支持(Transactions)

支持原子性操作(通过 MULTI / EXEC

Lua 脚本执行

可以在服务端运行 Lua 脚本,实现复杂逻辑

集群支持(Redis Cluster)

支持横向扩展,实现数据分片和高可用

过期机制(TTL)

可以为键设置过期时间,常用于缓存清理

Redis 与 MySQL 的主要区别

对比维度

Redis

MySQL

类型

内存型键值数据库

磁盘型关系型数据库

存储方式

数据主要存储在内存中(可持久化)

数据存储在磁盘(支持内存缓存)

数据结构

键值对,支持多种结构(String、Hash、List 等)

表结构,支持 SQL 查询

性能

极快(微秒级响应)

相对较慢(毫秒级响应)

持久化

支持(RDB/AOF),但非默认

默认持久化

使用场景

缓存、消息队列、计数器、会话存储等

业务数据存储、事务处理、复杂查询

是否支持事务

支持简单事务(原子性操作)

支持完整的 ACID 事务

是否支持索引

不支持传统索引

支持索引

是否支持复杂查询

不支持 SQL 查询

支持 SQL 查询

扩展性

易于横向扩展(Redis Cluster)

扩展性较差,需借助中间件(如 MyCat)

一致性

弱一致性(缓存)

强一致性(支持事务)

部署方式

单机、主从、哨兵、Cluster

单机、主从、MHA、PXC、分库分表


4. 尝试set一些数据,并使用get验证

1. 启动 Redis 客户端

打开终端或命令行工具,输入以下命令以连接到本地 Redis 服务器:

redis-cli

如果 Redis 服务器运行在远程主机上,可以指定主机和端口:

redis-cli -h <host> -p <port>

2. 设置数据 (SET)

在 Redis 命令行中,使用 SET 命令存储键值对。例如:

127.0.0.1:6379> SET name Alice
OK

3. 获取数据 (GET)

使用 GET 命令获取之前存储的键值对。例如:

127.0.0.1:6379> GET name
"Alice"

4. 退出 Redis 命令行

完成操作后,可以通过以下命令退出 Redis 命令行:

127.0.0.1:6379> exit


5. redis的数据保存在哪里

Redis 是一个内存数据库,数据主要存储在内存中。不过 Redis 提供了持久化功能,可以将数据保存到磁盘上,确保在服务重启或意外关闭后数据不会丢失。


6. redis持久化是什么意思,有哪几种方式,各有什么优缺点,如何配置

1. Redis 数据存储的两种方式

Redis 支持两种主要的持久化机制:

(1) RDB(Redis Database Backup)

  • RDB 是 Redis 的默认持久化机制。

  • 它会在指定的时间间隔内将内存中的数据快照写入磁盘,生成一个 dump.rdb 文件。

  • 优点:文件紧凑、恢复速度快。

  • 缺点:可能会丢失最后一次快照之后的数据。

配置项(在 redis.conf 文件中)

save 900 1   # 表示在 900 秒内,至少有 1 个键被修改时触发 RDB 快照
save 300 10  # 在 300 秒内,至少有 10 个键被修改时触发
save 60 10000 # 在 60 秒内,至少有 10000 个键被修改时触发

RDB 文件路径和名称

dir ./
dbfilename dump.rdb

(2) AOF(Append Only File)

  • AOF 持久化机制会记录所有写操作命令,并以追加的方式写入日志文件。

  • 优点:数据安全性更高,支持多种同步策略。

  • 缺点:文件体积较大,恢复速度较慢。

启用 AOF(在 redis.conf 中设置)

appendonly yes
appendfilename "appendonly.aof"

AOF 同步策略(appendfsync

  • always:每次写操作都同步到磁盘(最安全,性能最低)

  • everysec:每秒同步一次(推荐,平衡安全性和性能)

  • no:由操作系统决定何时同步(最快,但可能丢失较多数据)

2. 如何查看 Redis 数据存储的位置

你可以通过以下命令查看 Redis 的持久化配置和文件路径:

查看当前 Redis 配置

127.0.0.1:6379> CONFIG GET dir
127.0.0.1:6379> CONFIG GET dbfilename
127.0.0.1:6379> CONFIG GET appendfilename


3. Redis 数据文件的实际位置

假设你的 Redis 配置如下:

dir /var/lib/redis
dbfilename dump.rdb
appendfilename appendonly.aof

那么 Redis 的数据文件通常会保存在 /var/lib/redis 目录下:

  • dump.rdb:RDB 快照文件

  • appendonly.aof:AOF 日志文件

4. 总结

  • 默认情况下,Redis 数据保存在内存中,但可以通过 RDB 或 AOF 持久化到磁盘。

  • RDB 文件:用于全量备份,默认名为 dump.rdb

  • AOF 文件:用于记录所有写操作,默认名为 appendonly.aof

  • 数据文件路径:可以在 redis.conf 配置文件中通过 dir 参数指定。


7. 什么是redis的缓存雪崩、穿透和击穿

1. 缓存雪崩(Cache Avalanche)

定义:

当某一时刻,大量缓存同时失效或 Redis 服务宕机重启,所有请求都会落到数据库上,可能会导致数据库瞬间压力过大甚至崩溃。

2. 缓存穿透(Cache Penetration)

定义:

查询一个既不在缓存也不在数据库中的数据(如非法 ID),每次请求都会穿透到数据库,恶意攻击者可能利用此进行攻击。

3. 缓存击穿(Cache Breakdown)

定义:

某个热点 key 突然失效,大量并发请求直接打到数据库,可能导致数据库负载过高。


8. 搭建redis的主从复制

一、环境准备

假设你有三台服务器(或本机多实例)用于搭建 Redis 主从架构:

角色

IP 地址

端口

主节点

192.168.1.100

6379

从节点1

192.168.1.101

6379

从节点2

192.168.1.102

6379


二、配置主节点(Master)

1. 修改 redis.conf

编辑主节点的 Redis 配置文件(通常在 /etc/redis/redis.conf 或你安装的目录下):

bind 0.0.0.0         # 允许所有 IP 连接
port 6379
daemonize yes        # 启动为守护进程
requirepass yourpassword  # 可选:设置密码(建议)

2. 启动 Redis 主节点

redis-server /path/to/redis.conf

三、配置从节点(Slave)

1. 修改从节点的 redis.conf

bind 0.0.0.0
port 6379
daemonize yes
slaveof 192.168.1.100 6379  # 指定主节点的 IP 和端口
masterauth yourpassword    # 如果主节点设置了密码,必须配置
requirepass yourpassword   # 可选:设置从节点密码

说明slaveof 是配置从节点的关键指令,表示该节点从哪个主节点同步数据。

2. 启动 Redis 从节点

redis-server /path/to/redis.conf

四、验证主从复制是否生效

1. 在主节点设置数据

redis-cli -h 192.168.1.100
192.168.1.100:6379> SET name "Redis Master"

2. 在从节点读取数据

redis-cli -h 192.168.1.101
192.168.1.101:6379> GET name
"Redis Master"

🧪 五、查看主从状态

在任意节点执行以下命令,查看主从关系:

redis-cli info replication


9. 搭建Redis的哨兵,并尝试进行主节点的切换

一、环境准备

我们以三台服务器为例,构建一个简单的 Redis 主从 + Sentinel 架构:

节点类型

IP 地址

端口

Redis 主节点

192.168.1.100

6379

Redis 从节点1

192.168.1.101

6379

Redis 从节点2

192.168.1.102

6379

Sentinel1

192.168.1.100

26379

Sentinel2

192.168.1.101

26379

Sentinel3

192.168.1.102

26379

说明:每个 Redis 实例都搭配一个 Sentinel 进程,也可以单独部署 Sentinel。

二、配置 Redis 主从复制(已完成可跳过)

确保 Redis 主从已经配置好,参考上一条关于“主从复制”的配置方法。

三、配置 Redis Sentinel

1. 创建 sentinel.conf 文件

在每台机器上创建 Sentinel 的配置文件,通常放在 /etc/redis/sentinel.conf 或你自定义的位置。

示例配置内容:

port 26379
dir /tmp
sentinel monitor mymaster 192.168.1.100 6379 2
sentinel auth-pass mymaster yourpassword
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 10000
sentinel parallel-syncs mymaster 1

参数说明:

  • sentinel monitor mymaster <ip> <port> <quorum>

    • mymaster 是主节点的逻辑名称。

    • <quorum> 表示至少有几个 Sentinel 认为该主节点下线才会触发故障转移(一般设置为 Sentinel 总数的一半加一)。

  • sentinel auth-pass:如果主节点设置了密码,必须配置。

  • down-after-milliseconds:超过多少毫秒未响应视为节点宕机。

  • failover-timeout:故障转移超时时间。

  • parallel-syncs:故障转移后同时同步从节点的数量。

四、启动 Sentinel

使用以下命令启动 Sentinel(假设配置文件路径为 /etc/redis/sentinel.conf):

redis-sentinel /etc/redis/sentinel.conf

五、验证 Sentinel 是否正常工作

1. 查看 Sentinel 状态

连接到任意 Sentinel 节点:

redis-cli -p 26379
127.0.0.1:26379> sentinel masters


10. 搭建Redis的集群模式并与主从模式和哨兵模式进行对比,各有什么优点

Redis 提供了三种常见的部署模式:单机模式、主从复制模式、哨兵模式(Sentinel) 和 集群模式(Cluster)。每种模式适用于不同的业务场景和高可用性需求。下面我们来搭建 Redis 集群模式,并对主从模式、哨兵模式和集群模式进行对比分析。

特性/模式

主从复制(Replication)

哨兵模式(Sentinel)

集群模式(Cluster)

数据分片

不支持

不支持

支持

故障转移

不支持

支持

支持

高可用

不支持

支持

支持

读写分离

支持

支持

支持

节点通信

不支持

不支持

自动通信

架构复杂度

简单

中等

复杂

扩展性

固定

固定

支持横向扩展

适合场景

读写分离、备份

高可用、自动故障转移

大规模分布式系统

模式

适用场景描述

主从复制

简单读写分离、数据备份、缓存加速,适合中小规模系统。

哨兵模式

对高可用有要求的系统,需要自动故障转移,但不涉及大规模数据分片。

集群模式

需要高可用、自动故障转移、数据分片、横向扩展的大型分布式系统。


11. Redis集群的槽位是干啥的

Redis 集群中的 槽位(Hash Slot) 是实现数据分片(Sharding)的核心机制。Redis Cluster 将整个数据集划分为 16384 个哈希槽(slots),每个键通过 CRC16 算法计算出一个哈希值,再对 16384 取模,最终映射到一个具体的槽位上。


1. 数据分片

  • Redis Cluster 使用槽位将数据分布到多个节点上。

  • 每个主节点负责一部分槽位(例如:Node A 负责 05500,Node B 负责 550111000,Node C 负责 11001~16383)。

  • 这样可以实现横向扩展,提升整体性能和容量。

2. 实现去中心化架构

  • 所有节点都知道所有槽位的归属信息,无需依赖中心节点(如 ZooKeeper 或 Redis Proxy)。

  • 节点之间通过 Gossip 协议交换集群状态信息。

3. 支持动态扩容/缩容

  • 当新增或移除节点时,Redis Cluster 可以在不停机的情况下重新分配槽位。

  • 槽位迁移过程中,客户端请求会被自动重定向。


12. Redis的集群模式最大分片数是多少,为什么是这个数字

Redis 集群模式的最大分片数是 16384 个哈希槽(Hash Slots)


一、最大分片数是多少?

Redis Cluster 将整个键空间划分为 16384 个哈希槽(编号从 0 到 16383),这是 Redis 官方硬编码设定的值,不可更改。

每个 key 通过以下方式决定它属于哪个槽:

slot = CRC16(key) % 16384

二、为什么选择 16384 这个数字?

这个数值的选择并非随意,而是基于以下几个关键因素的权衡:

1. 节点通信开销控制

  • Redis Cluster 使用 Gossip 协议在节点之间交换信息。

  • 每个节点需要广播自己负责的槽位范围。

  • 如果槽位数量太多(比如 65536),会显著增加通信开销和内存占用。

16384 是一个足够小的数字,可以将每个节点的槽位信息压缩到一个 MTU(Maximum Transmission Unit)范围内,从而减少网络传输负担。


2. 支持合理的集群规模

  • 假设每个主节点平均管理 1000 个槽位,则 16384 可以支持大约 16 个主节点。

  • 对于大多数实际应用场景来说,这已经足够满足需求。

  • 如果你真的需要更多节点,可以通过客户端分片(Client-side Sharding)实现更大规模部署。


3. 平衡数据分布与性能

  • 如果槽位太少(如 1024),会导致数据分布不均,某些节点负载过高。

  • 如果槽位太多(如 65536),虽然能提高均匀性,但增加了维护成本和网络开销。

  • 16384 是一个折中方案,既能保证较好的数据分布,又不会造成太大的额外开销。


4. 内存效率优化

  • 每个节点使用一个位图(bitmap)来记录哪些槽属于自己。

  • 16384 个槽只需要 2KB 的内存空间(16384 bits = 2048 bytes)。

  • 如果是 65536 个槽,则需要 8KB,虽然不多,但在大规模集群中会累积。


13. 如何进行Redis集群的备份和还原,有哪些注意事项

Redis 集群的备份与还原是保障数据安全的重要操作。虽然 Redis Cluster 是分布式系统,但其备份和还原策略与单机模式类似,主要依赖于 RDB(Redis Database Backup)持久化机制


一、Redis 集群的备份方式

1. 使用 RDB 快照进行备份(推荐)

每个 Redis 节点都可以配置 RDB 持久化,定期将内存数据快照写入磁盘文件 dump.rdb

步骤:

确保所有节点启用了 RDB 持久化

在每个节点的 redis.conf 中配置:

save 900 1      # 每 15 分钟至少修改 1 个 key 时触发保存
save 300 10     # 每 5 分钟至少修改 10 个 key 时触发
save 60 10000   # 每 1 分钟至少修改 10000 个 key 时触发
dir /var/lib/redis
dbfilename dump.rdb

手动执行 SAVEBGSAVE 命令(可选)

连接到任意主节点执行:

redis-cli -c -p 6380
127.0.0.1:6380> BGSAVE

注意:BGSAVE 是异步的,不会阻塞 Redis 主进程。

复制所有节点的 dump.rdb 文件到安全位置

你需要在每个节点上执行:

cp /var/lib/redis/dump.rdb /backup/redis_node1.rdb

二、Redis 集群的还原方式

1. 单节点还原(适用于局部恢复)

步骤:

停止目标节点服务

redis-cli -p 6380 shutdown

替换 dump.rdb 文件

cp /backup/redis_node1.rdb /var/lib/redis/dump.rdb

启动 Redis 节点

redis-server /path/to/redis.conf

加入集群

redis-cli --cluster add-node 192.168.1.100:6380 192.168.1.100:6380

2. 全量恢复整个集群(需全部节点参与)

步骤:

停止所有 Redis 节点

redis-cli -p 6380 shutdown

恢复所有节点的 dump.rdb 文件

cp /backup/redis_node1.rdb /var/lib/redis/dump.rdb
cp /backup/redis_node2.rdb /var/lib/redis/dump.rdb
...

重启所有节点

redis-server /path/to/redis.conf

重新构建集群(如果元数据丢失)

redis-cli --cluster create \
192.168.1.100:6380 \
192.168.1.101:6380 \
192.168.1.102:6380 \
192.168.1.100:6381 \
192.168.1.101:6381 \
192.168.1.102:6381 \
--cluster-replicas 1


14. redis如何禁用命令,要禁用哪些命令。

在 Redis 中,为了提高系统的安全性和稳定性,可以通过配置文件禁用一些高风险或不常用的命令。禁用命令是通过 redis.conf 文件中的 rename-command 指令实现的。


一、Redis 禁用命令的方法

1. 修改 redis.conf 文件

使用 rename-command 指令将命令重命名为一个空字符串(即禁用):

rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command CONFIG ""
rename-command KEYS ""
rename-command PUBLISH ""
rename-command SUBSCRIBE ""
rename-command EVAL ""
rename-command DEBUG ""
rename-command SHUTDOWN ""
rename-command MONITOR ""

2. 启用配置并重启 Redis

保存配置后,重启 Redis 服务使配置生效:

redis-cli shutdown
redis-server /path/to/redis.conf


以下是一些建议禁用或重命名的命令,按风险等级排序:

命令

风险等级

说明

FLUSHALL

清空整个 Redis 实例的所有数据库,可能导致数据丢失。

FLUSHDB

清空当前数据库,可能误操作导致数据丢失。

CONFIG

可修改 Redis 配置,如持久化路径、密码等。

KEYS *

获取所有 key,可能导致性能问题或信息泄露。

EVAL

执行 Lua 脚本,可能被用于执行任意命令。

DEBUG

可能暴露 Redis 内部状态或执行危险操作。

PUBLISH / SUBSCRIBE

如果未使用 Redis 的发布/订阅功能,可以禁用。

MONITOR

实时监控所有 Redis 命令,可能影响性能并泄露敏感信息。

SHUTDOWN

关闭 Redis 服务,可能导致服务中断。


15. keys *的作用是什么,线上环境可以使用吗?应该使用什么命令代替

EYS * 的作用

KEYS * 是 Redis 中一个非常强大的命令,用于列出当前数据库中所有键(keys)

语法:

KEYS pattern
  • pattern 是匹配规则,支持通配符:

    • *:匹配任意数量的字符(如 KEYS user:*)。

    • ?:匹配单个字符。

    • []:匹配括号中的任意一个字符。

线上环境可以使用 KEYS * 吗?

不推荐在生产环境使用 KEYS *,原因如下:

问题

说明

性能问题

Redis 是单线程处理命令的,当数据量大时(如百万级 key),KEYS * 会阻塞 Redis 主线程,导致服务不可用。

内存压力

返回大量 key 可能导致内存暴增,甚至触发 OOM(Out of Memory)。

安全风险

可能暴露所有键名,带来信息泄露风险。


替代方案:使用 SCAN 命令

Redis 提供了 SCAN 命令作为 KEYS 的安全替代方案。

SCAN 的特点:

  • 非阻塞:不会一次性扫描所有 key,而是分批次返回。

  • 可中断:客户端可以随时停止扫描。

  • 支持匹配模式:如 SCAN 0 MATCH user:* COUNT 100

127.0.0.1:6379> SCAN 0 MATCH * COUNT 10
1) "17"  # 下一个游标值
2) 1) "user:1000"
   2) "session:abc123"
   3) "counter"
   ...
  • 0 是游标起始值。

  • COUNT 表示每次返回的 key 数量(只是一个建议值)。

  • 当游标返回 0 时,表示扫描完成。

以他人的幸福为幸福,以他人的享乐为享乐。