如何在亿级数据中判断一个元素是否存在?

前言

在日常工作中,经常要判断一个元素是否在一个集合中。假设你要向浏览器添加一项功能,该功能可以通知用户输入的网址是否是恶意网址,此时你手上有大约 1000 万个恶意 URL 的数据集,你该如何实现该功能。按我之前的思维,要判断一个元素在不在当前的数据集中,首先想到的就是使用 `hash table`,通过哈希函数运行所有的恶意网址以获取其哈希值,然后创建出一个哈希表(数组)。这个方案有个明显的缺点,就是需要存储原始元素本身,内存占用大,而我们其实主要是关注 `当前输入的网址在不在我们的恶意 URL 数据集中`,也就是之前的恶意 URL 数据集的具体值是什么并不重要,通过吴军老师的《数学之美》了解到,对于这种场景大数据领域有个用于在海量数据情况下判断某个元素是否已经存在的算法很适合,关键的一点是该算法并不存储元素本身,这个算法就是 — 布隆过滤器(Bloom filter)。

阅读全文

面向对象和面向函数之争

大卫说:“服务的调用最终是通过函数实现的”。“但函数要绑定数据以确定并行的粒度”:皮特争辩道。早上大卫和皮特在花园里争论着,我们所开发的软件的结构究竟是面向对象还是面向函数?这个问题猛然听来好像非常矛盾。软件的结构似乎只能在面向对象和面向函数之间进行选择。但其实不然,面向对象和面向函数不过是我们在开发过程中的一种思考方式。当你从用户的角度来看开发的过程,就是面向对象的。因为用户最终操作的是一个很小的数据集合。这个集合可以抽象的叫做对象。当你换个角度从服务器这边去看时。服务器的数据被各种用户函数所操作。所有函数所拥有的数据的子集的合,构成了服务器的全部数据。并且每个函数的范围都不固定。可能操作很小的数据,也可能操作很大的数据。小到用户状态的更改。大到对几年的数据进行统计分析。哪么从服务器的角度来看就叫面向函数的编程。

阅读全文
  • 1,770 人阅读
  • 面向对象和面向函数之争已关闭评论

工厂模式-创建型模式

作者:小村长

工厂方法模式(Factory Method Pattern):定义一个用于创建对象的接口,让子类决定将哪一个类实例化。工厂方法模式让一个类的实例化延迟到其子类。

阅读全文

设计模式

 作者:小村长

疫情期间重新温习了一遍设计模式,期间查阅了很多博客学习了其他老师对于设计模式的见解。然后整理成笔记分享给大家,同时也非常欢迎大家指出笔记中有所欠缺的地方,希望本系列笔记能够对大家的工作和学习有所帮助。

什么是设计模式 模式是在特定环境下人们解决某类重复出现问题的一套成功或有效的解决方案 软件设计的几大原则

阅读全文

非阻塞同步算法实战(四)- 计数器定时持久化

问题背景及要求

  • 需要对评论进行点赞次数和被评论次数进行统计,或者更多维度
  • 要求高并发、高性能计数,允许极端情况丢失一些统计次数,例如宕机
  • 评论很多,不能为每一个评论都一直保留其计数器,计数器需要有回收机制
阅读全文

探秘分布式解决方案: 分布式事务——微服务架构下的主流解决方案之TCC

本文原文地址: 点我

作者: skypyb

上篇文章 (原文) 说完了分布式事务最核心的思想2pc。

那么现在进入到更加复杂的场景。像这种跨库调用之类的,一线互联网公司早就不玩这一套了。上来就是微服务架构。

我这么多服务,你整个啥跨库调用呢?一个服务可能同时调用多个其他的服务。这多个其他的服务中都要执行SQL语句,修改落实到服务所对应的数据库之中。

阅读全文

HotSpot虚拟机垃圾收集优化教程-影响垃圾回收性能表现的因素

影响垃圾回收性能表现的因素

影响垃圾收集性能的两个最重要因素是总的可用内存和专用于年轻代的内存比例。

  • 总堆
    • 影响分代堆大小的选项
    • 堆大小的默认选项值
    • 通过最小化Java堆大小来节省动态占用空间
  • 年轻代
    • 年轻代堆大小选项值
    • 幸存者空间大小
阅读全文

HotSpot虚拟机垃圾收集优化教程-可供选择的垃圾收集器

可供选择的垃圾收集器

关于这一点的讨论是关于串行垃圾收集器的。Java HotSpot虚拟机包含三种不同类型的垃圾收集器,每个收集器具有不同的性能特征。

  • 串行垃圾收集器
  • 并行垃圾收集器
  • 大多数并发垃圾收集器
  • 选择一个垃圾收集器
