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写入不进去等问题,经过修复和调整之后,最终测试通过,感觉虽然是开源的项目,还是需要深入测试,对使用的东西有所了解才行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Aerospike和ClickHouse都是键值对内存数据库,但是它们的使用场景和特点有所不同。 Aerospike是一种高性能、可扩展的键值对内存数据库,适用于需要快速读写大量数据的场景,例如广告技术、实时分析和个性化推荐等。Aerospike支持多种数据型,包括字符串、整数、浮点数、列表、映射和二进制数据等。Aerospike还支持多种读写操作,例如单个键值对读写、批量读写、范围查询和二次索引查询等。Aerospike的优点是高性能、可扩展、易于使用和部署,缺点是不支持复杂查询和事务。 ClickHouse是一种高性能、可扩展的列式存储数据库,适用于需要快速查询大量数据的场景,例如日志分析、数据仓库和实时报表等。ClickHouse的特点是支持高并发、高吞吐量的查询,支持复杂的SQL查询和聚合操作,支持多种数据格式和压缩算法,支持分布式部署和数据复制。ClickHouse的优点是高性能、可扩展、支持复杂查询和事务,缺点是不支持实时更新和删除操作。 以下是两个例子: 1.使用Aerospike存储和读取数据 ```python import aerospike # 连接Aerospike数据库 config = { 'hosts': [ ('127.0.0.1', 3000) ] } client = aerospike.client(config).connect() # 写入数据 key = ('test', 'demo', 'key1') bins = { 'name': 'Alice', 'age': 25, 'gender': 'female' } client.put(key, bins) # 读取数据 (key, metadata, record) = client.get(key) print(record) # 关闭连接 client.close() ``` 2.使用ClickHouse查询数据 ```sql -- 创建表 CREATE TABLE test ( id UInt32, name String, age UInt8, gender String ) ENGINE = MergeTree() ORDER BY id; -- 插入数据 INSERT INTO test VALUES (1, 'Alice', 25, 'female'), (2, 'Bob', 30, 'male'); -- 查询数据 SELECT * FROM test WHERE age > 25; ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值