redis 概念
官网介绍如下
redis 的初心,是作为 "消息中间件" 来用, 但是因为业内有更专业的消息中间件 (RabbitMQ …), 因此使用不多, 但是如果只是简单的消息获取,转发,也可以用redis,而不必花费大力气添加其他消息中间件
作为数据库使用, 相对于 MySQL 来说, 存储空间有限是最大的劣势,但因为其快,所有更多作为缓存来使用
如何使得存储数据又大 (不是) 又快?
把 redis 和 MySQL (或 Oracle 之类的), 结合起来使用
redis 存储热点数据, MySQL 存储所有数据, 查询数据时从redis开始, 查不到再去MySQL
redis 是在分布式系统中的大杀器, 单机系统中, 直接使用变量存储数据, 会比使用 redis 快得多. (redis 是的,可以把自己的内存分配给别的进程, 甚至是别的主机使用)
几个相关概念
应用(Application) / 系统(System)
一个应用, 就是一个组 / 服务器程序
模块(Model) / 组件(Component)
一个应用, 里面有多个功能, 每一个功能, 可称为一个 模块 / 组件
分布式(Distributed)
引入多个主机 / 服务器, 协同配合完成一系列的工作 (物理上的主机)
集群(Cluster)
引入多个主机 / 服务器, 协同配合完成一系列的工作 (逻辑上的主机)
分布式和集群的区别
分布式: 多个系统协同完成一个特定任务的系统
集群: 在几个服务器上部署相同的应用程序来分担客户端的请求
简单理解:
分布式: 把一个大业务拆成几个小业务, 每个小业务均是独立的系统, 子业务之间相互协作
集群: 处理同一个业务, 但是由系统部署多个节点
分布式的子节点也可以由集群构成
主(Master) / 从(Slave)
构成分布式的一个比较奇特的结构, 多个服务器节点中, 一个是主, 其余是> 从. 从节点的数据, 要从主节点同步.
中间件(Middleware)
更复杂的东西了,xdm 自己搜 (其实简单理解就是字面意义, 我是老板, 下面有几十个员工, 分派任务很麻烦, 但是中间有个经理, 我就只把任务告诉经理就 ok, 可以减少我的工作量, 我可以只做主要工作即可)
可用性(Availability)
(一个系统的第一要务)
系统整体可用的时间 / 总的时间
响应时间(Response Time 即 RT)
吞吐(Throughput) vs 并发(Concurrent)
(响应时间和吞吐并发 可以用来衡量服务器的性能)
Redis 特性
在内存中存储
使用键值对方式来存储组织结构, “非关系型数据库”
可编程性
使用 Lua 语言 (撸啊)
可拓展性
Redis 提供了一组API, 以便于用户使用过程中对原有功能进行在拓展
持久化
Redis 虽然是基于内存, 但是会把数据在硬盘上备份 (内存为主, 硬盘为辅)
即 Redis 重启或退出前会将内存中的数据备份一份到硬盘, 每次启用也会从硬盘上加载数据
支持集群
上面写过,集群与分布式配合使用, 类似于 “分库分表”
一个 Redis 能存储的数据是有限的(内存空间有限)
因此可以引入多个主句,部署多个 Redis 节点, 每个 Redis 存储数据的一部分
高可用性 ⇒ 冗余 / 备份
Redis 自身支持 "主 / 从"结构, 从节点就相当于主节点的备份
即 主节点挂了, 从节点顶上, 减小 bug 对程序运行的影响
Redis 为什么快
- Redis 直接操作内存, 肯定比访问硬盘的数据库快
- Redis 核心功能都是简单的逻辑 (老板给员工分任务, 肯定比员工做任务, 要简单的多得多)
- Redis 使用了 IO 多路复用的方式 (epoll) (简单说就是使用一个线程, 管理多个 socket , 毕竟不是每一个 socket 都会时刻被用到, 那单独占一个线程, 会很浪费资源)
- Redis 使用单线程模型, 减少了不要用的线程之间的竞争开销 (宏观多线程并发进行, 即多个地方同时使用 Redis 但是消息到达 Redis, 会在一个队列中排队, Redis 会单个进行调用, 即微观上是单线程)
- Redis 是C语言开发的(存疑, MySQL也是C语言开发的,但是二者之间的运行速度可谓天差地别,只能说相对于 java, py 实现的 Redis 来说, C语言实现确实快一点)
(PS: 因为快,所以小 [不是], 所以不建议存储大量数据 )