REDIS 详解

Redis是一款高性能的key-value数据库,支持多种数据结构,如String、List、Set、SortedSet和Hash,具备快速读写、数据持久化和事务处理能力。Redis适用于会话缓存、全页缓存、队列、排行榜和发布/订阅等多种场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Redis 笔记整理

(1)什么是 Redis?

Redis 是一个基于内存的高性能 Key-Value 数据库。其所有数据操作都在内存中完成,支持持久化,并提供丰富的数据结构,是一种 NoSQL 解决方案中广泛使用的中间件。


(2)Redis 的特点

  • 基于内存,性能极高,每秒可处理十万次以上的读写请求;
  • 支持丰富的数据结构(String、List、Set、ZSet、Hash);
  • 可设置过期时间,支持缓存自动失效;
  • 支持持久化(RDB 快照、AOF 日志);
  • 提供主从复制机制,支持分布式部署;
  • 单线程架构,避免了多线程的上下文切换开销;
  • 缺点:容量受限于物理内存,不适合海量数据的高性能读写。

(3)Redis 支持的数据类型

  • String:字符串
  • List:链表,可作队列/栈等
  • Set:集合,可去重、求交并差
  • Sorted Set:有序集合,适合排行榜等场景
  • Hash:键值对集合,适合对象存储

(4)为什么 Redis 需要把所有数据放在内存中?

为追求极致性能,Redis 将所有数据加载在内存中,实现 O(1) 的访问速度,定期通过异步方式持久化到磁盘。这样既保证了高性能,也保证了数据的可靠性。


(5)Redis 是单进程单线程的

  • 利用队列技术,将并发请求转为串行处理;
  • 避免加锁带来的开销,实现高性能的同时简化了并发控制。

(6)虚拟内存机制(已废弃)

  • 当 value 很大时可使用 VM 节省内存;
  • vm-max-threads 控制访问 swap 文件的线程数量,尽量不超过 CPU 核心数;
  • 当前 Redis 主流版本已不再推荐使用 VM 机制,更推荐使用分布式方案。

(7)Redis 的分布式能力

  • 支持主从结构(Master-Slave):
    • Master 写数据,Slave 读取数据;
    • 可实现读写分离,提高性能和可用性;
    • 一般采用链式复制结构:Master ← Slave1 ← Slave2…
  • 集群支持:
    • Redis Cluster 实现自动数据分片;
    • 每个分片可配置主从,提高容灾能力。

(8)读写分离模型

优点:

  • 写入由 Master 处理;
  • 读取由多个 Slave 提供,可线性扩展读能力;
  • 主从热备,提升可用性。

缺点:

  • 每个节点都保存全量数据,扩展能力有限;
  • 对写密集型应用不适合。

(9)数据分片模型

  • 将数据分散到多个节点,每个节点存储部分数据;
  • 可通过客户端或代理层实现;
  • 推荐 Redis Cluster 自带的分片机制,自动管理槽位。

(10)Redis 的回收策略(淘汰策略)

策略名描述
volatile-lru从设置过期时间的数据中淘汰最近最少使用的数据
volatile-ttl从设置过期时间的数据中淘汰快要过期的数据
volatile-random从设置过期时间的数据中随机淘汰
allkeys-lru从所有数据中淘汰最近最少使用的数据
allkeys-random从所有数据中随机淘汰
no-eviction不淘汰数据,插入失败返回错误(默认)

Redis 的优势总结

  • 内存级访问速度(类似 HashMap);
  • 数据类型丰富;
  • 支持原子操作事务;
  • 可持久化 + 高可用 + 多种缓存失效策略。

Redis vs Memcached 对比

特性RedisMemcached
数据持久化支持 RDB 和 AOF不支持
数据结构丰富(String、List、Set 等)仅支持 String
支持数据淘汰策略多种可选支持 LRU
最大 Value 大小1GB1MB
主从复制支持不支持

Redis 的性能问题与解决方案

  1. 避免 Master 写入快照(RDB)
    • 会阻塞主线程,应避免在主库执行;
  2. AOF 日志积压问题
    • 使用 BGREWRITEAOF 重写优化;
    • 尽量由 Slave 执行持久化;
  3. 主从复制稳定性
    • 建议主从部署在同一局域网;
    • 避免在主库高压时添加从库;
    • 使用链式复制结构,方便故障切换。

如何保证 Redis 存的都是热点数据?

策略:设置最大内存 + 合理的淘汰策略。

推荐淘汰策略:

  • allkeys-lru:可用内存有限时淘汰最不常访问数据;
  • 搭配后台程序检测热点数据,把冷数据从 Redis 中移除。

Redis 的适用场景

1. 会话缓存(Session Cache)

适合登录态、用户临时数据存储。

2. 全页缓存(FPC)

