Java面试之Redis
Redis简介
主流架构:
缓存中间件 — Memcache 和 Redis 的区别
Memcache:代码层次类似Hash
支持简单的数据类型
不支持数据持久化存储
不支持主从
主从同步是MySQL数据库复制技术的一种应用,通过将主服务器上的数据更改复制到一个或多个从服务器,实现数据的自动同步。在主从同步过程中,一台服务器充当主服务器(Master),接收用户数据更新,而另一台或多台服务器充当从服务器(Slave),接收来自主服务器的binlog内容,解析出SQL语句,从而使得主从服务器的数据保持一致。
不支持分片,即Sharding
Sharding 即 将整个数据库打碎的过程,可理解为将大数据分布到多个物理节点上的分区方案。
分片(Sharding)是一种与水平切分(horizontal partitioning)相关的数据库架构模式。它将一个数据库表中的行分成多个不同的表(称为分区),每个分区都具有相同的模式和列,但数据行完全不同。这样,数据被分成多个较小的块(逻辑分片),然后分布在单独的数据库节点上(物理分片)。数据分布在不同节点上,但共同代表整个数据集,实现了数据库的横向扩展,以适应大量数据和高流量的需求。
Redis:
数据类型丰富
支持数据磁盘持久化存储
支持主从
支持分片(Redis 3.0 版本之后)
Redis 为什么这么快
官方公布:100000+QPS(QPS即 query per second,每秒内查询次数)
完全基于内存,绝大部分请求是纯粹的内存操作,执行效率高;
Redis采取的是单进程、单线程模型的 Key:Value 数据库,由C语言编写,它将数据存储在内存内,读写时不会受到硬盘I/O速度的限制。
数据结构简单,对数据操作也简单;
Redis不使用*,不强制要求预定义数据结构,也不强制要求用户去对存储的不同数据进行关联,性能相比关系型数据库要高出不止一个量级。其存储结构就是键值对,类似于HashMap,HashMap的优势就是可以以O(1)的时间复杂度进行查找、插入和删除操作。
采用单线程,单线程也能处理高并发请求,想多核也可启动多实例;
使用多路 I/O 复用模型,非阻塞IO;
多路 I/O 复用模型
FD:File Descriptor,文件描述符
一个打开的文件通过唯一的描述符进行引用,该描述符是打开文件的元数据到文件本身的映射。
传统的阻塞 I/O 模型
Select系统调用
Redis采用的I/O多路复用函数
epoll / kqueue / evport / select ?
因地制宜
优先选择时间复杂度为 O(1) 的
I/O
多路复用函数作为底层实现以时间复杂度为 O(n) 的
Select
作为保底基于 react 设计模式监听 I/O 事件