跳转至

Redis简介

一. Redis简介

随着互联网+和大数据时代的来临,传统的关系型数据库已经不能满足中大型网站日益增长的访问量和数据量。这时候就需要一种能快速存取数据的组件来缓解数据库服务的I/O压力,解决系统性能上的瓶颈。

1. 数据库应用的发展历史

graph LR
    A[单数据库实例] --> B[缓存+数据库实例]
    B --> C[缓存+数据库实例+读写分离]
    C --> D[缓存+数据库实例+读写分离+分库分表]
    D --> E[NoSQL+主从集群+读写分离+分库分表]
阶段 解决的问题 出现的新问题
① 单数据库实例 小规模系统,数据量小,访问量低 读压力大、写压力大
② 加缓存 缓存读数据,缓解数据库读压力 写压力持续增大
③ 读写分离 主库写、从库读,分散读写压力 主库写入成为瓶颈
④ 分库分表 拆分数据到多个库/表,分散写入压力 关系型数据库自身局限(并发、实时性、非结构化数据)
⑤ NoSQL + 集群 解决高并发、高实时、非结构化数据的存取 —

2. 什么是redis

Redis是当前比较热门的NOSQL数据库系统之一,它是一个开源的使用C语言编写的键对值(key-value)数据库系统(区别于MySQL的二维表形式存储)

  • NoSql: Not Only Sql 泛指非关系型数据库。如:Redis/MongoDB/Hbase
  • 关系型数据库: Oracle/MySQL/SqlServer

①为rdbms②为nosql,很多是以json格式进行数据存储。(mongodb,redis)

①

rdbms

②

nosql

Redis和Memcache类似,但很大程度上补偿了Memcache的不足,但很大程度上不唱了MemCache的不足。Redis数据都是缓存在计算机内存中,不同的是,Memcache只能将数据缓存到内存中,无法定期自动写入硬盘。这就表示一旦断电或重启,内存清空,数据就会丢失。所以Memcache的应用场景适用于缓存无需持久化的数据。而Redis不同的是它会周期性把更新的数据写入磁盘或者把修改操作写入到追加的记录文件,实现数据的持久化。

3. Redis的特点

  • Redis支持数据的持久化,可以将内存的数据保存在从磁盘中。重启的时候可以再次加载使用。
  • Redis不仅仅支持简单的key-value类型的数据,同时还提供字符串(strings)、列表(list)、集合(sets)、有序集合(zsets)、散列(hash)等数据结构的存储。
  • Redis支持数据的备份,即master-slave模式的数据备份
  • 性能极高: Redis能读的速度是110000次/s,写的速度是81000次/s。
  • 原子性: Redis的所有操作都是原子性的,意思是要么执行成功要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包装起来。
  • 丰富的特性: Redis还支持pubilsh(发布)/subscribe(订阅),通知,key过期等待特性

4. Redis与memcache的区别

  • Redis与Memcahce都是将数据存放在内存中,都是内存数据库。不过memcache还可以用于缓存其他东西,例如图片视频等。
  • 数据结构: Memcache仅能支持简单的K-V形式,Redis不仅仅支持简单的K/V类型数据,同时还提供字符串(strings)、列表(list)、集合(sets)、有序集合(zsets)、散列(hash)等数据结构的存储。
  • 虚拟内存: Redis当物理内存用完时,可以将一些很久没用到的value交换到磁盘。Memcache当内存用完后,会根据LRU策略,计算最近没有使用过的数据,将其进行替换。
  • 过期策略: memcache在set时就指定,例如set key 1008,即永不过期。Redis可以通过例如expire设定,例如expire name 10
  • 分布式: Redis可以做一主多从。Memcached的分布式不是在服务器端实现的,而是在客户端应用中实现的。即通过内置算法指定目标数据的节点。如下图所示

