Redis基础入门

1. 认识 Redis

1.1 Redis是什么

Redis(Remote Dictionary Server,远程字典服务)是一个开源的、基于内存的、支持持久化的键值对(Key-Value)存储系统。它通常被归类为 NoSQL 数据库、缓存和消息中间件。
基于内存 是其高性能的主要原因,数据主要存储在内存中,读写速度极快。键值对是其基本数据模型,但 Value 支持多种复杂数据结构,这使其远超简单的键值存储。


1.2 核心特点

  1. 极致性能
    数据操作主要在内存中完成,配合高效的底层数据结构(如跳跃表、哈希表)和单线程架构(避免上下文切换和竞争条件),使其能达到每秒数十万次的读写性能。
  2. 丰富的数据结构
    不仅是简单的字符串(String),还支持列表(List)、集合(Set)、有序集合(Sorted Set)、哈希(Hash)、位图(Bitmap)等。这使得开发者可以直接在数据库层完成复杂逻辑,减少应用代码的复杂性。
  3. 功能完备
    • 持久化:支持 RDB(快照)和 AOF(日志)两种方式将内存数据保存到磁盘,防止数据丢失。
    • 高可用与复制:通过 Redis Sentinel(哨兵)实现自动故障转移,保证服务高可用;通过主从复制实现数据备份和读写分离。
    • 事务:支持简单的事务操作,保证一系列命令的原子性执行。
    • 发布/订阅(Pub/Sub):提供消息发布订阅功能,可用于简单的消息队列场景。
    • Lua 脚本:支持执行 Lua 脚本,实现复杂的原子操作。
  4. 单线程与原子性
    Redis 的核心网络请求处理模块是单线程的,任何命令操作都是原子性的,无需担心并发问题,简化了开发。

1.3 典型应用场景

