1. 什么是Memcached

要了解Memcached首先要到官网上去看官方对它的描述。Memcached的官网网站是:http://memcached.org/,官方对Memcached的描述如下图:

从官方的描述中可以总结出,Memcached是一个高性能分布式的内存对象缓存系统。它将数据以key-value形式存储的存储在内存中,极大的提高了效率。但是Memcached的缺点在于不支持持久化(不支持写入磁盘),所以一旦断电,内存中的全部数据都会丢失。而Redis弥补了这个缺点,既在内存中存取数据,又支持持久化,所以Memcached可以理解为是Redis的前身,关于Redis的技术,后续会发新的文章论述,这里不展开讨论。

2. Memcached基本原理和体系架构

实际上,Memcached是在内存中维护一张巨大的Hash表。这张Hash表的结构是由多个slab组成,每个slab的大小是1M;每个slab中存在多个chunk,chunk是数据最终存储的单位。chunk采用预分配的方式提高性能,在保存数据之前,需要制定chunk的大小来分配内存。如add key *** 3



3. Memcached 集群

3.1 背景

    Memcached官方版本不支持集群搭建,Memcached彼此之间不进行通信,也就是把一个数据存到一个Memcached上,一旦这个Memcached宕掉了,不能从其它Memcached上读取这些数据,会造成数据丢失。

    但是,一个日本工程师改写了官方Memcached,使它能够支持集群。此时,Memcached之间可以进行通信,数据存储到一个Memcached实例上,可以同步到其它Memcached实例,防止数据丢失。

3.2 基本操作

 3.2.1 命令行
(1) 启动并连接memcached

(2) 添加数据:set、add(当存在相同key值时,set会覆盖value,add会报错);获取数据:get

(2) 查看slab信息
3.2.2 JavaAPI

1. 首先创建一个Java项目,然后添加memcached的jar包,如果网上找不到jar包的话可以在这个链接下载:https://download.csdn.net/download/xin93/10482424

2. 创建一个简单的Person信息类,用于存储到Memcached。

package com.nova;

import java.io.Serializable;
/**
*
* @author Supernova
* @date 2018/06/16
*
*/
public class Person implements Serializable{
private String name; //姓名
private String sex; //性别 public Person() { }
public Person(String name, String sex) {
super();
this.name = name;
this.sex = sex;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
} }

        3. 添加、获取

package com.nova;

import java.net.InetSocketAddress;
import java.util.concurrent.Future; import org.junit.Test; import net.spy.memcached.MemcachedClient;
/**
*
* @author Supernova
* @date 2018/06/16
*
*/
public class MemcachedOperation {
/*
* 向memcached添加数据
*/
@Test
public void addData() throws Exception {
// 创建Memcached客户端
MemcachedClient client = new MemcachedClient(new InetSocketAddress("192.168.243.11", 11211));
// 插入数据
Future<Boolean> future= client.set("name", 0, "Supernova");
//判断执行操作后返回的Boolean值
if(future.get().booleanValue()) {
//插入成功 client.shutdown();
}
} /*
* 获取memcached数据
*/
@Test
public void getData() throws Exception{
// 创建Memcached客户端
MemcachedClient client = new MemcachedClient(new InetSocketAddress("192.168.243.11",11211));
// 获取对应key值的value
String name = client.get("name").toString();
System.out.println(name);
}
/*
* 向memcached存储一个对象
*/
@Test
public void insertObject() throws Exception{
// 创建Memcached客户端
MemcachedClient client = new MemcachedClient(new InetSocketAddress("192.168.243.11",11211)); Person person = new Person("Supernova","man");
// 插入对象
Future<Boolean> future = client.set("person", 0, person); if(future.get().booleanValue()) {
//插入成功 client.shutdown();
}
} }

3.2 路由算法

既然Memcached实例可以有多个,那么当客户端发送一条数据的时候,这条数据要存储到哪个Memcached实例中?所以这就涉及到了Memcached路由算法,由它来决定数据最终存储在哪个Memcached上。注意:Memcached路由算法是由客户端实现的。在Memcached中有两种路由算法

 3.2.1 求余数

【基本原理】将key做hash运算,对memcached数量进行求余数,根据余数来决定存储到哪个Memcached实例。

如:有 4 台Memached,将对4进行求余数

8%4 = 0

7%4 = 3

6%4 = 2

5%4 = 1

……

这样根据余数路由的优点在于,能够使数据均匀分布在每个Memcached上,但是也有很大的缺点,一旦某个Memcached宕机,或有新的memcached加入就会找不到数据,出现严重的数据丢失

【数据丢失的原因】:

比如原先有3个Memcached:1%3=1, 2%3=2, 3%3=0, 4%3=1,……

新增之后为4个Memcached:1%4=1, 2%4=2, 3%4=2, 4%4=0,……

原先3存在0号,4存在1号,但是新增后,3变成2号,4变成0号。导致了存取的目标位置不一样,在0号存,去2号取就会找不到数据。

3.2.2 一致性Hash

一致性hash能够将丢失的数据减小到最小,但不能完全解决宕机造成的数据丢失。

【基本原理】:

