AeroSpike 类Redis 接口封装实现
2017-02-13 23:06
489 查看
业务背景
有个业务需要评估班级和学生的知识点能力,计算维度多,数据量大,目前按照redis cluster和sharding方式进行存储,然而无论cluster还是sharding方式,都存在扩容和迁移困难的问题,特别是在数据量大的情况下,存在较高的风险。另外,redis作为存储,为了提高可靠性,基本需要提供master-slave的方式,造成内存的利用率偏低,比较浪费服务器资源。AeroSpike 作为一种新的NoSQL数据库,基于SSD硬盘和内存索引,读写性能也非常不错,其一级索引占用8bytes,在不新建二级索引或者二级索引较小的情况下,对内存和磁盘的利用率还是非常高的,kb级别的数据下,写能达到10+W次/s,读也能达到5W次/s左右, 读写性能还是比较优秀的。AeroSpike的API接口不如redis丰富,一些redis特有的数据结构(sortedset)也不支持;但是经过扩展Hash,List这种也是可以在AeroSpike里面实现的, 针对业务计算的特点,参考网上的一些解决方案,基于AeroSpike和LUA封装了redis的相关接口。具体代码参考[https://github.com/yxlHuster/aerospike-redis ]。解决思路
主要考虑两个问题:1. 在不影响和改动线上服务接口的情况下,实现数据的替换。 2. 减少key的数量。 问题1主要是将中间数据的计算全部用AeroSpike存储,业务直接用的数据还是写入redis, 在此业务场景下,业务接口直接取的数据维度相对较少,而且不用修改业务接口,为了降低redis故障数据丢失概率,采用了双写机制,在AeroSpike和redis保存两份数据,当redis故障或者数据丢失的时候,直接去AeroSpike获取,提高了可用性。问题2虽然硬盘空间大得多,不过为了进一步降低key的数量,将一部分高维的hash结构转换成低维度的hash结构。碰到的问题
代码以开源的项目为基础进行修改,发现了一些bug,主要是类型转换错误,hincrByFloat写入不进去等问题,经过修复和调整之后,最终测试通过,感觉虽然是开源的项目,还是需要深入测试,对使用的东西有所了解才行。相关文章推荐
- Javascript面向对象特性实现(封装、继承、接口)
- Nginx嵌入Lua语言实现redis的高性能http接口
- 使用mybatis自动实现接口封装返回结果集
- Redis客户端Java服务接口封装
- 使用Nginx Lua实现redis高性能http接口
- 地磅称量系统之(53)在封装对象的类库中实现包括IDataErrorInfo接口提供的所有方法和并且扩展对异常具有添加和删除功能的基本业务对象基类
- C 语言链式调用与Tween算法实现(4)链式封装接口
- Redis 实现高效不遗漏的事件封装
- jwplayer视频播放(FLV,mp4)实现和已封装好的php接口
- java(继承,封装,实现接口)
- 设计技巧9:内部类利用外部类方法实现公共接口 封装实现细节
- jdbc,数据库案例:客户信息管理系统:jsp部分,数据库数据封装类,dao接口和实现
- Javascript面向对象特性实现封装、继承、接口详细案例——进级高手篇
- Android中设计模式--策略模式(封装会变化的算法部分,面向接口不针对实现)
- C++ Redis mset 二进制数据接口封装方案
- [原创]libpq-PostgreSQL客户端编程接口(三)----libpq在Qt中的封装实现及应用
- webdis实现Redis的http接口及多数据格式共享
- Redis源码分析(三十二)--- redis-cli.c客户端命令行接口的实现(1)
- PHP实现操作redis的封装类完整实例
- HttpURLConnection+AsyncTask+接口回调实现简易get联网请求封装框架