zoukankan      html  css  js  c++  java
  • memcached和一致性hash算法

    1 一致性hash算法的一致性

    这里的一致性指的是该算法可以保持memcached和数据库中的数据的一致性。

    2 什么是一致性hash算法

    2.1 为什么需要一致性hash算法

    现在有大量的key value的数据需要分散的存储到不同的机器上的memcached中,如何根据key来分派机器。

    简单的方法直接对机器数目取模,比如有3台机器,首先对key求hash,假如hash分别是1,2,3,4,5,6,7,8,那么

    3,6    分派到第一台机器

    1,4,7分派到第二台机器

    2,5,8分派到第三台机器

    但是,假如加了一台机器,4台机器,那么就要对4取模了,

    4,8分派到第一台机器

    1,5分派到第二台机器

    2,6分派到第三台机器

    3,7分派到第四台机器

    这样,3本来是第三台机器,现在分到了第4台机器,那么原来的数据就失效了,第四台机器的数据需要去数据库中重新取。4、5、6、7、8同理。

    这样导致的问题就是原来的memcached缓存的数据大量失效,需要重新获取,成本很高。

    2.2 一致性hash算法怎么做

    对机器根据ip计算hash值,比如机器1是3,机器2是5,机器3是9。

    现在分派策略变成了,如果key的hash值大于9并且小于3,就分派给机器1,如果大于3小于5就分派给机器2,如果大于5小于9就分派给机器3。

    如果新加一台机器4,hash值是8,那么如果key大于5小于8就分派给机器4,大于8小于9就分配给机器3,其它的都不变。

    这样只是机器3上的memcached需要更新部分数据,其它原来的机器上的memcached和数据库中保持一致。

    hash不直接对N取模,而是根据将hash key空间分成多个段,段的断点为机器ip的hash值。某个请求的hash key落在某个段上面,然后将该请求分配给顺时针走遇到的第一个节点。

    2 memcached

    它是一个分布式的缓存,它通过客户端实现了分布式缓存,根据key将数据缓存到不同的机器上。

    客户端可以使用xmemcached、spymemcached等

    boolean set(final String key, final int exp, final Object value);

    可见,任何对象都可以存放在memcached中。

  • 相关阅读:
    ESP8266 SDK开发
    硬件基础知识和典型应用-Altium Designer 加载SETP文件设置3D封装
    Golang 协程控制关闭
    Redis主从集群切换数据丢失问题
    Goroutine(协程)的理解
    堆和栈的概念和区别
    golang goroutine实现_golang中的Mutex设计原理详解(一)
    OpenCV cv::Mat.type() 以及各类型数据转换
    python 处理json
    python 文件|路径 常用方法
  • 原文地址:https://www.cnblogs.com/hustdc/p/8909802.html
Copyright © 2011-2022 走看看