应用场景说明与举例
缓存(Cache)最主要、最经典的应用。将热点数据(如数据库查询结果、页面片段)存放在 Redis 中,极大减轻后端数据库的压力,提升应用响应速度。例如:电商网站的商品信息、社交媒体的用户动态。
会话存储(Session Storage)在分布式或微服务架构中,将用户登录会话(Session)集中存储在 Redis 中,实现多台应用服务器共享会话,解决状态同步问题。
排行榜/计数器利用有序集合(Sorted Set) 可以轻松实现实时排行榜,如游戏积分榜、商品销量榜。利用 INCR/DECR 命令实现原子性的计数器,如文章阅读量、点赞数。
消息队列(Message Queue)利用列表(List) 的阻塞弹出操作(BLPOP/BRPOP或发布/订阅(Pub/Sub)功能,可以实现轻量级的消息队列、异步任务处理,缓解系统高峰期压力。
布式锁(Distributed Lock)在分布式系统中,利用Redis的 SETNX(Set if not exists)命令可以实现简单的分布式锁,用于控制多个进程对共享资源的并发访问。

注意

  • 数据容量:由于数据存储在内存中,成本较高,不适合存储超大规模(如 TB 级别)的冷数据。
  • 持久化权衡:RDB 持久化可能丢失最后一次快照后的数据,AOF 持久化会影响写入性能,需要根据业务场景进行配置和权衡。

2. 安装与配置

2.1 在Linux上安装 Redis

这里介绍两种最常用的安装方法:使用包管理器安装(简单快捷,适合大多数用户)和编译源码安装(能获取最新版本,更灵活),Linux以 Ubuntu/Debian 为例。

2.1.1 方法一:使用包管理器安装

  1. 更新软件包列表
sudo apt update
  1. 安装Redis
sudo apt install redis-server

这个命令会自动安装 Redis 服务器及其依赖项,并将其配置为系统服务。

  1. 运行Redis
# 检查运行状态
sudo systemctl status redis-server
# 启动 Redis 服务
sudo systemctl start redis-server
# 停止 Redis 服务
sudo systemctl stop redis-server
# 重启 Redis 服务(修改配置后常用)
sudo systemctl restart redis-server
# 设置开机自动启动
sudo systemctl enable redis-server

2.1.2 方法二:编译源码安装

  1. 安装编译依赖
sudo apt update
sudo apt install build-essential tcl
  1. 下载并解压源码(访问 Redis.io 获取最新稳定版链接)
wget https://download.redis.io/redis-stable.tar.gz
tar -xzvf redis-stable.tar.gz
cd redis-stable
  1. 编译与安装
make
sudo make install

编译成功后,Redis 的可执行文件(如 redis-server, redis-cli)会被安装到 /usr/local/bin/ 目录下。

  1. 运行Redis
  • 前台直接启动(适用于测试)
redis-server

Redis 服务器将在当前终端前台运行,所有日志信息会直接打印在屏幕上。按 Ctrl + C 即可停止服务。

  • 使用配置文件后台启动
# 复制配置文件(建议)
sudo mkdir -p /etc/redis
sudo cp redis.conf /etc/redis/

# 编辑配置文件,将 daemonize 参数改为 yes,使其在后台运行
sudo nano /etc/redis/redis.conf
# 找到 daemonize no 这一行,将其修改为:daemonize yes
# 指定配置文件启动
redis-server /etc/redis/redis.conf
# 停止后台运行的 Redis
# 首先找到进程号(PID)
ps aux | grep redis-server
# 然后使用 命令结束进程
kill PID
# 或者使用redis-cli命令安全关闭
redis-cli shutdown 
  1. 配置为系统服务
    为了方便管理,可以手动为源码安装的Redis创建 systemd 服务文件
    (1)创建服务文件:sudo nano /etc/systemd/system/redis.service
    (2)创建用户:sudo adduser --system --group --no-create-home redis
    (3) 输入以下内容(可能需要根据您的实际路径调整)
[Unit]
Description=Redis In-Memory Data Store
After=network.target

[Service]
ExecStart=/usr/local/bin/redis-server /etc/redis/redis.conf
ExecStop=/usr/local/bin/redis-cli shutdown
Restart=always
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectoryMode=0755

[Install]
WantedBy=multi-user.target

(3)重新加载 systemd 并启用服务

sudo systemctl daemon-reload
sudo systemctl start redis
sudo systemctl enable redis

之后就可以systemctl 命令来管理了。


2.2 使用 Redis 命令行客户端

  1. 连接服务器:
# 连接本地默认服务器(127.0.0.1:6379)
redis-cli
# 连接远程服务器或指定端口
redis-cli -h your_host -p your_port -a your_password
  1. 进行基本操作
# 设置一个键值对
SET mykey "Hello, Redis!"

# 获取键对应的值
GET mykey

# 判断键是否存在
EXISTS mykey

# 删除一个键
DEL mykey

# 查看所有键(生产环境慎用,数据量大时可能阻塞服务)
KEYS *

# 使用完后,退出客户端
QUIT

2.3 主配置文件 redis.conf

Redis 的配置非常灵活,几乎全部通过 redis.conf 文件管理。理解关键参数是进行生产环境配置的基础。
配置文件位置:通常位于 /etc/redis/redis.conf(包管理器安装)或解压目录的根目录(源码安装)。
配置文件修改后需要重新Redis生效配置: sudo systemctl restart redis-server。
redis.conf重要参数:

参数默认值/示例说明
port6379Redis 服务器监听的端口号。
bind127.0.0.1允许连接的 IP 地址。127.0.0.1 表示仅允许本地连接。如需远程连接,需改为 0.0.0.0(允许所有IP)或指定IP,但这会带来安全风险,必须设置密码
daemonizeno是否以守护进程(后台)方式运行。改为 yes 即可后台运行。
requirepassfoobared连接密码。默认被注释(即无密码)。生产环境必须设置强密码
dir./工作目录,RDB 持久化文件和 AOF 文件会写入这个目录。通常改为 /var/lib/redis
dbfilenamedump.rdbRDB 持久化数据文件的名称。
appendonlyno是否开启 AOF 持久化模式。yes 为开启,能提供更好的持久化保证。
appendfilenameappendonly.aofAOF 持久化文件的名称。

3. 五大核心数据结构与命令

3.1 String(字符串)

特点:最基本的数据类型,一个 Key 对应一个 Value。Value 不仅是字符串,也可以是数字(整数或浮点数)甚至是二进制数据(如图片序列化),最大容量为 512MB。

常用命令

命令语法描述示例
SETSET key value [EX seconds] [PX milliseconds]设置键值对,可设置过期时间。SET username "zhangsan" EX 3600 (设置用户名,1小时后过期)
GETGET key获取指定 Key 的值。GET username"zhangsan"
INCRINCR key将 Key 中储存的数字值增一。原子性操作SET views 10
INCR views11
DECRDECR key将 Key 中储存的数字值减一。原子性操作DECR stock
MSETMSET key1 value1 key2 value2 ...同时设置多个键值对。MSET k1 v1 k2 v2
MGETMGET key1 key2 ...同时获取多个 Key 的值。MGET k1 k21) "v1" 2) "v2"
STRLENSTRLEN key返回 Key 所储存的字符串值的长度。STRLEN username8

应用场景

  • 缓存:缓存数据库查询结果、页面片段。
  • 计数器:文章阅读量、用户点赞数、网站访问量。
  • 分布式 Session:存储用户登录凭证。
  • 存储小规模二进制数据

3.2 List(列表)

特点:一个有序的字符串列表,元素可以重复。按照插入顺序排序,可以在列表的头部(左边)或尾部(右边)进行添加或删除操作,底层实现是双向链表

常用命令

命令语法描述示例
LPUSHLPUSH key element [element ...]将一个或多个值插入到列表头部(左边)。LPUSH tasks "task1"
RPUSHRPUSH key element [element ...]将一个或多个值插入到列表尾部(右边)。RPUSH tasks "task5"
LPOPLPOP key移除并返回列表的头部(第一个)元素。LPOP tasks"task1"
RPOPRPOP key移除并返回列表的尾部(最后一个)元素。RPOP tasks"task5"
LRANGELRANGE key start stop返回列表中指定区间内的元素,0 表示第一个元素,-1 表示最后一个元素。LRANGE tasks 0 -1 (获取所有元素)
LRANGE tasks 0 2 (获取前3个元素)
LLENLLEN key获取列表长度。LLEN tasks

