当前位置:首页 > 科技  > 软件

我们一起聊聊如何编写一个 Java memcached 客户端

来源: 责编: 时间:2024-07-03 10:08:28 252观看
导读非常喜欢读开源项目,每次读源码,都会觉得自己修炼某种武学功法,期待修炼完成后,可以大杀四方。从2012年开始,陆续阅读了 Cobar、Druid、Xmemcached、RocketMQ、MetaQ、Canal、ShardingJdbc、Sofa-Jraft 等开源项目。这篇文

非常喜欢读开源项目,每次读源码,都会觉得自己修炼某种武学功法,期待修炼完成后,可以大杀四方。Cmr28资讯网——每日最新资讯28at.com

从2012年开始,陆续阅读了 Cobar、Druid、Xmemcached、RocketMQ、MetaQ、Canal、ShardingJdbc、Sofa-Jraft 等开源项目。Cmr28资讯网——每日最新资讯28at.com

这篇文章,聊聊笔者阅读 Xmemcached 源码的心得体会,希望对大家有所帮助。Cmr28资讯网——每日最新资讯28at.com

图片图片Cmr28资讯网——每日最新资讯28at.com

1、Xmemcached 简介

XMemcached 是一个 Java memcached 客户端。Cmr28资讯网——每日最新资讯28at.com

可能有的同学对 Memcached  并不熟悉,它和 Redis 一样都是分布式内存缓存系统,用于加速动态 Web 应用程序,通过减少数据库负载来提高性能 。Cmr28资讯网——每日最新资讯28at.com

笔者当时服务于一家彩票公司,公司的核心系统订单服务、调度中心、业务网关都使用 XMemcached 操作 memcached 。Cmr28资讯网——每日最新资讯28at.com

基于一个非常朴素的好奇心:“如何用 Java 编写一个缓存客户端 ?”  笔者花了接近两个月的时间将 Xmemcached 源码浏览了一次。Cmr28资讯网——每日最新资讯28at.com

浏览完源码后,笔者有三点心得:Cmr28资讯网——每日最新资讯28at.com

  • 设计模式
  • 网络命令编解码
  • 一致性哈希算法

2、设计模式

下图是 Xmemcached 的使用范例:Cmr28资讯网——每日最新资讯28at.com

图片图片Cmr28资讯网——每日最新资讯28at.com

我们可以清晰的发现流程分为三个部分 :Cmr28资讯网——每日最新资讯28at.com

  • 客户端构造器通过 servers 参数创建客户端 ;
  • 通过客户端调用 set、 get、 delete 方法 ;
  • 关闭客户端。

MemcachedClient 接口定义了基本的缓存操作方法,比如 get、set、add 、cas 方法,而 XmemcachedClient 是 MemcachedClient 的实现类。Cmr28资讯网——每日最新资讯28at.com

真正创建客户端对象 XmemcachedClient 是通过构造器 XMemcachedClientBuilder 来实现的,这是一个非常典型的设计模式:Builder 模式 Cmr28资讯网——每日最新资讯28at.com

Builder 模式是一种创建型设计模式,它允许你分步骤创建复杂对象。与直接构造对象不同,Builder 模式通过一个构建过程,逐步设置对象的不同部分,从而使对象的创建过程更加灵活和可控。Cmr28资讯网——每日最新资讯28at.com

图片图片Cmr28资讯网——每日最新资讯28at.com

我们在配置 构造器 XMemcachedClientBuilder 时,可以配置序列化对象、命令工厂、服务器列表等配置。Cmr28资讯网——每日最新资讯28at.com

最后,调用构造器的 build 方法创建 MemcachedClient 对象,见下图:Cmr28资讯网——每日最新资讯28at.com

图片图片Cmr28资讯网——每日最新资讯28at.com

下面是 XMemcached 的主要类的 UML 图:Cmr28资讯网——每日最新资讯28at.com

图片图片Cmr28资讯网——每日最新资讯28at.com

3 网络命令编解码

在网络编程中,一个重要的步骤是对发送的数据包进行编码、对接受的数据包进行解码Cmr28资讯网——每日最新资讯28at.com

1)发送命令,进行编码)Cmr28资讯网——每日最新资讯28at.com

因为 Xmemcached 使用了自研的网络通讯框架 ,每次发送命令时,都会调用命令的 encode 方法,将命令对象转换成 IoBuffer 对象通过网络发送。Cmr28资讯网——每日最新资讯28at.com

下图是  TextGetOneCommand 的 encode 方法 :Cmr28资讯网——每日最新资讯28at.com

图片图片Cmr28资讯网——每日最新资讯28at.com

2)接收命令,进行解码Cmr28资讯网——每日最新资讯28at.com

当通讯框架收到响应字节数组时,可能收到的数据包并不完整,在收到数据包时,通过 decode 方法判断数据包是否完整,当数据完整之后,将同步请求的 countDownLatch 计数减 1 。Cmr28资讯网——每日最新资讯28at.com

图片图片Cmr28资讯网——每日最新资讯28at.com

当笔者理解了网络命令编解码的技巧之后,后来用 Netty 写了个分库分表 proxy 轮子时,在设计 MySQL 命令包编解码就使用了类似的技巧。Cmr28资讯网——每日最新资讯28at.com

图片图片Cmr28资讯网——每日最新资讯28at.com

4 一致性 Hash 算法

一致性 Hash 算法非常典型的应用就是缓存集群,它能够很大程度上(注意不是完全解决)解决余数哈希的增加服务器导致缓存失效的问题。Cmr28资讯网——每日最新资讯28at.com