如下图所示,数据分段在Memcached上存储,当扩容的时候,1~6666的数据将不受影响。同理,当有机器宕机的时候也一样。

【Memcached】原理、体系架构、基本操作及路由算法的更多相关文章

  1. 分布式缓存技术memcached学习(四)—— 一致性hash算法原理

    分布式一致性hash算法简介 当你看到“分布式一致性hash算法”这个词时,第一时间可能会问,什么是分布式,什么是一致性,hash又是什么.在分析分布式一致性hash算法原理之前,我们先来了解一下这几 ...

  2. 大数据体系概览Spark、Spark核心原理、架构原理、Spark特点

    大数据体系概览Spark.Spark核心原理.架构原理.Spark特点 大数据体系概览(Spark的地位) 什么是Spark? Spark整体架构 Spark的特点 Spark核心原理 Spark架构 ...

  3. Kylin工作原理、体系架构

    核心思想:预计算. 对多维分析可能用到的度量进行预计算,将计算好的结果保存成Cube,并存在HBase中,供查询时直接访问 将高复杂度的聚合运算.多表连接……操作转换成对预计算结果的查询.决定了Kyl ...

  4. 说说面向服务的体系架构SOA

    序言 在.Net的世界中,一提及SOA,大家想到的应该是Web Service,WCF,还有人或许也会在.NET MVC中的Web API上做上标记,然后泛泛其谈! 的确,微软的这些技术也确实推动着面 ...

  5. 面向服务的体系架构SOA

    面向服务的体系架构SOA 序言 在.Net的世界中,一提及SOA,大家想到的应该是Web Service,WCF,还有人或许也会在.NET MVC中的Web API上做上标记,然后泛泛其谈! 的确,微 ...

  6. Memcached原理与应用

    Memcached原理与应用 标签: linux 笔者Q:972581034 交流群:605799367.有任何疑问可与笔者或加群交流 1.Memcached是什么 高性能 支持高并发 分布式内存缓存 ...

  7. kafka原理和架构

    转载自:  https://blog.csdn.net/lp284558195/article/details/80297208 参考:   https://blog.csdn.net/qq_2059 ...

  8. [转]OpenContrail 体系架构文档

    OpenContrail 体系架构文档 英文原文:http://opencontrail.org/opencontrail-architecture-documentation/ 翻译者:@KkBLu ...

  9. InnoDB引擎体系架构

    InnoDB引擎架构介绍 innodb存储引擎的体系架构,可简单划分成三层: 数据文件 :磁盘上的数据文件 内存池:缓存磁盘上的数据,方便读取,同时在对磁盘文件数据修改之前在这里缓存,然后按一定规刷新 ...

随机推荐

  1. restful知识点之五解析器_响应器_分页器

    解析器 request.post:当数据时content-type urlencoded类型时才有数据 当content-type:是formdata时需要从request.body里取数据 requ ...

  2. SQL SERVER占用CPU过高优化S

    https://www.cnblogs.com/yuekong2010/p/6628001.html 然后使用下面语句看一下各项指标是否正常,是否有阻塞,正常情况下搜索结果应该为空. 1 SELECT ...

  3. 2.java相对路径与绝对路径

    1.基本概念的理解 绝对路径:绝对路径就是你的主页上的文件或目录在硬盘上真正的路径,(URL和物理路径)例如:C:xyz/test.txt 代表了test.txt文件的绝对路径.http://www. ...

  4. django1.8 增加注册用户其他字段(用户扩展)

    在V1.6及之后版本已经删除get_profile()方法,需要使用userprofile. 1.新建moduel,名为UserProfile: class UserProfile(models.Mo ...

  5. 字典构造、合并(dict)、排序

    使用dict,zip方法将两个list合并为dict keys = ["b", "a", "c", "e", " ...

  6. Bootstrap 4/3 页面基础模板 与 兼容旧版本浏览器

    Bootstrap 3 与 4 差别很大,目录文件结构.所引入的内容也不同,这里说说一下 Bootstrap 引入的文件.网页模板和兼容性问题.本网站刚刚搭建好,正好发一下文章原来测试网站. Boot ...

  7. 沉淀再出发:关于IntelliJ IDEA使用的一些总结

    沉淀再出发:关于IntelliJ IDEA使用的一些总结 一.前言 在使用IDEA的时候我们会发现,如果我们先写了一个类的名字,而没有导入这个类的出处,就会提示出错,但是不能自动加入,非常的苦恼,并且 ...

  8. 异常处理与MiniDump详解(1) C++异常(转)

    异常处理与MiniDump详解(1) C++异常 write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie 讨论新闻组及文件 一.   综述 我很少敢为自己写 ...

  9. Linux性能监控(程序篇)

    性能数据的监控,除了针对整机进行外,还要求我们对某一运行的程序单独进行.常用的程序监控命令有ps和top. Ps ps命令最常用的还是用于监控后台进程的工作情况,因为后台进程是不和屏幕键盘这些标准输入 ...

  10. 【转】深入浅出 iOS 之生命周期

    [iOS]深入浅出 iOS 之生命周期 深入浅出 iOS 之生命周期  http://blog.csdn.net/kesalin/article/details/6691766 罗朝辉(http:// ...