mem

  • 存储数据安全: memchache挂掉后数据也会消失;redis可以定期保存到磁盘中(持久化)
  • 灾难恢复: memcache挂掉后数据不可恢复;redis数据丢失后可通过aof恢复
  • Redis 支持数据的备份,即master-slave 模式的数据备份。
  • Memcache 支持多线程,Redis 支持单线程,CPU 利用方面,Memcache 利用率更高。
  • 应用场景:Memcache 做缓存,适合多读少写,大数据量的情况(如人人网大量查询用户信息、好友信息、文章信息等),减轻数据库负载,提升性能。Redis适用于对读写效率要求都很高,数据处理业务复杂和对安全性要求较高的系统(如新浪微博的计数和微博发布部分系统,对数据安全性、读写要求都很高)。

5. 持久化的两种方式

由于Redis的数据都存放在内存中,如果没有配置持久化,redis重启后数据就全丢失了于是需要开启redis的持久化功能,将数据保存到磁盘上,当redis重启后可以从磁盘中恢复数据。redis 提供两种方式进行持久化:

一种是RDB 持久化,原理是将Reids 在内存中的数据定时dump 到磁盘上。性能高,但可能会引起一定程度的数据丢失。

另外一种是AOF(append only file)持久化,原理是将Reids 的操作日志以追加的方式写入文件,类似mysql 的binlog,记录每次更新的日志。

6. Redis 的应用场景

  • 缓存(热点数据的缓存)

热点数据(经常会被查询,但是不经常被修改或者删除的数据),由于redis 访问速度块、支持的数据类型比较丰富,首选是使用redis 缓存。 Select 数据库前查询redis,有的话使用redis 数据,放弃select 数据库,没有的话,select 数据库,然后将数据插入redisupdate 或者delete 数据前,查询redis 是否存在该数据,存在的话先删除redis中数据,然后再update 或者delete 数据库中的数据缓存现在几乎是所有中大型网站都在用的,合理的利用缓存不仅能够提升网站访问速度,还能大大降低数据库的压力。另外结合expire,我们可以设置过期时间然后再进行缓存更新操作。所以,现在Redis 用在缓存的场合非常多。

  • 排行榜

很多网站都有排行榜应用的,如京东的月度销量榜单、商品按时间的上新排行榜等。Redis 提供的有序集合数据类构能实现各种复杂的排行榜应用。

  • 计数器

什么是计数器,如电商网站商品的浏览量、视频网站视频的播放数等。为了保证数据实时效,每次浏览都得给+1,并发量高时如果每次都请求数据库操作无疑是种挑战和压力。Redis 提供的incr 命令来实现计数器功能,内存操作,性能非常好,非常适用于这些计数场景。

  • 消息系统

消息队列是大型网站必用中间件,如ActiveMQ、RabbitMQ、Kafka 等流行的消息队列中间件,主要用于业务解耦、流量削峰及异步处理实时性低的业务。Redis 提供了发布/订阅及阻塞队列功能,能实现一个简单的消息队列系统。另外,这个不能和专业的消息中间件相比。还有其他应用场景,就不一一介绍了。

7. Redis 部署方案

Ⅰ. redis单机模式

Redis单机模式采用单个Redis节点部署架构,没有备用节点实时同步数据。不提供数据持久化和备份策略,适用于数据可靠性要求不高的纯缓存业务场景。

单机

优点

架构简单,部署方便

高性价比:缓存使用时无需备用节点(但是离可用性可以用supervisor或crontab保证),当然为了满足业务的高可用性也可以牺牲一个备用节点,但同时只有一个实例对外提供服务。

缺点

不保证数据的可靠性

在缓存使用进程重启后数据丢失。即使有备用的节点解决高可用性,但是仍然不能解决缓存预热的问题,因此不适用于数据可靠性要求高的业务

高性能受限于单核CPU的处理能力(Redis时单线程机制),CPU为主要瓶颈。所以适合操作简单,排序、计算较少的场景。也可以考虑用memcache替代。

