Java之效率管家 - Redis
计算机有两大问题,一个是命名问题,一个是缓存失效。缓存在整个计算机体系里无处不在
- CPU - CPU缓存
- 操作系统 - Page Cache
- 数据库 - 数据库缓存
- 浏览器 - 浏览器缓存
这篇文章主要是探讨一下缓存的通用问题以及Redis相关问题
- 缓存概述
- Redis历史
- 什么是Redis
- 为什么是Redis
- Redis是如何实现的
- Redis实践
- Redis的未来
缓存概述
什么是缓存
没有看到缓存的通用定义,这里尝试定义一下. 我们有系统X, C, D,这三个系统有如下特征
- 系统X可以从C和D拿到同样的数据
- 系统X从C拿到的数据比从D拿到的数据更快
- 系统C的数据是来自于D
如果上述三个条件满足,那么系统C可以称做为D的缓存.
为什么需要缓存
如果系统D满足不了单位时间内多次请求,那么系统C一定是存在的. 原因是
- 系统C比系统D更快,那么可以提供更好的用户体验.
实现一个缓存会遇到什么问题?
* 缓存更新策略
* Cache Aside Pattern
* Write / Read Through Pattern
* Write Behind Caching Pattern
Redis历史
2008年,一家意大利公司Merzia推出了一个几个基于Mysql的实时统计系统,但是该公司的创始人Salvatore Sanfilippo对这套系统感到失望,于是自己对这套系统量身定做了一个数据库,且在2009年开发完成, 这就是Redis. 所以这就是比较典型的思路:有了一个痛点,然后才有了一个技术。 而现在不少公司的思路是反的:不管有没有痛点,先用高大上的技术再说.
2010年VMware公司赞助Redis, Salvatore Sanfilippo和另外一位开发者加入了VMware公司,全职开发Redis. 所以也是当时的一个痛点问题,改变了作者的人生之路.
什么是Redis
我看看官网上Redis的定义:
Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache and message broker
在我们的印象中,数据库是指MySql, Sql Server,或者Oracle. 所以从这里看得出Redis的定位是多种多样的,可以做缓存,数据库或者消息队列.
但有点事实可以确定
- 相比于Kafka, Redis的消息队列没那么专业
从核心行为的角度来看:Redis是一个支持Key, value的存储系统. 换句话说, Redis的灵魂在于Key,Value.
为什么是Redis
Redis是如何实现的
整体设计目标
- 如何又快又好的实现一个Key, Value存储?
所以可以设想一个最简单的Key, Value的存储, 它应该支持
- 支持数据的增删改查
- 数据类型多样
- 最好支持集群功能 - 或者说任何的框架都应该支持集群功能
原则
N/A
模式
Redis也是基于Reactor模式来实现的,这一点和Netty类似.
实现
- 高性能视角 - 对应快这个指标
- 高可用视角 - 对应好这个指标
- 分布式维度
- 主从库模式
- 全量复制
- 基于长连接的命令传播
- 增量复制
- 哨兵机制
- 集群
- 主从库模式
- 容错维度
- AOF日志 - 先更新缓存,然后再更新日志,这样可以得出一个结论:只有日志里有记录,就一定有执行过缓存的命令 。
- 优点
- 缺点
- 内存快照 - RDB 文件
- AOF日志 - 先更新缓存,然后再更新日志,这样可以得出一个结论:只有日志里有记录,就一定有执行过缓存的命令 。
- 分布式维度
- 可扩展视角 - 对应好这个指标
- 数据分片
- 负载均衡
- Redis API
Redis用到的数据结构
- 跳表
- 布隆过滤器
- 位图
- 延时队列
Redis用到的算法
- 限流算法
- GeoHash
Redis的实践
- Redis做消息队列,业界有日活百万的案例.
- Redis所在的宿主机挂了之后怎么办?