Redis001 基础概念

SQL (Structured Query Language),中文意思是 结构化查询语言,代表为关系型数据库 而 NoSQL 则是 非结构化查询语言,代表为非关系型数据库。

我们的 Redis 就是一个非关系型数据库。

SQL 发音 belike:C 阔~

SQL 与 NoSQL 对比

特性SQLNoSQL
数据结构结构化 (Structured)非结构化
数据关联关联的 (Relational)无关联的
查询方式SQL 查询非 SQL
事务特性ACIDBASE
存储方式磁盘内存
扩展性垂直水平
使用场景1) 数据结构固定
2) 相关业务对数据安全性、一致性要求较高
1) 数据结构不固定
2) 对一致性要求不高
3) 对性能要求较高

NoSQL 主要类型: 1 键值类型 (Redis) 2 文档类型 (MongoDB) 3 列类型 (HBase) 4 Graph 类型 (Neo4j)


Redis 初见

1. 简介与工作原理

核心特性

  • Redis(Remote Dictionary Server),中文:远程字典服务器。
  • 定义:高性能内存型键值(Key-Value)数据库。
  • 主要用途:缓存系统、分布式锁、消息队列、排行榜、Session 共享、限流系统、GEO 地理位置、延迟队列、分布式 ID 生成等。
  • 五大优势:基于内存读写极快、支持丰富的数据结构、单线程模型(无线程切换与锁竞争)、支持高并发(单机 QPS 可达 10W ~ 20W+)、支持集群与高可用。

工作流与高性能设计

客户端请求 ──> [I/O 多路复用] ──> [单线程事件循环处理] ──> 返回结果
  • 高效支撑:基于内存访问 + 非阻塞 I/O 多路复用 + 高效数据结构(如 HashTable、SkipList、ZipList)。

2. 数据结构与应用场景映射

