tulip notes
首页
  • 学习笔记

    • 《Vue》
  • 踩坑日记

    • JavaScript
  • MQ
  • Nginx
  • IdentityServer
  • Redis
  • Linux
  • Java
  • SpringBoot
  • SpringCloud
  • MySql
  • docker
  • 算法与设计模式
  • 踩坑与提升
  • Git
  • GitHub技巧
  • Mac
  • 网络
  • 项目构建合集
  • 一些技巧
  • 面试
  • 一些杂货
  • 友情链接
  • 项目发布
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Star-Lord

希望一天成为大师的学徒
首页
  • 学习笔记

    • 《Vue》
  • 踩坑日记

    • JavaScript
  • MQ
  • Nginx
  • IdentityServer
  • Redis
  • Linux
  • Java
  • SpringBoot
  • SpringCloud
  • MySql
  • docker
  • 算法与设计模式
  • 踩坑与提升
  • Git
  • GitHub技巧
  • Mac
  • 网络
  • 项目构建合集
  • 一些技巧
  • 面试
  • 一些杂货
  • 友情链接
  • 项目发布
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 各种MQ

  • Nginx

  • IdentityServer

  • Redis

    • 初始Redis与安装
      • Redis简介
        • 支持的数据类型
      • 安装
        • 下载安装包
        • 编译与安装
        • 启动
        • 修改配置文件
        • 将Redis注册为服务
        • 创建服务文件
        • 添加一下内容
        • 启动并创建服务
        • 扩展-Type-foring
        • 扩展-日志-权限
      • 命令行操作
        • String
        • Hash
        • List
        • Set
        • Sorted Set
    • Redis常用的一些场景
    • Redis中的缓存失效
    • 关于Redis的一些问题
    • Redis的持久化策略
    • Redis从单机到集群等模式
    • Redis和MySql实现数据一致性
    • 通过Redis实现分布式锁
    • Redis的客户端介绍
  • Linux

  • 中间件
  • Redis
EffectTang
2023-10-29
目录

初始Redis与安装

# 初始Redis与安装

# Redis简介

Redis是由意大利人Salvatore Sanfilippo(网名:antirez)开发的一款内存高速缓存数据库。在存储的时候采用 key-value 的形式。

它比起MySql之类的数据库,性能高得多,这是因为Redis是一种基于内存的缓存系统 – Redis能读的速度是110000次/s,写的速度是81000次/s 。

它的数据通常存储在内存中,但是Redis也会定时把数据写回硬盘中。在重启的时候可以再次加载到内存中进行使用。

Redis官网 (opens new window)

# 支持的数据类型

Redis支持五种基本数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(有序集合)。

  • string(字符串)是Redis最基本的类型,一个key对应一个value。string类型是二进制安全的,支持存储部分简单的数据类型,如数字、字符串等。
  • hash(哈希)是一个键值对的集合,是string类型的field和value的映射表,特别适合用于存储对象。
  • list(列表)是简单的字符串列表,按照插入顺序排序。
  • set(集合)是string类型的无序集合、且集合中元素是唯一的,不重复。
  • zset(有序集合)是set的有序版本,每个元素都有一个分数,根据元素的分数进行排序。

# 安装

在linux环境下安装,因为Redis是基于C语言编写的,因此首先需要安装Redis所需要的gcc依赖:

yum install -y gcc tcl
1

# 下载安装包

wget http://download.redis.io/releases/redis-x.x.x.tar.gz

wget http://download.redis.io/releases/redis-6.2.6.tar.gz

tar -xzvf redis-x.x.x.tar.gz
1
2
3
4
5

根据自己的需求,将 "x.x.x" 替换为你想要下载的Redis版本号。

关于版本的选择,以下是一些建议

场景 推荐版本 理由
新项目,需最新功能 Redis 7.0 功能全面,性能优化显著,云服务兼容性好18
稳定优先,避免协议风险 Redis 6.2 长期支持成熟,协议无商业化限制310
低资源环境 Redis 5.0 内存占用低,基础功能完备2

# 编译与安装

cd redis-x.x.x
make && make install
1
2

编译(make)完成后进行安装(make install),当然你也可以将这两步分开执行。

