Redis缓存技术

缓存的作用对于高性能的软件架构来说必不可少, 缓存通过在内存中存储少量的数据,提供高速读写访问。高并发环境下, 大量的数据请求涌向数据库,而内存读写的速度远远快于磁盘的读写速度,为了提高系统响应速度、 减轻数据的访问压力,可以采用缓存方案。 同时, 由于单台机器的存储空间和承载能力有限,若大量采用本地缓存使得相同的数据在不同的节点进行存储, 极大地浪费了内存的存储空间, 所以需要采用分布式缓存方案[杨开杰等,2010],在本系统中将基于Redis 实现分布式缓存。
Redis 指的是 Remote Dictionary Server, 即远程字典数据库。 Redis 是一个开源的, 基于内存、可持久化、 键值对数据库的高性能缓存系统[黄健宏,2014]。支持诸多数据结构, 包括 List、Map、String、Set、SortedSet 等[Schindler, 2013],这点与市场上的同类产品 Memcache 不同, Memcache 中没有提供如此丰富的数据结构。为了保证读写速度, Redis 将数据存储在内存中,但是由于内存资源的限制, 单个 Redis 无法很好完成业务需求,需要部署 Redis 集群来进行内容扩充。 为了实现分布式缓存, 通过对 key 做一致性哈希, 选择相应的 Redis 节点进行数据缓存访问。 一致性哈希算法是用于解决传统哈希算法产生的诸多问题所提出的算法。传统哈希中, 通过对 key 进行 hash 将前台的缓存访问请求均衡地分发到多台 Redis 缓存服务器中,此时存在的问题是, 若需要增加新的缓存服务器时, 大部分的 key 会重新分布, 导致大量的数据访问请求涌向数据库性能极速下
降[Xu et al., 2014]。而一致性哈希算法中将实现哈希环结构,通过哈希值降缓存服务器放置于环上的某个节点,计算 key 的哈希值后顺时针找到最近的服务节点,将数据存放在该节点的服务器上。这样的尽可能小的改变已经存在的 key 的映射关系,避免大量的 key 重新映射。 但是同时这样的做法又存在负载均衡问题:一个新增的节点分担了顺时针下一个节点的请求,减少了这两个节点的负载压力,却没有影响到其他的服务器, 负载不均衡导致内存资源的浪费。 本系统使用虚拟节点的方式解决负载均衡问题, 将原先的服务器节点分成多个虚拟节点,
该组虚拟节点映射到同一个服务器, 然后将该组多个虚拟节点通过哈希均匀分布到哈希环中。 这样以来, 即使新增一台缓存服务器, 该缓存服务器的多个虚拟节点将影响到更多的虚拟节点, 更好地解决了负载均衡问题。
Redis 支持数据持久化功能,现在有两种方式实现: 快照和附加文件 AOF。快照的方式意味着定时将数据从内存存储到二进制文件中。 AOF 开启时将会将每个写命令通过写函数追加到 AOF 文件中。
Redis 提供集群部署的完整解决方案,支持数据备份,支持主从模式。一个master 节点可以拥有多个 slave 节点,同时 slave 节点也可以拥有多个下属节点。 master 节点将数据同步到 slave 节点,若 master 节点崩溃,将在多个节点种选择新的 master 节点。

Redis分布式缓存

Redis 的全称是 Remote Dictionary Server,是由一个意大利人使用 C 语言编写的、开源的、高性能的键值对缓存与存储系统[28],基于内存运行并支持持久化。 Redis 不仅能够提供事务功能,而且在某些方面弥补了关系数据库存储的不足。

Redis 的优势主要表现为四个方面。

  1. 性能高: Redis 的写入速度达到八万一千次每秒,而读取的速度可以达到十一万次每秒[14];
  2. 丰富的数据类型: Redis 支持列表、集合、字符串等数据类型, 并且对不同数据类型提供便捷的操作方式;
  3. 原子性: Redis 的单线程特性保证了操作的原子性,从而能够保证不同用户访问到最新的数据;
  4. 功能丰富: Redis 可以在多个场景中应用,如消息队列、任务队列、缓存等。


利用分布式缓存实现微服务的无状态化以及进行服务间通信是 Redis 在微服务中的两个主要应用场景。