Ⅱ. Redis多副本(主从)

Redis 多副本,采用主从(replication)部署结构,相较于单副本而言最大的特点就是主从实例间数据实时同步,并且提供数据持久化和备份策略。主从实例部署在不同的物理服务器上,根据公司的基础环境配置,可以实现同时对外提供服务和读写分离策略。

主从

Ⅲ. Redis sentinel(哨兵模式)

a. 当用Redis 做Master-slave 的高可用方案时,假如master 宕机了,Redis 本身(包括它的很多客户端)没有实现自动进行主备切换,需要手动把一台从服务器切换为主服务器,这就需要人工干预,费事费力,还会造成一段时间内服务不可用。这不是一种推荐的方式,更多时候,我们优先考虑哨兵模式。

Redis Sentinel是社区版本推出的原生高可用解决方案,其部署架构主要包括两部分:Redis Sentinel 集群和Redis 数据集群。 而Redis-sentinel本身也是一个独立运行的进程,它能监控多个master-slave 集群,发现master 宕机后能进行切换。redis-Sentinel(哨兵模式)是Redis 官方推荐的高可用性(HA)解决方案。

sentinel是redis 高可用的解决方案,sentinel 系统可以监视一个或者多个redismaster 服务,以及这些master 服务的所有从服务;当某个master 服务下线时,自动将该master 下的某个从服务升级为master 服务替代已下线的master 服务继续处理请求。

sentinel可以让redis 实现主从复制,当一个集群中的master 失效之后,sentinel可以选举出一个新的master 用于自动接替master 的工作,集群中的其他redis 服务器自动指向新的master 同步数据。一般建议sentinel 采取奇数台(Redis Sentinel的节点数量要满足2n+1(n>=1)的奇数个,官方建议至少3 个),防止某一台sentinel无法连接到master 导致误切换。其结构如下:

哨兵

Sentinel 由一个或多个Sentinel 实例组成的Sentinel 系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器。

选出新的master 节点,redis sentinel 会选一个合适的slave 来升级为master,那么,如何选择一个合适的slave 呢?顺序如下:

1). 选择slave-priority 最高的slave 节点(默认是相同)。

2). 选择复制偏移量最大的节点。

3). 如果以上两个条件都不满足,选runId 最小的(启动最早的)。

b. Sentinel 的作用

  • 通过发送命令,让Redis 服务器返回监控其运行状态,包括主服务器和从服务器。
  • 当哨兵监测到master 宕机,会自动将slave 切换成master,然后通过发布订阅模式通知其他的从服务器,修改配置文件,让它们切换主机。

注:然而一个哨兵进程对Redis 服务器进行监控,可能会出现问题,为此,我们可以使用多个哨兵进行监控。各个哨兵之间还会进行监控,这样就形成了多哨兵模式。

c. sentinel哨兵通过如下功能实现故障切换

描述一下故障切换(failover)的过程。假设主服务器宕机,哨兵1 先检测到这个结果,系统并不会马上进行failover 过程,仅仅是哨兵1 主观的认为主服务器不可用,这个现象成为主观下线。当后面的哨兵也检测到主服务器不可用,并且数量达到一定值时(大于等于配置文件指定的值),那么哨兵之间就会进行一次投票,投票的结果由一个哨兵发起,进行failover 操作。切换成功后,就会通过发布订阅模式,让各个哨兵把自己监控的从服务器实现切换主机,这个过程称为客观下线。这样对于客户端而言,一切都是透明的。当客户端试图连接失效的主服务器时,sentine 集群也会向客户端返回新主服务器的地址,使得集群可以使用新主服务器代替失效服务器。

(1)monitoring:监控redis 是否正常运行

(2)notification:通知application 错误信息

(3)failover:当某个 master 死掉,选择另外一个 slave 升级为 master,更新master-slave 关系。

