Redis框架原理

本文详细介绍了Redis的框架原理,包括其内存数据库特性、数据类型(如String、List、Hash、Set和Zset)、单线程或多线程模型、持久化策略(AOF和RDB)、高可用性技术(主从复制、哨兵和切片集群)以及缓存一致性与分布式锁的实现。

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

写在前面

  • 这里主要记录一下Redis的框架原理;

一、Redis概述

1. 定义

  • 是一种基于内存的数据库;
  • 对数据的读写操作都是在内存中完成的;

2. 特点

  • (1) 高性能:

    • 直接在内存读写,速度非常快;
  • (2) 高并发:

    • 采用I/O多路复用机制,可以用一个线程处理多个I/O流;
    • Redis6.0后,采用多个I/O线程处理网络请求;

二、数据类型

  • Redis支持的五种常用的value数据类型如下:
    • String:字符串;
    • Hash:哈希;
    • List:列表;
    • Set:集合;
    • Zset:有序集合;

数据类型

1. String

  • 可以存放字符串或者数字(整数或者浮点数);
  • 最大数据长度是512M
1.1 内部实现
  • 使用int和简单动态字符串SDS

内部实现

  • 有三种编码方式:

    • int:保存可以用long类型表示的整数;
    • embstr:保存小于等于32字节的短字符串;
    • raw:保存大于32字节的长字符串;
  • (1) int只需要保存redisObject和整数即可:

不需要SDS

  • (2) embstrredisObjectSDS空间是连续分配的:

连续分配空间

  • (3) rawredisObjectSDS空间是分别分配的;

分开分配空间

1.2 应用场景
  • (1) 缓存对象:

    • 直接用value缓存整个对象的JSON;
    • key = object.成员变量value拆分对象内容进行缓存;
  • (2) 常规计数;

    • 记录访问次数等;
  • (3) 共享Session信息;

    • 让分布式系统中的所有服务器都去Redis中取用户的Session信息;

2. List

  • 用于存放字符串数组
  • 列表的最大长度是2^32-1
2.1 内部实现
  • 在Redis3.2前:

    • 元素个数少于512,且每个元素值小于64字节,用压缩列表
    • 否则,使用双向链表
  • 在Redis3.2之后:

    • 只使用快速列表

下面介绍两种压缩列表和quicklist的数据结构;

  • (1) 压缩列表ziplist

    • 使用连续内存空间保存链表数据;
    • 只适合保存小规模数据;
    • 因为每个节点都记录前一个节点的长度,所以会有连锁更新问题;
      压缩列表
  • (2) 快速列表quicklist

    • 是压缩列表和双向链表的混合体;
    • 总体是双向链表,可以方便扩展元素;
    • 每个链表节点都是一个压缩列表,进而可以节约空间;

### Scrapy-Redis 工作原理及实现机制 #### 1. 基本概念 Scrapy是一个强大的爬虫框架,但默认情况下并不支持分布式部署。为了使Scrapy能够在一个集群环境中高效运作,Scrapy-Redis应运而生[^3]。 #### 2. 架构设计 在Scrapy-Redis架构下,存在一个核心服务器(master),负责管理和调度任务队列;以及若干个工作节点(slave),它们会从共享的任务队列中获取URL并执行具体的网页抓取操作[^4]。 #### 3. 数据存储与通信方式 通过引入Redis作为中间件来协调不同实例间的数据交换过程。具体而言: - **请求去重**:利用Redis集合(set)特性保存已访问过的链接地址,从而有效防止重复下载相同页面。 - **待处理URL管理**:采用列表(list)结构维护等待被解析的新网址记录,并允许各worker进程从中提取未完成项继续作业。 - **数据持久化**:对于采集到的信息,则可以借助其他类型的NoSQL数据库(如MongoDB)或是关系型数据库进行长期存档[^1]。 #### 4. 关键组件说明 针对上述需求场景,Scrapy-Redis重新定义了几类重要对象以适应新的工作流模式: - `Scheduler` 调度器:继承自原版Scrapy中的同名部件,增加了对Redis的支持功能,确保所有参与协作的spider都能同步读写相同的pending request pool。 - `DupeFilter` 请求过滤器:基于Redis set实现高效的url seen check逻辑,避免不必要的网络I/O开销。 - `Pipeline` 输出管道:除了常规文件/数据库导出外,还提供了向远程服务推送item的能力,便于后续数据分析环节接入更多外部资源[^2]。 ```python from scrapy_redis.spiders import RedisSpider class MyCrawler(RedisSpider): name = 'my_spider' allowed_domains = ['example.com'] redis_key = 'start_urls' def parse(self, response): # 解析响应内容... pass ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值