分布式缓存:
缓存这种能够提升指令和数据读取速度的特性,随着本地计算机系统向分布式系统的扩展,在分布式计算领域中得到了广泛的应用,称为分布式缓存。分布式缓存能够高性能地读取数据、能够动态地扩展缓存节点、能够自动发现和切换故障节点、能够自动均衡数据分区,而且能够为使用者提供图形化的管理界面,部署和维护都十分方便。
既然是缓存,那么本质还是存储一些数据,与本地缓存一样,当请求进来时,先去缓存中查找,缓存中存在直接返回缓存中的数据,否则进入数据库查找。所谓分布式缓存,即在分布式环境下的缓存,所有节点都能共享缓存,简单的说就是把本地缓存的缓存内存移到一个共享的地方,就像数据库一样,不管哪个客户端都能访问到。
先来了解下分布式缓存,常用的分布式缓存有Redis、MongoDB、Memcached、HBase。。。它们都是NoSq(Not Only SQL)数据库,NoSql是指非关系型数据库,我们常用的SQLserver、MySQL。。。都是关系型数据库,这些数据库用来存储重要信息,对于日常使用没问题,当面对大规模高并发的时候就有些无力,这个时候NoSq可以更好的应对。
Redis与Memcached对比:
对比项 | Redis | Memcached |
高可用 | 支持主从节点复制配置,从节点可使用RDB和缓存的AOF命令进行同步和恢复;支持Sentinel和Cluster(从3.0版本开始)等高可用集群方案 | memcached服务器互不通信,分布式部署取决于memcached客户端,需要二次开发 |
队列 | 支持lpush/brpop、publish/subscribe/psubscribe等队列和订阅模式 | 不支持队列,可通过第三方MemcachQ来实现 |
适用场景 | 复杂的数据结构,有持久化、高可用需求 | 只需key-value数据结构,数量量非常大,并发量非常大的业务 |
过期策略 | 主动过期 +惰性过期 | 懒淘汰机制,每次往缓存放入数据的时候,都会存一个时间,在读取的时候要和设置的时间做 TTL 比较来判断是否过期。 |
虚拟内存使用 | 有自己的VM机制,理论上能够存储比物理内存更多的数据,当数据超量时,为引发swap,把冷数据刷到磁盘上 | 所有的数据储存在物理内存里 |
网络模型 | 非阻塞I/O模型 ,提供一些非KV存储之外的排序,集合功能,在执行这些功能时,复杂的CPU计算会阻塞整个I/O调度 | 非阻塞I/O模型 ,但是使用了多线程,不会出现一个逻辑复杂的请求阻塞对其它请求的响应的场景 |
数据结构 | key-value,哈希,列表,集合,有序集合 | 纯key-value |
持久化 | 有,RDB和AOF | 无 |
存储value容量 | 最大512M | 最大1M |
多线程 | 支持单线程 | 支持多线程,CPU利用方面优于Redis |
单机QPS | 约10W | 约60W |