我们需要进行如下步骤,使用一致性哈希(Consistent Hashing)将键值对映射到 memcached 服务器上。Cmr28资讯网——每日最新资讯28at.com

图片图片Cmr28资讯网——每日最新资讯28at.com

  • 计算 memcached 服务器(节点)的哈希值,并将其配置到 0~2^32 的圆上。
  • 用同样的方法计算存储数据的键的哈希值,并映射到圆上。
  • 从键的哈希值对应的位置开始顺时针查找,将数据保存到找到的第一个服务器上。
  • 如果超过 2^32 仍然找不到服务器,就会保存到第一台 memcached 服务器上。

下图,我们新增一台 memcached 服务器 node5 。Cmr28资讯网——每日最新资讯28at.com

图片图片Cmr28资讯网——每日最新资讯28at.com

假如是我们使用余数分布式算法,保存键的服务器会发生很大变化从而影响缓存的命中率,但一致性哈希算法仅仅如图中所示 node2 和 node 5 之间小部分黄色区域会有影响。Cmr28资讯网——每日最新资讯28at.com

KetamaMemcachedSessionLocator.java 实现了一致性哈希算法, 使用的 Hash 算法是 KETAMA HASH 算法。Cmr28资讯网——每日最新资讯28at.com

1、根据服务器列表生成 Hash 环 ,存储容器 TreeMapCmr28资讯网——每日最新资讯28at.com

图片图片Cmr28资讯网——每日最新资讯28at.com

2、通过 key 得到 TreeMap 的 tailMap,然后找到 firstKeyCmr28资讯网——每日最新资讯28at.com

图片图片Cmr28资讯网——每日最新资讯28at.com

5 写到最后

阅读 Xmemcached 源码,让笔者的眼界大大提升,比如序列化方式、构造器 Builder 设计模式、一致性哈希算法、通讯命令编解码、failover 设计等等。Cmr28资讯网——每日最新资讯28at.com

比较可惜的是,笔者当时能力有限,并没有完全理解自研网络框架 yanf4j 。Cmr28资讯网——每日最新资讯28at.com

尽管如此,当读完 Xmemcached 源码后,笔者对于“如何用 Java 编写一个缓存客户端 ?” 这个问题,脑海里已经有了概念,当笔者对于 Netty 更加熟悉之后,这个问题也就变得不是问题了。Cmr28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-98411-0.html我们一起聊聊如何编写一个 Java memcached 客户端

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 如何正确使用上线部署,泳道、预发布到底如何理解?

下一篇: K8s 也有设计模式?你知道吗?

标签:
  • 热门焦点
  • 跑分安卓第一!Redmi K60至尊版8月发布!卢伟冰:目标年度性能之王

    8月5日消息,Redmi K60至尊版将于8月发布,在此前举行的战略发布会上,官方该机将搭载搭载天玑9200+处理器,安兔兔V10跑分超177万分,是目前安卓阵营最高的分数
  • JavaScript学习 -AES加密算法

    引言在当今数字化时代,前端应用程序扮演着重要角色,用户的敏感数据经常在前端进行加密和解密操作。然而,这样的操作在网络传输和存储中可能会受到恶意攻击的威胁。为了确保数据
  • 虚拟键盘 API 的妙用

    你是否在遇到过这样的问题:移动设备上有一个固定元素,当激活虚拟键盘时,该元素被隐藏在了键盘下方?多年来,这一直是 Web 上的默认行为,在本文中,我们将探讨这个问题、为什么会发生
  • 一文掌握 Golang 模糊测试(Fuzz Testing)

    模糊测试(Fuzz Testing)模糊测试(Fuzz Testing)是通过向目标系统提供非预期的输入并监视异常结果来发现软件漏洞的方法。可以用来发现应用程序、操作系统和网络协议等中的漏洞或
  • 电视息屏休眠仍有网络上传 爱奇艺被质疑“薅消费者羊毛”

    记者丨宁晓敏 见习生丨汗青出品丨鳌头财经(theSankei) 前不久,爱奇艺发布了一份亮眼的一季报,不仅营收和会员营收创造历史最佳表现,其运营利润也连续6个月实现增长。自去年年初
  • 腾讯VS网易,最卷游戏暑期档,谁能笑到最后?

    作者:无锈钵来源:财经无忌7月16日晚,上海1862时尚艺术中心。伴随着幻象的精准命中,硕大的荧幕之上,比分被定格在了14:12,被寄予厚望的EDG战队以绝对的优势战胜了BLG战队,拿下了总决
  • 签约井川里予、何丹彤,单视频点赞近千万,MCN黑马永恒文希快速崛起!

    来源:视听观察永恒文希传媒作为一家MCN公司,说起它的名字来,可能大家会觉得有点儿陌生,但是说出来下面一串的名字之后,或许大家就会感到震惊,原来这么多网红,都签约这家公司了。根
  • 当家的盒马,加速谋生

    来源 | 价值星球Planet作者 | 归去来自己“当家”的盒马,开始加速谋生了。据盒马官微消息,盒马计划今年开放生鲜供应链,将其生鲜商品送往食堂。目前,盒马在上海已经与
  • OPPO K11样张首曝:千元机影像“卷”得真不错!

    一直以来,OPPO K系列机型都保持着较为均衡的产品体验,历来都是2K价位的明星机型,去年推出的OPPO K10和OPPO K10 Pro两款机型凭借各自的出色配置,堪称有
Top