默认的安装路径是在/usr/local/bin的目录下。进入该文件夹,就可以发现此时它多了一些redis相关的文件,如:

  • redis-cli:redis提供的命令行客户端
  • redis-server:redis的服务端启动脚本
  • redis-sentinel:redis的哨兵启动脚本

# 启动

在Redis的安装目录/usr/local/bin中,执行一下命令:

./redis-server
1

直接运行redis-server脚本,是前台方式运行,只要窗口关闭,redis服务就会挂掉,同时也无法执行其他操作。这种方式很不利于我们使用redis,因此我们通常推荐使用后台方式启动:

  • 后台启动
./redis-server --daemonize yes 
1

Redis默认监听端口为6379。如果你想修改端口,可以编辑配置文件redis.conf进行相应的配置。配置文件在你刚刚解压的文件夹中

  • 启动时,指定配置文件启动
./redis-server ../redis.conf
1

将守护进程修改为yes,即可后台运行。后一个参数为配置文件的路径,可以使用相对路径,也可以使用绝对路径。

# 修改配置文件

  • 备份
cp redis.conf redis.conf bck
1

在修改配置文件之前,为了保险起见,我们先将配置文件进行一次备份。再进行修改

  • 修改——以下是其中一些重要配置
# 监听的地址 默认是 127.0.0.1,修改为0.0.0.0 则可以在任意ip访问,生产环境不要这样设置
bind 127.0.0.1
# 守护进程 修改为yes后即可后台运行,默认为 no
daemonize no
# 密码,设置后 访问redis必须输入密码 默认是被注释掉的 不需要密码
# requirepass foobared
# Accept connections on the specified port, default is 6379 (IANA #815344).
# If port 0 is specified Redis will not listen on a TCP socket.
# 监听的端口
port 6379
# 工作目录 默认是当前目录(server脚本所在的地址),日志、持久化等文件都会保存在这个目录
# 如果不特别设置 dir 参数,默认情况下 Redis 可能会使用编译时指定的目录或执行命令的当前目录。
# 使用 ./ 作为目录值意味着持久化文件会被保存在 Redis 服务启动时所在的目录中。
dir ./
# Set the number of databases. The default database is DB 0, you can select
# a different one on a per-connection basis using SELECT <dbid> where
# dbid is a number between 0 and 'databases'-1
# 数据库数量 默认为16,编号是0-15 ,设置几 代表使用几个数据库
databases 16
# In short... if you have replicas attached it is suggested that you set a lower
# limit for maxmemory so that there is some free RAM on the system for replica
# output buffers (but this is not needed if the policy is 'noeviction').
#
# maxmemory <bytes>
# 设置redis能使用的最大内存
maxmemory 512mb
# Specify the log file name. Also the empty string can be used to force
# Redis to log on the standard output. Note that if you use standard
# output for logging but daemonize, logs will be sent to /dev/null
logfile ""
# 日志文件。默认为空,不记录日志,可以指定日志文件名
# logfile "redis.log"

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

# 将Redis注册为服务

为了更方便的使用,你当然也可以将其注册为一个服务,并实现开机自启

# 创建服务文件

创建 systemd 服务文件: 创建一个新的服务文件 /etc/systemd/system/redis.service:

sudo vim /etc/systemd/system/redis.service
1

# 添加一下内容

[Unit]
Description=Redis In-Memory Data Store
After=network.target

[Service]
User=redis
Group=redis
ExecStart=/usr/local/bin/redis-server /etc/redis/redis.conf
ExecStop=/usr/local/bin/redis-cli shutdown
Restart=always       # 始终重启服务
RestartSec=3         # 重启间隔时间
Type=forking         # Redis 默认以 fork 模式运行
PIDFile=/var/run/redis.pid

