Java版一致性哈希

简介: 昨天听一个在找工作的朋友讲,他面试的时候被问到一致性哈希,问我到底什么是一致性哈希,我第一感觉就是,面试官应该问的是memcache或redis之类的分布式应用,一致性哈希主要思想是闭环,场景一般是降低因节点变化而导致缓存命中率降低的问题。

昨天听一个在找工作的朋友讲,他面试的时候被问到一致性哈希,问我到底什么是一致性哈希,我第一感觉就是,面试官应该问的是memcache或redis之类的分布式应用,一致性哈希主要思想是闭环,场景一般是降低因节点变化而导致缓存命中率降低的问题。其实这个问题老生常谈,网上很多,只是他没有遇到过罢了,我好像记得memcache或是redis都是单点的服务器,集群都是在客户端做的,不多说了,贴代码。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

import java.util.List;

import java.util.SortedMap;

import java.util.TreeMap;

/**

*

* @author <a href="mailto:yankai913@gmail.com">yankai</a>

* @date 2013-7-6

*/

public class ConsistentHash {

final SortedMap<Integer, String> virtualNodes = new TreeMap<Integer, String>();

final int virtualMappingNo = 10;

final List<String> realNodes;

public ConsistentHash(List<String> realNodes) {

for (String node : this.realNodes) {

addNode(node);

}

}

int hash(String key) {

return key.hashCode();

}

void addNode(String node) {

for (int i = 0; i < virtualMappingNo; i++) {

virtualNodes.put(hash(node + i), node);

}

realNodes.add(node);

}

void removeNode(String node) {

for (int i = 0; i < virtualMappingNo; i++) {

virtualNodes.remove(hash(node + i));

}

realNodes.remove(node);

}

String get(String key) {

int hash = hash(key);

if (virtualNodes.containsKey(hash)) {

return virtualNodes.get(hash);

}

SortedMap<Integer, String> tail = virtualNodes.tailMap(hash);

if (tail.isEmpty()) {

return virtualNodes.get(virtualNodes.firstKey());

}

return tail.get(tail.firstKey());

}

}



相关文章
|
存储 缓存 负载均衡
Java实现一致性哈希算法,并搭建环境测试其负载均衡特性(二)
实现负载均衡是后端领域一个重要的话题,一致性哈希算法是实现服务器负载均衡的方法之一,你很可能已在一些远程服务框架中使用过它。下面我们尝试一下自己实现一致性哈希算法。
Java实现一致性哈希算法,并搭建环境测试其负载均衡特性(二)
|
存储 负载均衡 算法
Java实现一致性哈希算法,并搭建环境测试其负载均衡特性(一)
实现负载均衡是后端领域一个重要的话题,一致性哈希算法是实现服务器负载均衡的方法之一,你很可能已在一些远程服务框架中使用过它。下面我们尝试一下自己实现一致性哈希算法。
Java实现一致性哈希算法,并搭建环境测试其负载均衡特性(一)
|
存储 算法 Java
常见的一致性哈希算法#Java实现#
    之前参与过缓存框架的封装与测试工作,并对一致性哈希算法进行了相关的调研。通过对spymemcached与jedis等客户端源码的阅读对一致性哈希算法的Java实现进行调研: 1. 使用TreeMap实现,TreeMap本身继承NavigatableMap,因此具备节点导航的特点 2. 通
2524 0
|
存储 算法 Java
java- 分布式- 一致性哈希算法(1)
一致性哈希算法是分布式系统中常用的算法。比如,一个分布式的存储系统,要将数据存储到具体的节点上,如果采用普通的hash方法,将数据映射到具体的节点上,如key%N,key是数据的key,N是机器节点数,如果有一个机器加入或退出这个集群,则所有的数据映射都无效了,如果是持久化存储则要做数据迁移,如果是分布式缓存,则其他缓存就失效了。
969 0
|
算法 Java
java- 分布式- 一致性哈希算法(2)
一致性哈希用在负载均衡的实例来说,一致性哈希就是先把主机ip从小大到全部放到一个环内,然后客户端ip来连接的时候,把客户端ip连接到大小最接近客户端ip且大于客户端ip的主机。
967 0
|
3天前
|
Java 数据库
【Java多线程】对线程池的理解并模拟实现线程池
【Java多线程】对线程池的理解并模拟实现线程池
13 1
|
1天前
|
Java
Java一分钟:线程协作:wait(), notify(), notifyAll()
【5月更文挑战第11天】本文介绍了Java多线程编程中的`wait()`, `notify()`, `notifyAll()`方法,它们用于线程间通信和同步。这些方法在`synchronized`代码块中使用,控制线程执行和资源访问。文章讨论了常见问题,如死锁、未捕获异常、同步使用错误及通知错误,并提供了生产者-消费者模型的示例代码,强调理解并正确使用这些方法对实现线程协作的重要性。
10 3
|
1天前
|
安全 算法 Java
Java一分钟:线程同步:synchronized关键字
【5月更文挑战第11天】Java中的`synchronized`关键字用于线程同步,防止竞态条件,确保数据一致性。本文介绍了其工作原理、常见问题及避免策略。同步方法和同步代码块是两种使用形式,需注意避免死锁、过度使用导致的性能影响以及理解锁的可重入性和升级降级机制。示例展示了同步方法和代码块的运用,以及如何避免死锁。正确使用`synchronized`是编写多线程安全代码的核心。
31 2
|
1天前
|
安全 Java 调度
Java一分钟:多线程编程初步:Thread类与Runnable接口
【5月更文挑战第11天】本文介绍了Java中创建线程的两种方式:继承Thread类和实现Runnable接口,并讨论了多线程编程中的常见问题,如资源浪费、线程安全、死锁和优先级问题,提出了解决策略。示例展示了线程通信的生产者-消费者模型,强调理解和掌握线程操作对编写高效并发程序的重要性。
30 3