计算二进制形式中1的数量这种问题,在各种刷题网站上比较常见,以往都是选择最笨的遍历方法“蒙混”过关.在了解Redis的过程中接触到了variable precision SWAR算法(以下简称VP-SWAR算法),算法异常简洁,是目前已知的同类方法中最快的.但如果对于位运算不是很熟悉的话,却不一定容易理解,所以有必要记录一下. 下面先看看VP-SWAR算法的完整实现,然后再逐行解释. public int vpSWAR(int i){ i = (i & 0x55555555) + ((i>&…
BITCOUNT命令是统计一个位数组中非0进制位的数量,数学上称作:”Hanmming Weight“ 目前效率最好的为variable-precision SWAR算法,可以常数时间内计算出多个字节的非0数目,算法设计的非常精巧,值得学习. int swar(uint32_t i) { // (A) i = ( i & ) & 0x55555555); // (B) i = (i & ) & 0x33333333); // (C) i = (i & ) &…
variable-precision SWAR算法:计算Hamming Weight 转自我的Github 最近看书看到了一个计算Hamming Weight的算法,觉得挺巧妙的,纪录一下. Hamming Weight,即汉明重量,指的是一个位数组中非0二进制位的数量. 对于这个问题,最直观的算法就是遍历二进制位,时间复杂度是O(n),每次需要遍历n个位.另外一个算法是查表,用一个数组记录下一定位数每个数值的汉明重量如:数组hwTable=[0, 1, 1, 2]纪录了0, 1, 2, 3的汉…
苏君君出了一道题,是牛客网上面的: 输入一个int型整数,输出该数二进制表示中1的个数.其中负数用补码表示. 其实这道题并不难,大家很容易想到的解法是转成字符串的思路,即如下所示: public static int NumberOf1(int n) { String s = Integer.toBinaryString(n); int count = 0; for (int i = 0; i < s.length(); i++) { if(s.charAt(i) == '1'){ count+…
分布式寻址算法 hash 算法(大量缓存重建) 一致性 hash 算法(自动缓存迁移)+ 虚拟节点(自动负载均衡) redis cluster 的 hash slot 算法 一.hash 算法 来了一个请求,首先对key计算 hash 值,然后对节点数取模.然后打在不同的 master 节点上. 存在的问题 一旦某一个 master 节点宕机,所有新请求都会基于最新的剩余 master 节点数去取模,尝试去取数据,而取不到有效缓存,导致大量的流量涌入数据库.     二.一致性 hash 算法…
花了不到一周的时间看完了一本reids设计与实现的书,感觉整体的设计有些地方的确很巧妙,各个结构之间联系的非常紧密,但是很简单,逻辑性的没有太多,但是学到了一个bitcount计数1的方法比较巧妙,记录下来 看了一个老外的介绍的很详细 转载过来 OK, let's go through the code line by line: Line 1: i = i - ((i >> 1) & 0x55555555); First of all, the significance of the…
前言: 自从CYQ.Data框架出了数据库读写分离.分布式缓存MemCache.自动缓存等大功能之后,就进入了频繁的细节打磨优化阶段. 从以下的更新列表就可以看出来了,3个月更新了100条次功能: 305:处理视图名重复时的问题,同时简化MDataTable的代码,取消MDataTable的ReadFromDbDataReader(统一用CreateFrom(sdr)方法读取.(2016-07-16) 306:优化通过Reader获取列结构(该方法不靠谱,需要重新修正元数据的DataType.S…
一.节点取余 根据redis的键或者ID,再根据节点数量进行取余. key:value如下 name:1 zhangsna:18:北京 对name:1 进行hash操作,得出来得值是2423423452,用这个值除3,余1则放到1号节点中进行存储,余2则放到2号节点存储. 二.一致性hash 一致性哈希分区(Distributed Hash Table) 实现思路是为系统中每个节 点分配一个token, 范围一般在0~232, 这些token构成一个哈希环. 数据读写 执行节点查找操作时, 先根…
在<Redis 数据缓存满了怎么办?>我们知道 Redis 缓存满了之后能通过淘汰策略删除数据腾出空间给新数据. 淘汰策略如下所示: 设置过期时间的 key volatile-ttl.volatile-random.volatile-lru.volatile-lfu 这四种策略淘汰的数据范围是设置了过期时间的数据. 所有的 key allkeys-lru.allkeys-random.allkeys-lfu 这三种淘汰策略无论这些键值对是否设置了过期时间,当内存不足都会进行淘汰. 这就意味着,…
查看RDB文件结构,发现最后的8字节是CRC64校验算得,从文件头开始直到8字节校验码前的FF结束码(含),经过CRC64校验计算发现,貌似最后的8字节是小端模式实现的. 参考redis的crc64实现的代码,点击查看 Java代码如下: package com.jadic.utils; /** * @author Jadic * @created 2014-5-15 */ public class CRC64 { private static final long[] LOOKUPTABLE…