AeroSpike 类Redis 接口封装实现

业务背景

有个业务需要评估班级和学生的知识点能力,计算维度多,数据量大,目前按照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写入不进去等问题,经过修复和调整之后,最终测试通过,感觉虽然是开源的项目,还是需要深入测试,对使用的东西有所了解才行。

你可能感兴趣的:(工作,NoSQL,aerospike)