内容简介:最近在迁移线上 Redis 到 Pika 的过程中,因为业务需要,需要对项目中原有对 pika 读取操作的代码进行优化,最后结果就是读取百万级的数据由原来的30降低到10分钟左右。Pika 是DBA需求,基础架构组开发的大容量、高性能、持久化、支持多数据结构的类Redis存储系统,目前已经开源,最新版本为 Pika 2.2 版本。它所使用的 nemo 引擎本质上是对Rocksdb的改造和封装,使其支持多数据结构的存储,并在 nemo 引擎之上封装redis接口,使其完全支持 Redis 协议。Pika 兼容
最近在迁移线上 Redis 到 Pika 的过程中,因为业务需要,需要对项目中原有对 pika 读取操作的代码进行优化,最后结果就是读取百万级的数据由原来的30降低到10分钟左右。
Pika 是什么
Pika 是DBA需求,基础架构组开发的大容量、高性能、持久化、支持多数据结构的类Redis存储系统,目前已经开源,最新版本为 Pika 2.2 版本。它所使用的 nemo 引擎本质上是对Rocksdb的改造和封装,使其支持多数据结构的存储,并在 nemo 引擎之上封装redis接口,使其完全支持 Redis 协议。Pika 兼容 string、hash、list、zset、set 等多数据结构,使用磁盘而非内存存储数据解决了 Redis 由于存储数据量巨大而导致内存不够用的容量瓶颈。这段话摘自官网,感兴趣的小伙伴请转 pika
为什么要进行优化
因为慢啊……,主要是因为单线程的 Redis 是基于内存的,即便是单线程性能也是相当强悍的。Pika 的话是基于磁盘的,相对来说就有点先天不足了,所以多线程访问才能真正发挥它的性能。
具体操作伪代码
业务场景:用户信息已 Hash 的形式存放在 Pika 中,需要根据 Hash 的 Key 获取用户信息,并将用户信息写入文件,数据量在百万级。
方案一
将数据分批,然后将分好批的数据分配给创建的线程,执行获取用户信息,并写入文件的逻辑。下面只是大概的业务逻辑,
public class Test { public void businessService() { ExecutorService executor = Executors.newFixedThreadPool(10); for (int i = 0;i < 100; i++) { executor.submit(new Task()); } executor.shutdown(); try { // 等待所有线程 boolean loop; do { loop = !executor.awaitTermination(2, TimeUnit.SECONDS); } while(loop); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("mina thread is over"); } /** * 要执行的业务逻辑 */ class Task implements Runnable { @Override public void run() { // getDataFromPika(); // writeDataToFile(); } } }
方案二
将数据读取到阻塞队列中(ArrayBlockingQueue),然后多线程从 ArrayBlockingQueue 中读取数据,写入文件中。线程结束的逻辑就是在队列中读取到特定字符,结束线程。下面是大概的业务逻辑。
public class Test { private ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<>(1000); public void businessService() { // 读取数据,放入到队列中 while (true) { queue.put("data"); } ExecutorService executor = Executors.newFixedThreadPool(10); // 创建线程 for (int i = 0;i < 100; i++) { executor.submit(new Task()); } for (int i = 0;i < 100; i++) { queue.put("STOP"); } executor.shutdown(); } /** * 要执行的业务逻辑 */ class Task implements Runnable { @Override public void run() { while (true) { // getDataFromPika(); // writeDataToFile(); if (queue.take() == "STOP") { break; } } } } }
小结
在优化代码是踩了不少坑,原因还是在于自己不够细心,程序员敲代码这活还是比较细的,稍不留意,被自己坑半天。
作 者:
原文链接: https://www.hchstudio.cn/article/2019/5b7c/
版权声明:非特殊声明均为本站原创作品,转载时请注明作者和原文链接。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 性能优化第一课:性能指标
- 【前端性能优化】vue性能优化
- Golang 性能测试 (2) 性能分析
- 【前端性能优化】02--vue性能优化
- Java性能 -- 性能调优标准
- Java性能 -- 性能调优策略
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
计算群体智能基础
恩格尔伯里特 / 谭营 / 2009-10 / 69.00元
《计算群体智能基础》全面系统地介绍了计算群体智能中的粒子群优化(PSO)和蚁群优化(ACO)的基本概念、基本模型、理论分析及其应用。在简要介绍基本优化理论和总结各类优化问题之后,重点介绍了社会网络结构如何在个体间交换信息以及个体聚集行为如何形成一个功能强大的有机体。在概述了进化计算后,重点论述了粒子群优化和蚁群优化的基本模型及其各种变体,给出了分析粒子群优化模型的一种通用方法,证明了基于蚂蚁行为实......一起来看看 《计算群体智能基础》 这本书的介绍吧!