阅读全文

从创建对象到ConcurrentHashMap

原文始发于微信公众号(BeCoder):从创建对象到ConcurrentHashMap

其实创建对象与ConcurrentHashMap之间并没有必然联系,不过很多知识是环环相扣的,这篇文章权当做一次温习吧。

阅读全文

Java Reference核心原理分析

带着问题,看源码针对性会更强一点、印象会更深刻、并且效果也会更好。所以我先卖个关子,提两个问题(没准下次跳槽时就被问到)。

  • 我们可以用ByteBuffer的allocateDirect方法,申请一块堆外内存创建一个DirectByteBuffer对象,然后利用它去操作堆外内存。这些申请完的堆外内存,我们可以回收吗?可以的话是通过什么样的机制回收的?
  • 大家应该都知道WeakHashMap可以用来实现内存相对敏感的本地缓存,为什么WeakHashMap合适这种业务场景,其内部实现会做什么特殊处理呢?
阅读全文

HotSpot虚拟机垃圾收集优化教程-垃圾收集器实现

垃圾收集器实现

Java SE平台的一个优点是他可以将开发人员从复杂的内存分配和垃圾收集中解放出来。
然而,当垃圾收集是主要的瓶颈时,理解垃圾收集实现的某些方面是很有用的。垃圾收集器对应用程序使用对象的方式进行猜想,这些猜想反应在可调参数中,这些参数可以在不牺牲抽象能力的情况下进行调整以提高性能。

阅读全文

HotSpot虚拟机垃圾收集优化教程-人机工程学

人机工程学 (垃圾回收自学习优化策略)

人机工程学是Java虚拟机和垃圾收集探索式(例如基于行为的探索式算法)提高应用程序性能的过程。
Java虚拟机为垃圾收集器,堆大小和运行时编译器配置提供基于平台的默认选择。这些选择满足不同类型应用程序的需求,并且需要较少的命令行调优。此外,基于行为调优动态优化堆的大小,以满足应用程序特定的性能要求。
本节将介绍这些默认的选择和基于行为的调优。在使用后续章节中更加详细的控制配置前,请使用这些默认配置。

阅读全文

HotSpot虚拟机垃圾收集优化教程-垃圾收集调优简介

翻译原文

垃圾回收调优简介

从小的桌面应用到大型服务器上的web应用,各种各样的应用程序都使用标准版Java平台(Java SE)。为了支持这一系列不同的部署,Java HotSpot VM提供了多个垃圾收集器,每个垃圾收集器都是为满足不同的需求而设计的。Java SE基于应用程序在计算机上运行的类选择最合适的垃圾收集器。然而,对于每个应用程序,此选择可能不是最优的。具备严格的性能目标或者其他需求的用户,开发人员和管理员可能需要显式地选择垃圾收集器并优化某些参数已达到渴望的性能级别。本文档提供了帮助显式完成优化任务的信息。
首先,垃圾收集器的一般特性和基础的调优选项将被描述通过串行垃圾收集器,然后介绍其他垃圾收集器的具体特性以及选择垃圾收集器时要考虑的因素。

阅读全文

国内首本系统讲解Java异步编程的书籍-java异步编程实战

一 、认识异步编程

通常Java开发人员喜欢使用同步代码编写程序,因为这种请求(request)/响应(response)的方式比较简单,并且比较符合编程人员的思维习惯;这种做法很好,直到系统出现性能瓶颈;在同步编程方式时由于每个线程同时只能发起一个请求并同步等待返回,所以为了提高系统性能,此时我们就需要引入更多的线程来实现并行化处理;但是多线程下对共享资源进行访问时,不可避免会引入资源争用和并发问题;另外操作系统层面对线程的个数是有限制的,不可能通过无限的增加线程数来提供系统性能;最后使用同步阻塞的编程方式还会导致浪费资源,比如发起网络IO请求时候,调用线程就会处于同步阻塞等待响应结果的状态,而这时候调用线程明明可以去做其他事情,等网络IO响应结果返回后在对结果进行处理。

阅读全文

深度剖析Apache Dubbo核心技术内幕

一、前言

在单体应用时,不同业务模块部署在同一个JVM进程内,这时候通过本地调用就可以解决不同业务模块之间的相互引用;但多体应用时,不同业务模块大多部署到不同机器上,这时候一 个高效、稳定的RPC框架就显得特别重要了。Apache Dubbo作为阿里巴巴开源的分布式RPC框架,其已进入了Apache 孵化器项目,相信在开源社区的不断贡献下,其会成为RPC框架中的佼佼者。

阅读全文

return top