用于页面静态化后的缓存,结合持久化特性,提升用户体验。

3. 消息队列

利用 List 的 LPUSHRPOP 等操作,实现高性能轻量级队列系统。

4. 排行榜/计数器

使用 Sorted Set 实现排行榜,ZINCRBY 计分,ZRANGE 排名。

5. 发布/订阅

适合构建聊天系统、通知推送等 pub/sub 场景。


结语

Redis 是一个高性能、功能丰富、使用灵活的内存数据库,适合做缓存、消息队列、排行榜等场景,是现代架构中不可或缺的一部分。

### Redis 详细教程和功能解析 #### 一、Redis 简介 Redis 是一个开源的内存数据结构存储系统,可以用作数据库、缓存和消息中间件。它支持多种数据结构,如字符串(Strings)、哈希(Hashes)、列表(Lists)、集合(Sets)、有序集合(Sorted Sets)等[^3]。此外,Redis 提供了丰富的功能,包括事务支持、发布/订阅模式、Lua 脚本执行以及持久化选项。 #### 二、Redis 的用途 Redis 广泛应用于以下场景: - **缓存**:通过将频繁访问的数据存储在内存中,显著提高应用性能。 - **消息队列**:利用 Redis 的列表数据结构实现高效的队列管理。 - **会话存储**:存储用户会话信息,减少对传统数据库的压力。 - **计数器**:使用原子操作实现高并发环境下的计数功能。 - **地理位置查询**:借助 Geospatial 功能提供基于地理位置的服务[^2]。 #### 三、Redis 的特性 1. **高性能**:由于数据存储在内存中,Redis 的读写速度极快,每秒可处理数十万次请求。 2. **持久化支持**:提供 RDB(快照)和 AOF(追加日志)两种持久化方式,确保数据安全。 3. **丰富的数据结构**:支持多种数据类型,便于开发人员灵活处理复杂业务逻辑。 4. **分布式支持**:通过 Redis Cluster 实现水平扩展,满足大规模数据存储需求。 5. **多语言支持**:几乎所有的主流编程语言都提供了 Redis 客户端库[^3]。 #### 四、Redis 的 IO 模型 Redis 的 IO 模型主要包括单线程模型、混合线程模型和多线程模型: - **单线程模型**:Redis 主线程负责所有命令的处理,保证操作的原子性。 - **混合线程模型**:在网络 IO 和文件持久化过程中引入多线程,提升整体性能。 - **多线程模型**:从 Redis 6.0 开始,支持多线程处理网络请求,进一步增强并发能力[^1]。 #### 五、Redis 的安装与配置 以 Windows 系统为例,可以通过以下步骤安装 Redis: 1. 下载适用于 Windows 的 Redis 可执行文件或使用 Docker 镜像。 2. 解压后运行 `redis-server.exe` 启动服务。 3. 使用 `redis-cli.exe` 连接 Redis 服务器并测试基本命令[^3]。 #### 六、Redis 的核心功能解析 以下是 Redis 的一些核心功能及其使用方法: 1. **字符串(String)** ```python import redis r = redis.Redis(host='localhost', port=6379, db=0) r.set('key', 'value') # 设置键值对 print(r.get('key')) # 获取键对应的值 ``` 2. **哈希(Hash)** ```python r.hset('user:1000', mapping={'name': 'Alice', 'age': 25}) # 设置哈希字段 print(r.hgetall('user:1000')) # 获取整个哈希内容 ``` 3. **列表(List)** ```python r.lpush('queue', 'task1') # 左侧插入元素 r.rpush('queue', 'task2') # 右侧插入元素 print(r.lrange('queue', 0, -1)) # 获取列表中的所有元素 ``` 4. **集合(Set)** ```python r.sadd('fruits', 'apple', 'banana', 'orange') # 添加元素到集合 print(r.smembers('fruits')) # 获取集合中的所有成员 ``` 5. **有序集合(Sorted Set)** ```python r.zadd('scores', {'Alice': 100, 'Bob': 200, 'Charlie': 150}) # 插入带分数的元素 print(r.zrange('scores', 0, -1, withscores=True)) # 按分数排序获取元素 ``` 6. **Geospatial 功能** ```python r.geoadd('locations', longitude=116.3974, latitude=39.9075, member='Beijing') # 添加地理坐标 print(r.georadius('locations', 116.3974, 39.9075, 10, unit='km')) # 查询指定范围内的位置 ``` #### 七、Redis 的优缺点总结 - **优点**: - 极高的性能,适合需要快速响应的应用场景。 - 支持多种数据结构,能够灵活应对不同业务需求。 - 提供持久化功能,保障数据可靠性。 - **缺点**: - 数据存储在内存中,成本较高。 - 大规模数据存储时需要考虑分片和集群管理的复杂性[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值