木西笔记

个人博客

大数据算法之空间亚线性算法(一)

水库抽样算法

问题描述 输入:一组数据,大小未知 输出:这组数据的K个均匀抽取 要求:仅扫描一次 总体要求:从N个元素中随机的抽取k个元素,其中N无法确定,保证每个元素抽到的概率相同 问题难点 首先明确什么叫均匀抽样,就是每个数据被等概率抽取呗。即当样本总体为n 时候,每个样本被抽取的概率为1/n,如果要抽取k个元素,那么每个样本被抽到的概率为k/n。但是我们实现不知道总体的数量n。如果就只有n=K个元...

Redis系列之数据结构篇(4)

对象简介

本文转自 redis 的设计与实现 简介我们陆续介绍了 Redis 用到的所有主要数据结构, 比如简单动态字符串(SDS)、双端链表、字典、压缩列表、整数集合, 等等。 Redis 并没有直接使用这些数据结构来实现键值对数据库, 而是基于这些数据结构创建了一个对象系统, 这个系统包含字符串对象、列表对象、哈希对象、集合对象和有序集合对象这五种类型的对象, 每种对象都用到了至少一种我们前面...

Java8使用@sun.misc.Contended避免伪共享

什么是伪共享缓存系统中是以缓存行(cache line)为单位存储的。缓存行是2的整数幂个连续字节,一般为32-256个字节。最常见的缓存行大小是64个字节。当多线程修改互相独立的变量时,如果这些变量共享同一个缓存行,就会无意中影响彼此的性能,这就是伪共享。 缓存行上的写竞争是运行在SMP系统中并行线程实现可伸缩性最重要的限制因素。有人将伪共享描述成无声的性能杀手,因为从代码中很难看清楚是...

Java类加载机制

Java类加载机制的七个阶段当我们的Java代码编译完成后,会生成对应的 class 文件。接着我们运行java Demo命令的时候,我们其实是启动了JVM 虚拟机执行 class 字节码文件的内容。而 JVM 虚拟机执行 class 字节码的过程可以分为七个阶段:加载、验证、准备、解析、初始化、使用、卸载。 加载下面是对于加载过程最为官方的描述。 加载阶段是类加载过程的第一个阶段。在这个...

Redis系列之数据结构篇(2)

字典

本文转自 redis 的设计与实现 结构Redis 的 Hash 类型键使用以下两种数据结构作为底层实现: 字典; 压缩列表; 因为压缩列表比字典更节省内存, 所以程序在创建新 Hash 键时, 默认使用压缩列表作为底层实现, 当有需要时, 程序才会将底层实现从压缩列表转换到字典。 Dict哈希表Redis 字典所使用的哈希表由 dict.h/dictht 结构定义:12345678...

Redis系列之数据结构篇(1)

SDS和链表

概诉 本文转自 redis 的设计与实现 SDSSDS 简介Redis 没有直接使用 C 语言传统的字符串表示(以空字符结尾的字符数组,以下简称 C 字符串), 而是自己构建了一种名为简单动态字符串(simple dynamic string,SDS)的抽象类型, 并将 SDS 用作 Redis 的默认字符串表示。 举个例子, 如果客户端执行命令:12redis> SET msg &...

源码分析系列(2)

为什么禁止在 foreach 循环里进行元素的 remove/add 操作

在阿里巴巴Java开发手册中,有这样一条规定: foreach循环123for(元素类型t 元素变量x : 遍历对象obj){ 引用了x的java语句; } 以下实例演示了 普通for循环 和 foreach循环使用:1234567891011121314public static void main(String[] args) { // ...

JAVA多线程之AQS分析(1)

ReentrantLock的源码分析独占锁的实现

概述谈到并发,不得不谈ReentrantLock;而谈到ReentrantLock,不得不谈AbstractQueuedSynchronized(AQS)!,类如其名,抽象的队列式的同步器,AQS定义了一套多线程访问共享资源的同步器框架,许多同步类实现都依赖于它,如常用的ReentrantLock/Semaphore/CountDownLatch…。我们以ReentrantLock作为讲解切...

稳定性保证

关于分布式应用程序处理未知峰值的四种方案

我最近参与讨论了很多有关应用程序如何处理高负载的能力,这个为的核心在于如何在,如何在不浪费大量的特定资源的情况下保持程序的稳定性,而这些特定的资源只会流量峰值的时候起作用。 很多应用服务,这样的典型case 十分差常见,例如:博客应用程序可能会在每次发文后出现峰值。再比如,博客应用程序可能会在每次发布的帖子上出现峰值。像Groupon或One Kings Lane这样的日交易比较活跃的网站,...

MQ可以解决哪些实际问题?

消息队列中间件是分布式系统中重要的组件,主要解决应用解耦,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构。目前使用较多的消息队列有ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ。消息中间件到底该如何使用,何时使用这是一个问题,胡乱地使用消息中间件增加了系统的复杂度,如果用不好消息中间件还不如不用。 1. 消息队列通讯模式点对...