应用场景

  • 消息队列:使用 LPUSH(生产消息)和 BRPOP(阻塞式消费消息)实现。
  • 最新列表:如朋友圈时间线、最新新闻,用 LPUSH 加入新元素,用 LTRIM 限制长度。
  • 记录操作日志

3.3 Hash(哈希表)

特点:一个 String 类型的 Field 和 Value 的映射表,特别适合用于存储对象。可以将一个 Hash 结构理解为关系型数据库中的一行数据。

常用命令

命令语法描述示例(存储用户信息)
HSETHSET key field value [field value ...]设置哈希表中一个或多个字段的值。HSET user:1001 name "Alice" age 30
HGETHGET key field获取哈希表中指定字段的值。HGET user:1001 name"Alice"
HGETALLHGETALL key获取哈希表中所有字段和值。HGETALL user:10011) "name" 2) "Alice" 3) "age" 4) "30"
HMSETHMSET key field value [field value ...]已弃用,HSET 已具备相同功能。HSET
HDELHDEL key field [field ...]删除哈希表中的一个或多个字段。HDEL user:1001 age
HKEYSHKEYS key获取哈希表中的所有字段名。HKEYS user:10011) "name"
HLENHLEN key获取哈希表中字段的数量。HLEN user:10011

应用场景

  • 存储对象:用户信息、商品信息、配置信息等。比将对象序列化成 JSON 字符串更灵活,可以单独修改某个字段。

3.4 Set(集合)

特点:String 类型的无序集合,集合成员是唯一的,不允许重复。支持丰富的集合运算,如交集、并集、差集。

常用命令

命令语法描述示例
SADDSADD key member [member ...]向集合添加一个或多个成员。SADD tags "java" "redis" "python"
SMEMBERSSMEMBERS key返回集合中的所有成员。SMEMBERS tags1) "java" 2) "python" 3) "redis" (无序)
SISMEMBERSISMEMBER key member判断 member 元素是否是集合 key 的成员。SISMEMBER tags "java"1 (表示存在)
SINTERSINTER key1 [key2]返回所有给定集合的交集SINTER user:1001:tags user:1002:tags (求用户1001和1002的共同标签)
SUNIONSUNION key1 [key2]返回所有给定集合的并集SUNION user:1001:tags user:1002:tags
SREMSREM key member [member ...]移除集合中一个或多个成员。SREM tags "python"
SCARDSCARD key获取集合的成员数。SCARD tags2

应用场景

  • 标签系统:给用户、文章打标签。
  • 共同好友/关注:求两个用户的共同好友。
  • 抽奖/随机推荐:使用 SRANDMEMBER 随机获取元素。
  • 数据排重:确保数据唯一性。

3.5 Sorted Set(有序集合 / ZSet)

特点:与 Set 类似,也是 String 类型元素的集合,且不允许重复。但每个元素都会关联一个 double 类型的分数(Score)。Redis 正是通过分数来为集合中的成员进行从小到大的排序。成员是唯一的,但分数可以重复。

常用命令

命令语法描述示例(游戏排行榜)
ZADDZADD key [NX|XX] [CH] [INCR] score member [score member ...]向有序集合添加一个或多个成员,或更新已存在成员的分数。
NX 仅添加新成员,不更新已存在的成员 与 XX 互斥
XX 仅更新已存在的成员,不添加新成员 与 NX 互斥
CH 返回被更改(新添加或更新)的成员数量 默认只返回新添加数量
INCR 将 ZADD 的行为改为类似 ZINCRBY,即增加分数 此时只能指定一个分数-成员对
ZADD leaderboard 1000 "Alice" 800 "Bob"
ZRANGEZRANGE key start stop [WITHSCORES]通过索引区间返回有序集合指定区间内的成员(低分到高分)。ZRANGE leaderboard 0 -1 WITHSCORES (查看整个排行榜)
ZRANGE leaderboard 0 2 (查看前三名)
ZREVRANGEZREVRANGE key start stop [WITHSCORES]返回有序集中指定区间内的成员,通过索引,分数从高到低常用于排行榜ZREVRANGE leaderboard 0 2 WITHSCORES (查看得分最高的前三名)
ZRANKZRANK key member返回指定成员的排名(从 0 开始),按分数从低到高ZRANK leaderboard "Bob"0 (排名第一,因为分数最低)
ZREVRANKZREVRANK key member返回指定成员的排名(从 0 开始),按分数从高到低ZREVRANK leaderboard "Alice"0 (排名第一,因为分数最高)
ZSCOREZSCORE key member返回指定成员的分数。ZSCORE leaderboard "Alice""1000"
ZINCRBYZINCRBY key increment member为指定成员的分数增加增量 increment。原子性操作ZINCRBY leaderboard 50 "Bob" (Bob 得分增加 50)

应用场景

  • 排行榜:游戏积分榜、热搜榜、销量榜。
  • 带权重的队列:分数代表优先级。
  • 范围查找:如处理价格区间、时间线数据。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值