大到阿里,小到三线公司,缓存在大型分布式系统中的最佳应用( 四 )


(2)当成员数量增大时会自动转成真正的HashMap,此时encoding为ht 。
List
常用命令:lpush,rpush,lpop,rpop,lrange 。
应用场景:Redis list的应用场景非常多,也是Redis最重要的数据结构之一,比如twitter的关注列表,粉丝列表等都可以用Redis的list结构来实现 。
实现方式:Redis list的实现为一个双向链表,可以支持反向查找和遍历,方便操作 。不过带来了部分额外的内存开销,Redis内部的很多实现,包括发送缓冲队列等也都是用的这个数据结构 。
Set
常用命令:sadd,spop,smembers,sunion 。
应用场景:Redis set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set 是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的 。
实现方式:set的内部实现是一个value永远为null的HashMap,实际就是通过计算hash的方式来快速排重的,这也是set能提供判断一个成员是否在集合内的原因 。
Sorted set
常用命令:zadd、zrange、zrem、zcard 。
使用场景:Redis sorted set的使用场景与set类似,区别是set不是自动有序的,而sorted set可以通过用户额外提供一个优先级(score)的参数来为成员排序,并且是插入有序的,即自动排序 。当你需要一个有序的并且不重复的集合列表,可以选择sorted set数据结构,比如twitter 的public timeline可以以发表时间作为score来存储,这样获取时就是自动按时间排好序的 。
实现方式:Redis sorted set的内部使用HashMap和跳跃表(SkipList)来保证数据的存储和有序,HashMap里放的是成员到score的映射,而跳跃表里存放的 是所有的成员,排序依据是HashMap里存的score,使用跳跃表的结构可以获得比较高的查找效率,并且在实现上比较简单 。
Redis集群
(1)通过keepalived实现的高可用方案

大到阿里,小到三线公司,缓存在大型分布式系统中的最佳应用

文章插图
 
切换流程:
  1. 当Master挂了后,VIP漂移到Slave;Slave 上keepalived 通知redis 执行:slaveof no one ,开始提供业务;
  2. 当Master起来后,VIP 地址不变,Master的keepalived 通知redis 执行slaveof slave IP host,开始作为从同步数据;
  3. 依次类推 。
主从同时Down机情况:
  • 非计划性,不做考虑,一般也不会存在这种问题
  • 计划性重启,重启之前通过运维手段SAVE DUMP 主库数据;需要注意顺序:
  1. 关闭其中一台机器上所有redis,是得master全部切到另外一台机器(多实例部署,单机上既有主又有从的情况);并关闭机器
  2. 依次dump主上redis服务
  3. 关闭主
  4. 启动主,并等待数据load完毕
  5. 启动从
  6. 删除DUMP 文件(避免重启加载慢)
(2)使用Twemproxy 实现集群方案
特点:快、轻量级、减少后端Cache Server连接数、易配置、支持ketama、modula、random、常用hash分片算法 。
大到阿里,小到三线公司,缓存在大型分布式系统中的最佳应用

文章插图
 
这里使用keepalived实现高可用主备方案,解决proxy单点问题 。
优点:
  1. 对于客户端而言,redis集群是透明的,客户端简单,遍于动态扩容;
  2. Proxy为单点、处理一致性hash时,集群节点可用性检测不存在脑裂问题;
  3. 高性能,CPU密集型,而redis节点集群多CPU资源冗余,可部署在redis节点集群上,不需要额外设备 。
3、Memcache与Redis的比较
(1)数据结构:Memcache只支持key value存储方式,Redis支持更多的数据类型,比如Key value、hash、list、set、zset;
(2)多线程:Memcache支持多线程,Redis支持单线程;CPU利用方面Memcache优于Redis;
(3)持久化:Memcache不支持持久化,Redis支持持久化;
(4)内存利用率:Memcache高,Redis低(采用压缩的情况下比Memcache高);
(5)过期策略:Memcache过期后,不删除缓存,会导致下次取数据数据的问题,Redis有专门线程,清除缓存数据;
五、本地缓存
本地缓存是指应用内部的缓存,标准的分布式系统,一般有多级缓存构成 。本地缓存是离应用最近的缓存,一般可以将数据缓存到硬盘或内存 。
1、硬盘缓存
将数据缓存到硬盘到,读取时从硬盘读取 。原理是直接读取本机文件,减少了网络传输消耗,比通过网络读取数据库速度更快 。可以应用在对速度要求不是很高,但需要大量缓存存储的场景 。


推荐阅读