(4)configuration provider:client 通过 sentinel 获取 redis 地址,并在 failover时更新地址。

注:主观下线和客观下线

主观下线:Subjectively Down,简称 SDOWN,指的是当前 Sentinel 实例对某个redis 服务器做出的下线判断。

客观下线:Objectively Down, 简称 ODOWN,指的是多个 Sentinel 实例在对Master Server 做出 SDOWN 判断,并且通过 SENTINEL is-master-down-by-addr 命令互相交流之后,得出的Master Server 下线判断,然后开启failover。

从SDOWN 切换到ODOWN 不需要任何一致性算法,只需要一个gossip(流言)协议,如果一个sentinel 收到了足够多的sentinel 发来消息告诉它某个master 已经down 掉了,SDOWN 状态就会变成ODOWN 状态。

Ⅳ. redis-cluster(集群模式)

Redis Sentinel 集群模式中,随着业务量和数据量增到性能达到redis 单节点瓶颈,垂直扩容受机器限制,水平扩容涉及对应用的影响以及数据迁移中数据丢失风险。针对这些痛点,Redis3.0 推出cluster 分布式集群方案,当遇到单节点内存,并发,流量瓶颈时,采用cluster 方案实现负载均衡。

Redis Cluster 有效地解决了 Redis 分布式方面的需求。分布式数据存储方案中最为重要的一点就是数据分片,也就是所谓的 Sharding。

为了使得集群能够水平扩展,首要解决的问题就是如何将整个数据集按照一定的规则分配到多个节点上,常用的数据分片的方法有:范围分片,哈希分片,一致性哈希算法,哈希槽等。

Redis Cluster 采用虚拟哈希槽分区,所有的键根据哈希函数映射到 0 ~ 16383 整数槽内,计算公式:slot = CRC16(key) & 16383。每一个节点负责维护一部分槽以及槽所映射的键值数据。

Redis Cluster 一般由多个节点组成,节点数量至少为 6 个才能保证组成完整高可用的集群,其中三个为主节点,三个为从节点。三个主节点会分配槽,处理客户端的命令请求,而从节点可用在主节点故障后,顶替主节点。

一般来说,主 Redis 节点会处理 Clients 的读写操作,而从节点只处理读操作。

二. 安装redis

0. redis官网与下载链接

a. 构建下载yum源

[root@4 ~]# mount /dev/sr0 /media/cdrom
mount: /media/cdrom: WARNING: source write-protected, mounted read-only.
[root@4 ~]# cat <<EOF > /etc/yum.repos.d/redis.repo
[Redis]                                
name=Redis
baseurl=http://packages.redis.io/rpm/rockylinux9
enabled=1
gpgcheck=1
EOF
[root@4 ~]# dnf clean all&&dnf makecache
5 个文件已删除
Redis                                                                                  6.6 kB/s | 9.3 kB     00:01    
BaseOS                                                                                  70 MB/s | 2.5 MB     00:00    
AppStream                                                                               72 MB/s | 9.6 MB     00:00    
元数据缓存已建立。

1. 安装redis

[root@4 ~]# curl -fsSL https://packages.redis.io/gpg > /tmp/redis.key
sudo rpm --import /tmp/redis.key
sudo yum -y install redis

2. 启动redis

[root@4 ~]# systemctl start  redis
[root@4 ~]# ss -tuanp|grep redis
tcp   LISTEN 0      511          127.0.0.1:6379         0.0.0.0:*     users:(("redis-server",pid=1533,fd=18))              
tcp   LISTEN 0      511              [::1]:6379            [::]:*     users:(("redis-server",pid=1533,fd=19))              

3. 把redis调入后台运行

默认情况下,redis不是在后台运行,我们需要把redis放在后台运行

修改配置文件

