现在,缓存系统的应用很是普遍,可以用来提升并发数、数据吞吐量,提升快速响应能力。那么当数据量达到必定程度,单机环境可能就显得有些力不从心了,就须要一个分布式缓存系统。java
1.1 缓存分类node
如上图所示,首先缓存大体能够分为四大类。程序员
1.2 分布式缓存redis
本文主要探讨各分布式缓存系统,如图 1-1 所示,列出了五种:算法
其中 EvCache 和 Aerospike 使用场景不是那么通用和普遍。spring
除此以外,还有三种常见缓存系统。数据库
综上所述,在通常状况下,考虑到适用性和稳定性,Redis 是搭建缓存系统的最优选择。如下将基于 Redis 介绍。设计模式
如顶部图 1-1 所示,列出了 Redis 的集群高可用的方案,基本能够分为三种。缓存
2.1 主从机制服务器
常见的集群架构,搭建简单,主要实现读写分离和备份,能够由 Master 负责读写,Slave 负责备份。但存在故障恢复复杂、水平拓展难、写能力受限等问题。结构图以下:
2.2 哨兵机制
Redis Sentinel 是社区版本推出的原生高可用解决方案。由一或多个哨兵实例监视任意个主从服务器,且在 Master 宕机时,自动将宕机服务器属下的 Slave 服务器升级为 主服务器,从而保证系统的可用性。较主从实现的监控、选主。但问题主要是要保证 Master 的 HA 切换。结构图以下:
2.3 "分布式"
到这里以上两种机制其实只能算做“集群”,并不是严格意义上的“分布式”。接着来看看分布式方案。
集群强调高可用,分布式在集群的基础上又强调协做。
任何分布式存储系统,首先面临的就是 sharding(分片)问题,如顶部图 1-1 所示该问题有为三种解决方法。
3.1 客户端分片
顾名思义,将数据分片的路由功能交给客户端,但这是一种静态分片,维护性差。基本是不予考虑的。
3.2 代理分片
经过代理分发到具体的 redis 实例。有两个经常使用解决方案。
其实,这两种代理分片的方案,都是在 Redis 官方未推出良好的分布式方案时的产生的,在官方更新提供更优策略后都再也不维护。
3.3 服务器端分片
这就要谈到 Redis 官方方案 Redis-cluster 。
在 Redis 3.0 以前是没有较好的分布式方案的,这也是第三方方案出现的缘由。3.0 开始,官方推出了去中心化的分布式方案。集群中包含 16384 个散列槽,每一个节点负责其中一部分。
先看下拓扑图:
每一个节点打开两个 TCP 链接,一个负责给客户端提供服务,一个负责节点间通讯。
此刻要说说 CAP 了 :Consistency(一致性)、Availability(可用性)、Partition tolerance(分区容错性) 。对分布式系统而言,CAP 必须牺牲一者。Redis Cluster 的设计目标主要是高性能、高可用和高扩展,只好抛弃一部分数据一致性。
以上介绍了简单介绍了常见缓存系统,并具体列出了基于 Redis 的集群方案。下面谈一谈缓存系统常见的问题。
以下图所示,列出七个常见问题。
4.1. 缓存穿透
指访问不存在的数据,从而绕过缓存,直接请求到了数据源,当请求过多,就会对 DB 形成压力。
4.2. 缓存击穿
缓存击穿实际是缓存雪崩的一个特例。指当某些热点 key 过时时,就会有大量的请求击穿到 DB。
4.3. 缓存雪崩
同一时刻大量缓存失效(故障), 请求到了 DB。
4.4. 缓存更新与一致性
若是保证数据一致性。列出四种更新策略:
4.5. 热点数据
对于热点数据的处理方法。
4.6. 缓存预热
指能够将某些的缓存数据提早加载到缓存系统,提早避免在如热点数据大量请求到库。
4.7. 缓存降级
指当访问量剧增、服务出现问题或非核心服务影响到核心流程的性能时,仍需保证主服务可用。可根据一些关键数据自动降级,也可配置开关人工降级。
对于 Redis Cluster 环境的搭建和基础使用很是简单。
不管基于何种方式,只要搭建好 n 台 redis 服务并保证各服务间能够互相通信后,任意进入一个 redis 服务键入:
redis-cli --cluster create IP1:port1 IP2:port2 IP3:port3 IP4:port4 IP5:port5 IP6:port6 ... --cluster-replicas 1
便可。以后可使用 cluster node 和 cluster info 命令查看集群、节点信息。
而对于广大 JAVA 开发,Spring Data Redis 从 1.7 起即支持 Redis Cluster,只需配置 Master 节点地址(和密码)。
spring.redis.cluster.nodes=ip1:port1,ip2:port2,ip3:port3
加入依赖
compile("org.springframework.boot:spring-boot-starter-data-redis")
便可经过 RedisTemplate 使用。
本文从缓存系统的选择出发,基于 Redis 介绍了几种集群方案并重点说明了 Redis Cluster 方案。以后列出缓存系统常见问题及常看法决方案,最后对使用作了简单说明。
固然,如何去落地,如何解决这些问题还须要根据实际场景具体分析和处理。
推荐阅读:
======
刷Github时发现了一本阿里大神的算法笔记!标星70.5K
为何阿里巴巴的程序员成长速度这么快,看完他们的内部资料我懂了
若是你以为这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
点赞,转发,有大家的 『点赞和评论』,才是我创造的动力。
关注公众号 『 Java斗帝 』,不按期分享原创知识。
同时能够期待后续文章ing🚀