[Install]
WantedBy=multi-user.target
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  • User=redis
    • 指定运行 Redis 服务的用户为 redis。
    • 这是为了遵循最小权限原则,避免以高权限(如 root)运行服务,从而提高系统的安全性。
  • Group=redis
    • 指定运行 Redis 服务的组为 redis。
    • 与 User 配合使用,确保服务进程具有正确的用户和组权限。
  • ExecStart=/usr/local/bin/redis-server /etc/redis/redis.conf
    • 定义启动 Redis 服务时执行的命令。
    • /usr/local/bin/redis-server 是 Redis 服务器的主程序路径。
    • /etc/redis/redis.conf 是 Redis 的配置文件路径。
    • 这个字段是 [Service] 的核心部分,告诉 systemd 如何启动 Redis 服务。
  • ExecStop=/usr/local/bin/redis-cli shutdown
    • 定义停止 Redis 服务时执行的命令。
    • /usr/local/bin/redis-cli shutdown 使用 Redis 客户端工具优雅地关闭 Redis 服务。
    • 这种方式比直接强制终止进程更安全,因为它会触发 Redis 的持久化操作(如保存数据到磁盘)。
  • Restart=always
    • 定义服务失败时的行为。
    • always 表示无论服务因任何原因退出(包括正常退出、崩溃或被信号终止),systemd 都会自动尝试重新启动它。
    • 其他选项包括:
      • no:不重启。
      • on-failure:仅在非正常退出时重启。
      • on-abnormal:仅在异常退出(如被信号终止或崩溃)时重启。
  • Type=forking:Redis 默认会 fork 一个子进程运行,需设置此参数。
  • PIDFile:指定 Redis 的 PID 文件路径(需确保目录存在且可写)。

# 启动并创建服务

# 开机自动启动
sudo systemctl enable redis
sudo systemctl start redis
sudo systemctl restart redis
sudo systemctl stop redis
# 服务状态
sudo systemctl status redis

sudo systemctl daemon-reload

1
2
3
4
5
6
7
8
9
10

# 扩展-Type-foring

在 systemd 的服务配置中,Type=forking 是一个关键参数,用于描述服务的启动方式。如果 不设置 Type=forking,systemd 可能无法正确管理 Redis 服务,导致服务状态异常或无法正常运行。以下是详细分析:

1.Type=forking 的作用

  • 默认行为:systemd 默认认为服务是 simple 类型(即服务主进程在前台运行,且不会 fork 子进程退出)。
  • Redis 的启动方式: Redis 默认会以守护进程模式运行(通过 fork() 创建子进程,父进程退出),这意味着它的主进程会在启动后立即退出,子进程在后台运行。
  • 为什么需要 Type=forking: 如果不显式设置 Type=forking,systemd 会认为服务已经完成(因为父进程退出),从而标记服务为失败或终止管理。这会导致 Redis 实际在后台运行,但 systemd 认为服务未启动,无法正确管理(如重启、状态检查等)。

2. 如果不设置 Type=forking 的后果

场景 1:Redis 配置为守护进程模式(daemonize yes)

  • 行为: Redis 启动时会 fork 子进程并退出父进程。systemd 会检测到父进程退出,认为服务已终止。
  • 结果:
    • systemctl status redis 显示服务状态为 failed 或 inactive。
    • Redis 实际在后台运行,但 systemd 无法管理它(无法重启、关闭等)。

场景 2:Redis 配置为前台模式(daemonize no)

  • 行为:Redis 不 fork 子进程,直接在前台运行。
  • 结果:
    • Type=simple(默认)可以正常工作,因为 systemd 会跟踪前台进程。
    • 但此时 Redis 不是后台运行,不符合生产环境需求

所以,正确配置 Redis 服务的推荐方式

步骤 1:确保 Redis 配置文件中 daemonize=no

# /etc/redis/redis.conf
daemonize yes
1
2
  • 原因:systemd 会负责将服务置于后台运行,无需 Redis 自行 fork。

步骤 2:设置 Type=forking

在 redis.service 文件中:

[Service]
Type=forking
ExecStart=/usr/local/bin/redis-server /etc/redis/redis.conf
ExecStop=/usr/local/bin/redis-cli shutdown
1
2
3
4

或者 Redis 配置文件中 daemonize=no,而redis的服务配置文件 redis.service 为 默认 Type 显示声明,为默认值。

# 扩展-日志-权限

Redis 的日志文件路径通常在配置文件 redis.conf 中定义。默认情况下,日志文件可能位于以下路径:

  • Linux 系统:/var/log/redis/redis-server.log
  • Windows 系统:日志文件路径需在 redis.windows.conf 中手动配置。

如果 Redis 的配置文件 redis.conf 中的 logfile 设置为空字符串 (logfile ""),这意味着 Redis 不会将日志写入到任何文件中。相反,它会将日志输出重定向到标准输出(stdout),这通常是在控制台或者启动 Redis 服务器的那个终端窗口中。