[root@4 ~]# cat /etc/redis/redis.conf|grep -v -E '^#|^$'
loadmodule /usr/lib/redis/modules/rejson.so
loadmodule /usr/lib/redis/modules/redisbloom.so
loadmodule /usr/lib/redis/modules/redistimeseries.so
loadmodule /usr/lib/redis/modules/redisearch.so
bind 127.0.0.1 -::1 192.168.100.102
#默认监听127.0.0.1端口,手动添加当前主机的IP地址
protected-mode yes
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize yes
#次数修改为yes
supervised auto
loglevel notice
logfile /var/log/redis/redis-server.log
databases 16
always-show-logo no
set-proc-title yes
proc-title-template "{title} {listen-addr} {server-mode}"
locale-collate ""
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
rdb-del-sync-files no
dir /var/lib/redis
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync yes
repl-diskless-sync-delay 5
repl-diskless-sync-max-replicas 0
repl-diskless-load disabled
repl-disable-tcp-nodelay no
replica-priority 100
acllog-max-len 128
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
lazyfree-lazy-user-del no
lazyfree-lazy-user-flush no
oom-score-adj no
oom-score-adj-values 0 200 800
disable-thp yes
appendonly no
appendfilename "appendonly.aof"
appenddirname "appendonlydir"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble yes
aof-timestamp-enabled no

slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-listpack-entries 512
hash-max-listpack-value 64
list-max-listpack-size -2
list-compress-depth 0
set-max-intset-entries 512
set-max-listpack-entries 128
set-max-listpack-value 64
zset-max-listpack-entries 128
zset-max-listpack-value 64
hll-sparse-max-bytes 3000
stream-node-max-bytes 4096
stream-node-max-entries 100
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes
jemalloc-bg-thread yes

4.重启redis后查看端口占用情况

[root@4 ~]# systemctl restart redis
[root@4 ~]# ss -anp|grep redis
u_str ESTAB  0      0                                                                     * 38394                     * 39272 users:(("redis-server",pid=2566,fd=2),("redis-server",pid=2566,fd=1))                                                              
tcp   LISTEN 0      511                                                     192.168.100.102:6379                0.0.0.0:*     users:(("redis-server",pid=2566,fd=20))                                                                                            
tcp   LISTEN 0      511                                                           127.0.0.1:6379                0.0.0.0:*     users:(("redis-server",pid=2566,fd=18))                                                                                            
tcp   LISTEN 0      511                                                               [::1]:6379                   [::]:*     users:(("redis-server",pid=2566,fd=19))                                                        

* 错误:

①. 在bind 127.0.0.1 -::1 192.168.100.102后面加上了#注释内容,但是redis配置文件对此不支持,导致接收到了错误的IP地址,服务起不来。

解决方法:改成下一行注释

②. 修改了71,72行内容bind 192.168.100.102 bind 127.0.0.1 ::1而非89行bind 127.0.0.1 -::1 192.168.100.102,导致实际值监视了上面的一个IP地址而没有监视下面的127.0.0.1

解决方法:把71,72行注释掉,修改89行内容

5. 客户端连接reids

[root@4 ~]# redis-cli
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> exit
[root@4 ~]# redis-cli -h 192.168.100.102 -p 6379
192.168.100.102:6379> 

6. 停止redis

[root@4 ~]# systemctl stop redis
[root@4 ~]# ss -anp|grep redis
[root@4 ~]# 

7. 几个文件都是什么

