高性能高可用Redis客户端的设计与实现
2022年电子技术应用第1期
刘世超1,2,杨 斌1,2,刘卫国1,2
1.山东大学 软件学院,山东 济南250101;2.国家超级计算无锡中心,江苏 无锡214072
摘要:Redis是一个基于内存存储的非结构化数据库,以高I/O(Input/Output)性能和高响应速度著称,在数据缓冲、消息队列、Key-Value存储等场景都发挥着重要的作用。在其支持的众多客户端中,C/C++客户端Hiredis的应用尤为广泛。对Hiredis库做了深入分析,发现了其管道功能存在高开销、指令存储不当以及内存混淆问题。基于此,在32逻辑核的X86架构处理器以及64 GB内存的Linux服务器上,设计并实现了一个面向C/C++的高性能高可用Redis客户端,通过内存预分配以及内存隔离的方法提高了大量指令批处理时的性能并解决了复杂场景下的内存混淆问题。经测试,新客户端提高了3~7倍的指令执行效率,同时也保证了复杂场景下的内存安全以及数据准确性。
中图分类号:TP391
文献标识码:A
DOI:10.16157/j.issn.0258-7998.212432
中文引用格式:刘世超,杨斌,刘卫国. 高性能高可用Redis客户端的设计与实现[J].电子技术应用,2022,48(1):46-52,58.
英文引用格式:Liu Shichao,Yang Bin,Liu Weiguo. Design and implementation of high-performance and high-availability redis client[J]. Application of Electronic Technique,2022,48(1):46-52,58.
文献标识码:A
DOI:10.16157/j.issn.0258-7998.212432
中文引用格式:刘世超,杨斌,刘卫国. 高性能高可用Redis客户端的设计与实现[J].电子技术应用,2022,48(1):46-52,58.
英文引用格式:Liu Shichao,Yang Bin,Liu Weiguo. Design and implementation of high-performance and high-availability redis client[J]. Application of Electronic Technique,2022,48(1):46-52,58.
Design and implementation of high-performance and high-availability redis client
Liu Shichao1,2,Yang Bin1,2,Liu Weiguo1,2
1.School of Software,Shandong University,Jinan 250101,China;2.National Supercomputing Center in Wuxi,Wuxi 214072,China
Abstract:Redis is an unstructured database based on memory storage. It is known for high I/O(Input/Output) performance and high response speed. It plays an important role in data buffering, message queues, key-value storage and other scenarios. Among the many clients it supports, the C/C++ client Hiredis is particularly widely used. This article did an in-depth analysis of the Hiredis library and found that its pipeline function has high overhead, improper instruction storage, and memory confusion problems. Based on this, this article designs and implements a C/C++-oriented high-performance and high-availability Redis client on a 32-core X86 architecture processor and a 64 GB memory Linux server. It improves the performance of processing a large number of instructions and solves the problem of memory confusion in complex scenarios through memory pre-allocation and memory isolation. After testing, the new client has improved instruction execution efficiency by 3~7 times, while also ensuring memory safety and accuracy in complex scenarios.
Key words :Redis;pipeline;Hiredis;memory confusion;performance optimization
0 引言
随着互联网飞速发展以及大规模应用的不断涌现,目前已经步入了大数据时代。非结构化数据逐渐替代了传统结构化数据并迅速占据了主导地位,为了管理形式多样的非结构化数据,涌现了诸如MongoDB[1]、InfluxDB[2]、Elasticsearch[3]等十分有代表性的数据库。这些数据库虽然针对非结构化数据的存取做了很多优化,但是受限于硬盘(Hard Disk Drive,HDD)等底层存储介质,往往无法满足高性能场景的需求。
为了提高性能,以Redis为代表的内存数据库应运而生。Redis是一个非结构化数据库,支持使用非结构化语言(Not-only Structured Query Language,NoSQL)查询。同时,Redis通过I/O(Input/Output)多路复用和DRAM(Dynamic Random Access Memory)提供了高吞吐、高并发和低时延的服务,在数据缓冲、消息队列、Key-Value存储等场景都发挥了重要的作用。
但是随着大规模计算集群的算力逐渐增大,应用的数据规模也随之变大,计算和I/O之间的“存储墙”也变得愈发明显。现有的Redis也遇到一些网络和存储方面的问题。因此如何改进Redis也受到了广泛的重视,随之出现了很多Redis优化的相关工作,它们从各种角度对Redis服务端或客户端做了改进。
本文详细内容请下载:http://www.chinaaet.com/resource/share/2000003907。
作者信息:
刘世超1,2,杨 斌1,2,刘卫国1,2
(1.山东大学 软件学院,山东 济南250101;2.国家超级计算无锡中心,江苏 无锡214072)
此内容为AET网站原创,未经授权禁止转载。