第一个是什么是Redis?
Redis是一个基于内存、可持续日志和密钥值数据库的高性能存储系统,提供多语言API。
第二,背景出现
对数据结构(Data Structure )的需求日益增长,但memcache没有,这将影响开发效率
性能需要随着读取操作量的增加而解决,所经历的过程为:
读/写隔离(M/S )数据库移动到memcache redis,使用多个从属(增加缓存)
解决写作问题:
水平拆分,拆分表,将一个用户放在此表中,将一个用户放在另一个表中;
可靠性需求
Cache的“雪崩”问题让人头疼
Cache面临着快速恢复的挑战
开发成本要求
Cache和DB的一致性维护成本越来越高()清理DB再清理缓存,不行,太晚了! )
为了应对急剧增加的产品需求,需要开发
硬件成本最高的是数据库级计算机,基本上比前端计算机高数倍,主要是IO密集型,占用硬件
维护性复杂
一致性维护成本越来越高;
BerkeleyDB使用b树总是写新的东西,内部没有文件重组; 文件大小变大;大时需要文件归档,归档操作定期进行;
这样,需要一定的下降时间;
基于以上想法,选择了Redis
第三,Redis在新浪微博上的应用
Redis介绍
1.5种数据结构
支持strings、hashes、lists、sets和sorted sets
string是一种很好的存储方式,用作计数存储。 sets被用来创建索引库
2. K-V存储vs K-V缓存
新浪微博目前98%用于持续化的APP应用,2%用于缓存,600服务器
持久化在Redis中的应用和非持久化的方法没有很大的不同:
不持续化的为8-9万tps,持续化的为7-8万tps左右
使用持久化时,需要考虑持久化和写入性能的配合比,即redis使用的存储器大小和硬盘写入速度的比率来进行计算
3 .社区活跃
Redis目前拥有3万多行代码,代码编写简洁,实现巧妙,作者技术洁癖
Redis的社区活跃度很高,这是衡量开源软件质量的重要指标,开源软件初期一般没有商业技术服务支持,如果没有活跃的社区支持,出现问题也要寻求帮助
Redis的基本原理
redis持久化(aof ) append在线文件:
写log(AOF ),并与内存合并到一定程度。 追加追加。 按顺序写光盘。 对性能的影响非常小
1 .单实例单进程
由于Redis使用单个进程,因此在配置时每个实例只使用一个CPU。
如果在配置期间需要最大化CPU利用率,则可以配置与CPU数量对应的Redis实例数和与端口数对应的Redis实例数(8核CPU、8实例和8端口),以提高并发性
单机测试时,一个数据200字节,测试结果为8~9万tps;
2 .复制
进程:的数据由mastermaster存储在slave的rdb中,slave将rdb加载到内存中。
在网络断开并连接后,“存储点”(save point ) :将继续传输。
主存储区中的第一个同步是所有路径,然后是增量同步; 在、
3 .数据一致性
长期运行后,多个节点之间可能发生不一致;
开发两个工具程序:
1 .对数据量大的数据,周期性进行总量检查;
2 .实时检查增量数据,是否一致;
由于主库与从库不及时同步而导致的不一致称为延迟问题;
对于一致性要求不那么严格的场景,只需要保证最终的一致性即可
对于延迟问题,需要根据业务场景的特点进行分析,从应用层面增加策略来解决这个问题
例如:
1 .新注册的用户必须先查询主库;
2 .注册成功后,需要等待3s再跳。 后台此时正在进行数据同步。
第四,分布式缓存的体系结构设计
1 .体系结构设计
redis是单点,因此必须在项目中使用,并且必须自己实现分布式。 基本体系结构图如下:
2 .分布式实施
通过key进行一致散列,key实现与redis节点对应的分布。
实现一致性散列:
l散列值计算:通过支持MD5和MurmurHash两种计算方式,默认情况下采用MurmurHash,实现高效的散列计算。
实现l一致性:通过java的TreeMap模拟环状结构,实现均匀分布
3 .客户端选择
p>对于jedis修改的主要是分区模块的修改,使其支持了跟据BufferKey进行分区,跟据不同的redis结点信息,可以初始化不同的 ShardInfo,同时也修改了JedisPool的底层实现,使其连接pool池支持跟据key,value的构造方法,跟据不同 ShardInfos,创建不同的jedis连接客户端,达到分区的效果,供应用层调用
4.模块的说明
l 脏数据处理模块,处理失败执行的缓存操作。
l 屏蔽监控模块,对于jedis操作的异常监控,当某结点出现异常可控制redis结点的切除等操作。
整个分布式模块通过hornetq,来切除异常redis结点。对于新结点的增加,也可以通过reload方法实现增加。(此模块对于新增结点也可以很方便实现)
对于以上分布式架构的实现满足了项目的需求。另外使用中对于一些比较重要用途的缓存数据可以单独设置一些redis结点,设定特定的优先级。另外对 于缓存接口的设计,也可以跟据需求,实现基本接口与一些特殊逻辑接口。对于cas相关操作,以及一些事物操作可以通过其watch机制来实现。
声明:所有博客服务于分布式框架,作为框架的技术支持及说明,框架面向企业,是大型互联网分布式企业架构,后期会介绍linux上部署高可用集群项目。