在这种情况下,如果你是通过一个服务管理器(如 systemd)来启动 Redis,那么日志信息可能会被服务管理器捕获,并且你可以通过服务管理器的日志功能来查看这些日志信息。

在 Redis 中,如果你在配置文件 redis.conf 的 logfile 配置项中指定了一个包含不存在目录路径的日志文件路径,例如:

logfile /var/log/redis/myredis.log
1

但 /var/log/redis/ 这个目录并不存在,那么 Redis 不会自动创建这个目录。启动 Redis 时将会失败,并在控制台或系统日志中输出类似如下错误信息:

Can't open the log file: No such file or directory
1

正确做法是:

你可以在配置 Redis 前手动创建日志目录,例如:


# 编辑配置文件
sudo nano /etc/redis/redis.conf

# 修改日志路径为:
logfile /var/log/redis/redis-server.log

# 创建标准日志目录
sudo mkdir -p /var/log/redis
sudo chown redis:redis /var/log/redis
sudo chmod 755 /var/log/redis

# 创建日志文件
sudo touch /var/log/redis/redis-server.log
sudo chown redis:redis /var/log/redis/redis-server.log
sudo chmod 644 /var/log/redis/redis-server.log
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# 命令行操作

在线练习redis-操作命令 (opens new window)

以下介绍的都是一些简单的常用命令,更多详细的还请参考官网。

# String

redis 127.0.0.1:6379>set strkey redis-demo
ok
redis 127.0.0.1:6379>get strkey
"redis-demo"
1
2
3
4

在以上实例中我们使用了 SET 和 GET 命令,键为 strkey。

# Hash

redis 127.0.0.1:6379>hset hashkey name tom
1
redis 127.0.0.1:6379>hget hashkey name
"tom"
1
2
3
4

以上例子我们使用了 hSET 和 hGET 命令,键为 hashkey。值为一个键值对-(name-tom)

# List

redis 127.0.0.1:6379>lpush listkey redis-test1 
(integer) 1
redis 127.0.0.1:6379>lpush listkey redis-test22
(integer) 2
redis 127.0.0.1:6379>lrange listkey 0 10
1) "redis-test22"
2) "redis-test1"
1
2
3
4
5
6
7

上述例子中,使用lpush,存了一个List类型的数据,key为listkey,值为一个数组

之后使用lrange key start stop命令,获取列表指定范围内的元素。

# Set

redis 127.0.0.1:6379>sadd demo-key mysql
(integer) 1
redis 127.0.0.1:6379>sadd demo-key oracle
(integer) 1
redis 127.0.0.1:6379>sadd demo-key redis
(integer) 1
redis 127.0.0.1:6379>sadd demo-key mysql
(integer) 0
redis 127.0.0.1:6379>smembers demo-key
1) "mysql"
2) "redis"
3) "oracle"
1
2
3
4
5
6
7
8
9
10
11
12

上述例子中在set集合中添加了4次,但因为其中有重复的元素。因此demo-key中只有三个元素。

# Sorted Set

redis 127.0.0.1:6379> zadd zkey 1 redis
(integer) 1
redis 127.0.0.1:6379> zadd zkey 2 oracle
(integer) 1
redis 127.0.0.1:6379> zadd zkey 3 mysql
(integer) 1
redis 127.0.0.1:6379> zadd zkey 3 mysql
(integer) 0
redis 127.0.0.1:6379> zadd zkey 4 mysql
(integer) 0
redis 127.0.0.1:6379> zrange zkey 0 10 withscores
1) "redis"
2) "1"
3) "oracle"
4) "2"
5) "mysql"
6) "4"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

sorted set是有序集合,但是每个元素都会关联一个double类型的分数。

zadd key score1 member1[score2 member2]-向有序集合添加一个或多个成员,或者更新已存在成员的分数

当然更多的时候,我们不会使用这种方式操作redis,而是在各种编程语言语言中集成的api进行使用。

上次更新: 2025/07/24, 15:25:26
初入认识Ids4
Redis常用的一些场景

← 初入认识Ids4 Redis常用的一些场景→

最近更新
01
Spring中Bean的生命周期
09-03
02
数据不丢失与准确类
09-01
03
线程池与任务调度
08-31
更多文章>
Theme by Vdoing | Copyright © 2023-2025 EffectTang
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式