[root@4 ~]# rpm -ql redis
/etc/redis
/etc/redis/redis.conf
/etc/redis/sentinel
/etc/redis/sentinel/sentinel.conf
/run/redis
/run/redis/redis-server.pid
/usr/bin/redis-benchmark
/usr/bin/redis-check-aof
/usr/bin/redis-check-rdb
/usr/bin/redis-cli
/usr/bin/redis-sentinel
/usr/bin/redis-server
/usr/lib/redis
/usr/lib/redis/modules
/usr/lib/redis/modules/redisbloom.so
/usr/lib/redis/modules/redisearch.so
/usr/lib/redis/modules/redistimeseries.so
/usr/lib/redis/modules/rejson.so
/usr/lib/redis/redisbloom.so
/usr/lib/redis/redisearch.so
/usr/lib/redis/redistimeseries.so
/usr/lib/redis/rejson.so
/usr/lib/systemd/system/redis-sentinel.service
/usr/lib/systemd/system/redis.service
/usr/share/selinux/packages/redis-ce.fc
/usr/share/selinux/packages/redis-ce.te
/var/lib/redis
/var/log/redis
/var/log/redis/redis-sentinel.log
/var/log/redis/redis-server.log

/usr/bin/redis-benchmark: redis性能测试工具。测试redis在你的系统及你的配置下读写性能

/usr/bin/redis-check-aof:检查aof日志的工具

/usr/bin/redis-check-rdb:检查rdb日志的工具

/usr/bin/redis-cli:连接用的cli客户端

/usr/bin/redis-server:redis服务进程

8. 添加环境变量(如果是二进制安装则需要做)

