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 文件
  • 可扩展视角 - 对应好这个指标
    • 数据分片
    • 负载均衡
  • Redis API

Redis用到的数据结构

  • 跳表
  • 布隆过滤器
  • 位图
  • 延时队列

Redis用到的算法

  • 限流算法
  • GeoHash

Redis的实践

  • Redis做消息队列,业界有日活百万的案例.
  • Redis所在的宿主机挂了之后怎么办?

Redis的未来