请教 想要做一个抢先执行的工具!用java来实现;实现原理,一端源源不断的接收字符串String数据(网络服务器读取,预计1ms接收一条,每秒钟上千条),然后要求快速的对这些数据筛选和做出反应(由于每一秒接收的数据非常多,且要求对符合要求的数据处理的足够快,所以想要采用一开始固定启动多条线程并行读取和处理这些数据,如果每一条数据都创建一个线程分析这样太消耗资源和影响速度),请问java可以用什么方式来实现呢? 分析过的数据不需要存储
可以用线程池实现灵活的线程分配。
ExecutorService executorService = Executors.newCachedThreadPool();
executorService.execute(…);
或者
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(…);
threadPoolExecutor.execute(…);
如果你是因为字符串处理速度不够快而想用多线程的话,恐怕难以达到你的预期了。多线程无法提高硬件运行速度,只能更多地挖掘硬件和能力而已。
利用线程池的方式就可以实现多线程循环处理接收的任务!
通过OkHTTP转发一下,转发到不同controller中处理数据。
用消息中间件会不会好点
生产者线程推送字符串到消息队列,然后多个消费线程监听处理数据
用消息中间件
这个属于生产者/消费者问题。生产者产生一条数据后,可以:
1、生成一个处理任务,交给消费线程池处理,消费者使用一个线程池;
2、或者将消息放到一个内存队列中,然后启动多个消费者线程,都从这个队列中获取消息并处理;
3、再或者就是将消息放到消息中间件,如kafka、rabbitmq等,然后启动多个消费者程序来处理
首先最好使用池化技术,初始化时给线程池设置一批线程数,这样就不用频繁创建线程消耗系统性能,其次,处理的字符串是否入库,如果是,尽量也使用多线程批量处理,同时入库的表尽量不要设置太多索引,因为影响读写操作效率
用消息队列,使用RabbitMQ或者Kafka,可靠性要求更高用RabbitMQ,性能要求更高选Kafka。
消息队列是异步的,所以你接收字符串和处理字符串可以分开,然后按你选的消息队列模型去处理接收到的字符串就可以了。
可以像下图这样创建一个线程池。
如果一直高速处理,没有波峰波谷的话,可以把核心线程数设置的大一些(一般是你的电脑内核数+1,具体还得看压测情况),并且核心线程数可以等于最大线程数,这样就省去了线程创建和销毁的开销。
图中等待队列用的是LinkedBlockingDeque(阻塞队列,并且没有设置最大值),看你的需求,如果要是考虑有耗时操作,并且内存可能会溢出的话,可以设置队列最大值,如果所有的线程都在运行任务,阻塞队列也满了(设置了最大值的情况下),就会走拒绝策略,也就是图中的new ThreadPoolExecutor.AbortPolicy(),AbortPolicy是指的丢弃任务。
我都不知道你具体要做啥,我们也只能给你那些通用的回答说法:
负载均衡,线程池,如果处理字符串重复率高还可以缓存,更换硬件,修改代码提高效率
接收数据,采用线程池技术,多线程接受处理数据;
如果涉及到对数据进行线程安全地简单计算,可以使用LongAdder或者LongAccumulator进行处理单台处理;
分布式部署的话,可以引入分布式存储,一般采用Redis存储。
1.如果是单纯就用Java不考虑中间件,就是Netty接收,多线程+线程池处理接收后的数据。
2.考虑使用中间件,使用消息队列,追求吞吐量就Kafka,或者RocketMQ。中间件的部署使用集群方式,提高硬件配置
分三步吧
1、配置需要过滤的词字典
2、对接收的字符串采用分词算法
3、然后再消费匹配的字符串
其中1、2可以参考ElasticSearch的analysis-ik分词器实现,第三点的话跟业务有关了,
我们主要的是优化1,2点,可以用C语言把analysis-ik实现提供给JAVA调用,主要从内存的节省跟操作效率去考虑。
推荐你使用消息队列处理,消息队列可以支持多台服务器同时处理你得数据
参考多线程下载,只能用这个,其它容易混淆
第一种:这种的话数据处理可以使用异步请求多线程来解决问题;每一个字符串给一个时间戳,使用redis的锁的方式来解决多次处理的问题。
1,接收数据后,给一个时间戳,使用异步请求其他接口来处理数据
2,异步处理接口,调用与不处理方法来处理;结果保存或者其他处理皆可。
我们之前的c端风险控制管理就是这样做的;
第二种:上述方法无法满足的情况下可以考虑集群+异步,速度更快
队列或者消息中间件的话一般是保证结果正确;根据你的需求来设置需要的方案就好。
1.kafka,flink也是java写的啊
2.没必要自己处理,数据肯定要处理的,处理玩的要落地,架构选好符合业务就行,又不是行业大拿,也是不大公司哪有那多成本,直接借鉴人家的架构,自己改改就行了
3.感觉你搞错,这东西没必要自己开发,你想的大公司都做好了,也开源了,拿来用就行
1、indexof(String s)
s为要搜索的字符串,如果查找到了就返回第一个匹配到的索引位置,如果没有匹配到就返回-1
String str = "ljavadfjsdfhgjjfsjavajfdsj";
System.out.println(str.indexOf("java"));
2、indexof(String s,int n)
s为要搜索的字符串,n为开始索引的位置,如果没有匹配到就返回-1
3、lastIndexof(String s)
返回最后一个指定字符串匹配到的位置,没有就返回-1
4、startWith(String s)
判断字符串是否以指定的字符串开头,返回类型为boolean类型
5、endsWith(String s)
判断字符串是否以指定的字符串结尾,返回类型为boolean类型
6、trim()
用于删除字符串首尾的空格
7、split(String s)
根据指定字符串分割原字符串,结果返回一个数组
8、subString(int n)
用于分割字符串,结果返回一个新的字符串,此字符串可与indexof配合分割字符串
9、contains(String s)
查找字符串中是否包含s,结果返回boolean类型
String str = "ljavadfjsdfhgjjfsjavajfdsj";
System.out.println(str.indexOf("java"));//1
System.out.println(str.indexOf("java", 10));//17
System.out.println(str.lastIndexOf("java"));
System.out.println(str.startsWith("java"));//false
System.out.println(str.endsWith("java"));//false
System.out.println(" Hello world ".trim());
String ss = "java,php,c,pyhon,html";
String[] s1 = ss.split(",");
for (String s : s1) {
System.out.println(s);
}
//截取第一个java开始到最后一个java之前的字符串
String s2 = str.substring(str.indexOf("java"), str.lastIndexOf("java"));
System.out.println(s2);
朋友我提几点建议
1、相关的表一定要按相关条件建立索引。
2、尽是用SQL语句,比你一条一条的做要快很多!!
3、如果数据库太大了,定期清理数据并做压缩修复。
望采纳谢谢啦