ln -s /usr/local/redis/bin/* /usr/local/bin/或echo 'export PATH=/usr/localredis/bin:$PATH' >> /etc/profile

9. 设置开机自启动

[root@4 ~]# systemctl enable redis
[root@4 ~]# systemctl status redis
○ redis.service - Advanced key-value store
     Loaded: loaded (/usr/lib/systemd/system/redis.service; enabled; preset: disabled)
     Active: inactive (dead) since Tue 2026-07-07 23:00:55 CST; 8min ago
   Duration: 15min 18.540s
       Docs: http://redis.io/documentation
   Main PID: 2566 (code=exited, status=0/SUCCESS)
     Status: "Saving the final RDB snapshot"
        CPU: 1.235s

7月 07 22:45:36 4 systemd[1]: Starting Advanced key-value store...
7月 07 22:45:36 4 systemd[1]: Started Advanced key-value store.
7月 07 23:00:55 4 systemd[1]: Stopping Advanced key-value store...
7月 07 23:00:55 4 systemd[1]: redis.service: Deactivated successfully.
7月 07 23:00:55 4 systemd[1]: Stopped Advanced key-value store.
7月 07 23:00:55 4 systemd[1]: redis.service: Consumed 1.235s CPU time.

三. 编译安装redis

1. 解压

[root@1 ~]# ls
anaconda-ks.cfg  redis-7.4.1.tar.gz
[root@1 ~]# tar -xf redis-7.4.1.tar.gz

2. 安装gcc

[root@1 ~]# mount /dev/sr0 /media/cdrom
mount: /media/cdrom: WARNING: source write-protected, mounted read-only.
[root@1 ~]# dnf -y install gcc

3. 编译安装

[root@1 redis-7.4.1]# cd redis-7.4.1
[root@1 redis-7.4.1]# make
[root@1 redis-7.4.1]# cd src/
[root@1 src]# make install PREFIX=/usr/local/redis

4. 移动配置文件到指定位置

[root@1 src]# cd ..
[root@1 redis-7.4.1]# mkdir /usr/local/redis/etc
[root@1 redis-7.4.1]# cp redis.conf /usr/local/redis/etc/

5. 启动redis服务

[root@1 redis-7.4.1]# /usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf 
10635:C 08 Jul 2026 19:19:00.018 # WARNING Memory overcommit must be enabled! Without it, a background save or replication may fail under low memory condition. Being disabled, it can also cause failures without low memory condition, see https://github.com/jemalloc/jemalloc/issues/1328. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
10635:C 08 Jul 2026 19:19:00.019 * oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
10635:C 08 Jul 2026 19:19:00.019 * Redis version=7.4.1, bits=64, commit=00000000, modified=1, pid=10635, just started
10635:C 08 Jul 2026 19:19:00.019 * Configuration loaded
10635:M 08 Jul 2026 19:19:00.019 * Increased maximum number of open files to 10032 (it was originally set to 1024).
10635:M 08 Jul 2026 19:19:00.019 * monotonic clock: POSIX clock_gettime
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis Community Edition      
  .-`` .-```.  ```\/    _.,_ ''-._     7.4.1 (00000000/1) 64 bit
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 10635
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           https://redis.io       
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               

10635:M 08 Jul 2026 19:19:00.020 * Server initialized
10635:M 08 Jul 2026 19:19:00.020 * Ready to accept connections tcp
10635:M 08 Jul 2026 19:19:00.020 * Server initialized
10635:M 08 Jul 2026 19:19:00.020 * Ready to accept connections tcp
^C10635:signal-handler (1783509575) Received SIGINT scheduling shutdown...
10635:M 08 Jul 2026 19:19:35.855 * User requested shutdown...
10635:M 08 Jul 2026 19:19:35.855 * Saving the final RDB snapshot before exiting.
10635:M 08 Jul 2026 19:19:35.857 * DB saved on disk
10635:M 08 Jul 2026 19:19:35.857 * Removing the pid file.
10635:M 08 Jul 2026 19:19:35.857 # Redis is now ready to exit, bye bye...

6. 解决警告的方法

Ⅰ. 解决最大打开文件数问题

#执行ulimit -n查看当前用户打开的最大文件数量
[root@1 redis-7.4.1]# ulimit -n
1024
#修改/etc/sectrity/limits.conf文件,在文件末尾添加
[root@1 redis-7.4.1]# cat <<EOF >> /etc/security/limits.conf
*    soft    nofile    10032
*    hard    nofile    10032
EOF

#重新登录让修改生效,然后查看
[root@1 redis-7.4.1]# exit
注销
Connection to 192.168.100.99 closed.
[root@5 docs]# ssh1
Last login: Wed Jul  8 16:25:10 2026 from 192.168.100.103
[root@1 ~]# ulimit -n
10032

Ⅱ. 解决其他问题

#在/etc/sysctl.cnf文件中添加下面两行内容
[root@1 ~]# cat <<EOF >> /etc/sysctl.conf 
net.core.somaxconn = 511
vm.overcommit_memory = 1
EOF
#执行 sysctl -p使内核参数修改生效
[root@1 ~]# sysctl -p
net.core.somaxconn = 511
vm.overcommit_memory = 1
[root@1 ~]# echo never>/sys/kernel/mm/transparent_hugepage/enabled

再次启动redis服务

[root@1 ~]# /usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf 
11131:C 08 Jul 2026 19:54:03.912 * oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
11131:C 08 Jul 2026 19:54:03.912 * Redis version=7.4.1, bits=64, commit=00000000, modified=1, pid=11131, just started
11131:C 08 Jul 2026 19:54:03.912 * Configuration loaded
11131:M 08 Jul 2026 19:54:03.912 * monotonic clock: POSIX clock_gettime
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis Community Edition      
  .-`` .-```.  ```\/    _.,_ ''-._     7.4.1 (00000000/1) 64 bit
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 11131
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           https://redis.io       
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               

11131:M 08 Jul 2026 19:54:03.916 * Server initialized
11131:M 08 Jul 2026 19:54:03.917 * Ready to accept connections tcp
^C11131:signal-handler (1783511653) Received SIGINT scheduling shutdown...
11131:M 08 Jul 2026 19:54:13.883 * User requested shutdown...
11131:M 08 Jul 2026 19:54:13.884 * Saving the final RDB snapshot before exiting.
11131:M 08 Jul 2026 19:54:13.885 * DB saved on disk
11131:M 08 Jul 2026 19:54:13.885 * Removing the pid file.
11131:M 08 Jul 2026 19:54:13.885 # Redis is now ready to exit, bye bye...

* 注:默认redis服务是在前台终端运行

7. 把redis调入后台运行

默认情况下,redis不是在后台运行,我们需要把redis放在后台运行

启动服务

[root@1 ~]# /usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf 
11131:C 08 Jul 2026 19:54:03.912 * oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
11131:C 08 Jul 2026 19:54:03.912 * Redis version=7.4.1, bits=64, commit=00000000, modified=1, pid=11131, just started
11131:C 08 Jul 2026 19:54:03.912 * Configuration loaded
11131:M 08 Jul 2026 19:54:03.912 * monotonic clock: POSIX clock_gettime
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis Community Edition      
  .-`` .-```.  ```\/    _.,_ ''-._     7.4.1 (00000000/1) 64 bit
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 11131
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           https://redis.io       
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               

11131:M 08 Jul 2026 19:54:03.916 * Server initialized
11131:M 08 Jul 2026 19:54:03.917 * Ready to accept connections tcp
^C11131:signal-handler (1783511653) Received SIGINT scheduling shutdown...
11131:M 08 Jul 2026 19:54:13.883 * User requested shutdown...
11131:M 08 Jul 2026 19:54:13.884 * Saving the final RDB snapshot before exiting.
11131:M 08 Jul 2026 19:54:13.885 * DB saved on disk
11131:M 08 Jul 2026 19:54:13.885 * Removing the pid file.
11131:M 08 Jul 2026 19:54:13.885 # Redis is now ready to exit, bye bye...

[root@1 ~]# ss -tuanp|grep redis
[root@1 ~]# /usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf 
11168:C 08 Jul 2026 19:56:15.487 * oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
11168:C 08 Jul 2026 19:56:15.487 * Redis version=7.4.1, bits=64, commit=00000000, modified=1, pid=11168, just started
11168:C 08 Jul 2026 19:56:15.487 * Configuration loaded
11168:M 08 Jul 2026 19:56:15.488 * monotonic clock: POSIX clock_gettime
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis Community Edition      
  .-`` .-```.  ```\/    _.,_ ''-._     7.4.1 (00000000/1) 64 bit
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 11168
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           https://redis.io       
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               

11168:M 08 Jul 2026 19:56:15.489 * Server initialized
11168:M 08 Jul 2026 19:56:15.489 * Loading RDB produced by version 7.4.1
11168:M 08 Jul 2026 19:56:15.489 * RDB age 122 seconds
11168:M 08 Jul 2026 19:56:15.489 * RDB memory usage when created 0.90 Mb
11168:M 08 Jul 2026 19:56:15.489 * Done loading RDB, keys loaded: 0, keys expired: 0.
11168:M 08 Jul 2026 19:56:15.489 * DB loaded from disk: 0.000 seconds
11168:M 08 Jul 2026 19:56:15.489 * Ready to accept connections tcp

然后新开终端执行ss或ps命令查看redis监听和进程信息

[root@1 ~]# ss -tuanp|grep redis
tcp   LISTEN 0      511         127.0.0.1:6379          0.0.0.0:*     users:(("redis-server",pid=11168,fd=8))                
tcp   LISTEN 0      511             [::1]:6379             [::]:*     users:(("redis-server",pid=11168,fd=9))                
[root@1 ~]# ps -elf|grep redis|grep -v "grep"
4 S root       11168   10718  0  80   0 - 33194 ep_pol 19:56 pts/0    00:00:00 /usr/local/redis/bin/redis-server 127.0.0.1:6379

8. 客户端连接redis

[root@1 ~]# /usr/local/redis/bin/redis-cli
127.0.0.1:6379> \q
127.0.0.1:6379> exit

9. 停止redis实例

[root@1 ~]# /usr/local/redis/bin/redis-cli shutdown
#或
[root@1 ~]# pkill redis-server

10. 添加path环境变量和开机自启动

[root@1 ~]# chmod +x /etc/rc.d/rc.local 
[root@1 ~]# echo "/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf">>/etc/rc.d/rc.local