数据类型特性说明典型应用场景 / 核心机制
String(字符串)最基础类型,二进制安全缓存、计数器、分布式 ID、分布式锁(SETNX)、限流(INCREXPIRE
Hash(哈希表)键值对集合,适合存储对象用户信息、商品详情存储
List(列表)双向链表,有序可重复消息队列、异步削峰(双端操作)
Set(无序集合)无序去重集合,支持交差并集去重、共同好友/共同关注计算
SortedSet(ZSet)带权重分数(Score)的有序集合游戏排行榜、热点文章/积分排行(按分数排序)
Bitmap(位图)基于 String 的位操作(0/1 状态)签到统计、用户在线状态记录
HyperLogLog基数估计算法,极小内存占用网页独立访客(UV)统计
GEO地理位置坐标存储与计算附近的人、距离计算
Stream支持消费组(Consumer Group)的消息流完备的消息队列(MQ)

3. 数据持久化机制

持久化方式实现原理优缺点 / 特点
RDB (快照)在指定的时间间隔内,将内存数据整体保存到磁盘:恢复速度快、备份文件体积小。
:可能丢失最后一次快照后的修改。
AOF (追加日志)实时记录每次写操作命令,重启时重新执行命令恢复:数据安全性更高,数据丢失极少。
:文件体积大、恢复速度慢。
混合持久化RDB 快照 + AOF 增量日志 (Redis 4.0+ 支持)兼顾 RDB 的快速恢复与 AOF 的高数据安全性。

4. 主流数据库横向对比

4.1 Redis vs. MySQL

对比维度RedisMySQL
类型/介质内存型 KV 数据库关系型磁盘数据库
数据模型键值对,多种复杂数据结构二维数据表,支持复杂 SQL
读写性能极快(微秒级),QPS 10W+较慢(毫秒级),QPS 几千~上万
事务与一致性弱事务,最终一致性强一致性事务(ACID)
适用场景缓存、高并发、非核心临时数据核心业务数据持久化存储

4.2 Redis vs. MongoDB

对比维度RedisMongoDB
类型/格式内存型键值数据库磁盘文档数据库(BSON 格式)
查询能力较弱(主要基于 Key 定位)较强(支持多条件、复杂关联与索引)
数据量/持久化较小,内存容量受限,持久化可选大数据量支持,默认持久化落盘
适用场景缓存、排行榜、高吞吐计数非结构化/半结构化大数据存储

4.3 Redis vs. Memcached

对比维度RedisMemcached
数据类型丰富(String/Hash/List/Set/GEO等)仅支持 String 类型
功能支持支持持久化、事务、发布订阅、Lua 脚本仅纯缓存,不支持持久化、事务和脚本
集群架构原生支持 Cluster 分布式原生不支持,需依赖客户端或代理实现分布式
内存利用率较高较低

4.4 Redis vs. Elasticsearch (ES)

对比维度RedisElasticsearch
类型/核心键值数据库分布式搜索引擎(基于倒排索引)
核心能力极速读写、临时缓存深度文本检索、多维模糊查询与分析
模糊查询不支持(仅支持简单通配符)极强
适用场景高并发缓存、排行榜、临时队列全文搜索系统、日志分析(ELK)

5. 优缺点分析

优点说明缺点说明
速度极快基于内存读写内存昂贵硬件成本高
吞吐量大单机可达 10W+ QPS容量有限不适合存储超大规模数据
结构丰富原生支持 9 大数据类型数据易失极端宕机情况下存在丢数据风险
高可用性支持 Cluster、哨兵及持久化查询受限缺乏复杂 SQL 及多表关联支持

6. 缓存高可用常见问题及对策

问题类型现象定义解决方案
缓存穿透查询不存在的数据,请求越过缓存直达数据库,造成数据库压力。布隆过滤器:拦截非法请求;
缓存空值:对不存在的 Key 缓存短效空值。
缓存击穿热点 Key 失效瞬间,海量并发请求同时涌入数据库。互斥锁:使用分布式锁限制并发读取数据库;
② 设置热点数据永不过期
缓存雪崩大量 Key 同时失效或 Redis 宕机,导致数据库瞬间瘫痪。随机过期时间:在原有失效时间上增加随机扰动;
② 部署 Redis 高可用集群保障服务可用。

7. 经典应用架构

在互联网高并发系统中,通常由 Redis 负责”速度”,MySQL 负责”数据”,其标准协作流如下:

               用户请求 (Client)
                     │
                     ▼
             【 Redis 缓存层 】 ──── (命中直接返回,QPS 10W+)
                     │
                 (未命中)
                     ▼
             【 MySQL 数据库 】 ──── (落盘持久化,保证强一致性)

WSL2 (Ubuntu 24.04) Redis 安装、配置与 C++ 客户端集成笔记

1. 安装最新稳定版 Redis

1.1 安装工具并导入官方 GPG 密钥

sudo apt-get update
sudo apt-get install -y lsb-release curl gpg
curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg
sudo chmod 644 /usr/share/keyrings/redis-archive-keyring.gpg

1.2 添加官方 APT 软件源并安装

echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/redis.list
sudo apt-get update
sudo apt-get install -y redis

2. 配置并启动 Redis 服务

2.1 编辑配置文件

编辑 /etc/redis/redis.conf

sudo nano /etc/redis/redis.conf

配置 0.0.0.0 监听(允许外部连接):

bind 127.0.0.1 -::1 修改为:

bind 0.0.0.0

配置密码

取消 # requirepass foobared 的注释,并修改为您的密码:

requirepass yourpassword

进程守护(Daemonize)

由于使用 systemd 托管,保持默认的 daemonize nosupervised systemd 即可。

2.2 启动服务与设置自启动

# 启动并设置自启动
sudo systemctl enable --now redis-server

2.3 连接验证测试

redis-cli -a yourpassword ping
# 返回 PONG 即为成功

3. 编译配置 C++20 客户端 (redis-plus-plus)

3.1 安装编译环境与底层的 hiredis 开发包

必须提前安装,否则 C++ 库 CMake 会报错:

sudo apt install -y build-essential cmake git libhiredis-dev

3.2 源码编译安装 redis-plus-plus

git clone https://github.com/sewenew/redis-plus-plus.git
cd redis-plus-plus
mkdir build && cd build
# 指定使用 C++20 标准编译
cmake -DREDIS_PLUS_PLUS_CXX_STANDARD=20 ..
make
sudo make install
# 刷新动态库缓存
sudo ldconfig

4. 编写与编译 C++ 测试程序

4.1 创建测试项目

mkdir -p ~/redis_test && cd ~/redis_test
nano main.cpp

4.2 编写 main.cpp 代码

采用 C++20 语法,使用 ConnectionOptions 结构体进行连接,避免 URI 密码格式的解析歧义:

#include <sw/redis++/redis++.h>
#include <iostream>
#include <string>
#include <optional>

int main()
{
    try
    {
        // 使用配置结构体,无需担心密码中的特殊字符和默认用户名问题
        sw::redis::ConnectionOptions opts;
        opts.host = "127.0.0.1";
        opts.port = 6379;
        opts.password = "yourpassword";  // 设置您的实际密码

        auto redis = sw::redis::Redis(opts);

        std::cout << "正在连接 Redis..." << std::endl;

        // 1. 测试 Ping
        std::string ping_res = redis.ping();
        std::cout << "Ping 测试结果: " << ping_res << std::endl;

        // 2. 写入数据
        redis.set("cpp20_key", "Hello Redis!");

        // 3. 读取数据
        auto val = redis.get("cpp20_key");
        if (val.has_value())
        {
            std::cout << "成功读取值: " << val.value() << std::endl;
        }

        // 4. 清理数据
        redis.del("cpp20_key");

    }
    catch (const sw::redis::Error &e)
    {
        std::cerr << "Redis 异常: " << e.what() << std::endl;
        return 1;
    }
    return 0;
}

4.3 编译并运行

# 编译时必须链接 -lredis++ -lhiredis -pthread,并指定 -std=c++20
g++ -std=c++20 main.cpp -o test_redis -lredis++ -lhiredis -pthread

# 运行测试
./test_redis

总结一下

没啥可总结的,快点继续学习叭~