Hazelcast系列(十一):Map(三)备份、过期驱逐与内存格式

news2024/9/25 21:26:52

系列文章

Hazelcast系列(一):初识hazelcast

Hazelcast系列(二):hazelcast集成(嵌入式)

Hazelcast系列(三):hazelcast集成(服务器/客户端)

Hazelcast系列(四):hazelcast管理中心

Hazelcast系列(五):Auto-Detection发现机制

Hazelcast系列(六):Multicast发现机制

Hazelcast系列(七):TCP-IP发现机制

Hazelcast系列(八):数据结构

Hazelcast系列(九):Map(一)加载和存储

Hazelcast系列(十):Map(二)监听器和拦截器

Hazelcast系列(十一):Map(三)备份、过期驱逐与内存格式

目录

        前言

        备份

                同步备份

                        配置方式

                异步备份

                        配置方式

                备份读取

                        配置方式

        过期

                生存时间

                ​​​​​​​        配置方式

                最大空闲时间

                ​​​​​​​        配置方式

                特定条目设置过期策略

        驱逐

                大小

                大小策略

                驱逐策略

                配置方式 

        内存格式

                配置方式 

总结


前言

续接上文,继续探讨 Map 的内容。

Map 内容相关文章:

Hazelcast系列(九):Map(一)主要探讨 Map 加载、存储以及配置

Hazelcast系列(十):Map(二)主要探讨 Map 监听器、拦截器

Hazelcast系列(十一):Map(三)主要探讨 Map 备份、过期和驱逐以及内存格式

本节内容是 Map 相关内容的最后一节,主要针对数据存储的的备份策略,数据在内存中的的生命周期,内存结构的大小限制和内存数据的格式。

当前 Hazelcast版本:5.1.7,Hazelcast模式:嵌入式

备份

内存备份可以在 Hazelcast 集群成员离线时,保证数据的完整性。与活动的 Map 数据一样,备份数据按照分区分布在集群成员中。

Hazelcast 根据 Key 的哈希值将对应的数据放在特定的分区中,分区在整个集群成员是尽可能的均匀分布的,以便最大限度的利用内存,以保证整个集群成员的平衡。

备份可分为 同步备份 异步备份 两种类型。

同步备份

同步备份是一种阻塞操作,为 Map 的默认备份方式。如果操作更改了 Map 的内容,则必须先将该更改写入主数据和所有备份,然后才能继续操作。这可以确保地图的主副本和备份副本之间的一致性,但会增加潜在的阻塞成本,从而可能导致延迟问题。

分布式 Map 默认有一个备份。如果有一个集群成员下线,则使用集群中备份恢复数据。

创建同步备份,使用 backup-count 属性设置备份副本的数量

backup-count 为 1 时,Map 数据将在集群中的另一个成员上进行备份。 如果将其设置为 2,则 Map 数据将在另外两个成员上有其备份。 如果您不希望备份数据,您可以将其设置为 0,例如,如果性能比备份更重要。

备份计数的最大值为 6

配置方式
  • XML
<hazelcast>
    <map name="default">
        <backup-count>1</backup-count>
    </map>
</hazelcast>
  • YAML
hazelcast:
  map:
    default:
      backup-count: 1

异步备份

异步备份是非阻塞操作。一旦数据写入主副本,任何更改 Map 内容的操作都可以继续。备份副本将在稍后写入。

要创建异步备份,使用 async-backup-count 来设置异步备份的数量。

配置方式
  • XML
<hazelcast>
    <map name="default">
        <backup-count>0</backup-count>
        <async-backup-count>1</async-backup-count>
    </map>
</hazelcast>
  • YAML
hazelcast:
  map:
    default:
      backup-count: 0
      async-backup-count: 1

备份读取

如果采用嵌入模式下使用 Hazelcast,读取 Map 数据可以从本地成员的本地备份中。通过这样做,本地成员不需要向主分区的所有者发出不必要的请求,从而减少了延迟并提高了性能。

启用备份读取(读取本地备份条目),将属性值 read-backup-data 设置为 true。为了保持一致性,它的默认值为 false 。启用备份读取可以提高性能,但另一方面,它可能会导致读取到了过期的数据。

当至少有一个 同步备份 或 异步备份 时,备份读取功能可用

配置方式
  • XML
<hazelcast>
    <map name="default">
        <backup-count>0</backup-count>
        <async-backup-count>1</async-backup-count>
        <read-backup-data>true</read-backup-data>
    </map>
</hazelcast>
  • YAML
hazelcast:
  map:
    default:
      backup-count: 0
      async-backup-count: 1
      read-backup-data: true

过期

过期策略定义应删除映射条目的期限,其限制了定义在 Map 中数据的生命周期。当数据过期时,无法再从 Map 中读取它,并计划将其删除以释放内存。实际的删除将在下一个垃圾收集周期期间发生。

配置过期策略,使用 time-to-live-secondsmax-idle-seconds

生存时间

time-to-live-seconds,为每个条目在地图中停留的最长时间(以秒为单位)(TTL)。它限制了数据相对于上次对其执行写访问的时间的生命周期。
如果不为0,则生命周期超过此期限的数据(在此期限内没有对其执行任何写访问)将过期并自动驱逐。如果没有为单个数据提供特定的 TTL 值,它将继承为此元素设置的值。

time-to-live-seconds 默认值为 0意味着没有过期,可接受的最大值为 Integer.MAX VALUE。

默认情况下,此配置元素适用于 Map 中的所有数据。

配置方式
  • XML
<hazelcast>
    <map name="default">
        <time-to-live-seconds>60</time-to-live-seconds>
    </map>
</hazelcast>
  • YAML
hazelcast:
  map:
    default:
      time-to-live-seconds: 60

最大空闲时间

max-idle-seconds,每个数据在地图中保持空闲的最长时间(以秒为单位)。它限制数据相对于上次对其执行读或写访问的时间的生命周期。空闲时间超过此限制的数据将自动过期并被驱逐。

max-idle-seconds 默认值为 0意味着没有过期,可接受的最大值为 Integer.MAX VALUE。

默认情况下,此配置元素适用于 Map 中的所有数据。

配置方式
  • XML
<hazelcast>
    <map name="default">
        <max-idle-seconds>60</max-idle-seconds>
    </map>
</hazelcast>
  • YAML
hazelcast:
  map:
    default:
      max-idle-seconds: 60

特定条目设置过期策略

要为特定映射条目配置过期策略,可以使用 IMap 的方法,相应的有 生存时间 和 最大空闲时间 参数。

  • 设置 key=1 数据的生存时间
myMap.put( "1", "John", 50, TimeUnit.SECONDS )
  • 要设置数据的最大空闲超时
myMap.put( "1", "John", 50, TimeUnit.SECONDS, 40, TimeUnit.SECONDS )
  • 更改现有数据的生存时间
myMap.setTtl( "1", 50, TimeUnit.SECONDS )

驱逐

驱逐策略限制了 Map 的大小。如果 Map 的大小超过限制,定义的驱逐策略将从 Map 中删除某些数据以减小其大小。

要配置驱逐策略,使用 sizemax-size-policy 和 eviction-policy

大小

size 定义了 Map 数据大小的最大值当达到最大大小时,根据 eviction-policy 元素的值删除Map 中的数据。

其有效值为 0 到 Integer.MAX VALUE 之间的整数。它的默认值为0,即没有驱逐,无限制

如果要将此元素设置为 0 以外的任何大小,则还必须将其对应的 eviction-policy 属性设置为 NONE 以外的值。

大小策略

max-size-policy 定义了测量 Map 最大值 的策略。

Hazelcast 按分区测量 Map 的大小。例如,如果 max-size 对应的大小策略为 PER_NODE,Hazelcast 会计算每个分区的每个集群成员中的最大数据条数。其计算方式如下:

partition-maximum-size = max-size * member-count / partition-count

Hazelcast 会根据集群大小和所选大小策略找到要驱逐的最佳数据条数。

max-size-policy 所有策略如下:

策略名描述
PER_NODE每个集群成员的 Map 最大数据条数,这是默认策略
PER_PARTITION每个分区的 Map 最大数据条数
USED_HEAP_SIZE每个 Hazelcast 实例的每个 Map 的堆最大使用大小,单位M
USED_HEAP_PERCENTAGE  每个 Hazelcast 实例的每个 Map 的堆最大使用百分比      
FREE_HEAP_SIZE每个 JVM 的最小可用堆大小,单位M
FREE_HEAP_PERCENTAGE每个 JVM 的最小可用堆百分比
USED_NATIVE_MEMORY_SIZE每个 Hazelcast 实例的每个 Map 的最大已用本机内存大小,单位M,企业版可用
USED_NATIVE_MEMORY_PERCENTAGE每个 Hazelcast 实例的每个映射的最大已用本机内存百分比,企业版可用
FREE_NATIVE_MEMORY_SIZE每个 Hazelcast 实例的最小可用本机内存大小,单位M,企业版可用
FREE_NATIVE_MEMORY_PERCENTAGE每个 Hazelcast 实例的最小可用本机内存百分比,企业版可用

驱逐策略

eviction-policy 该元素定义当 Map 的大小大于 size 指定的值时要删除哪些数据。

eviction-policy 所有策略如下:

策略名描述
默认策略。如果设置,则不会驱逐任何项目并且 size 忽略该元素。
LRU删除最近最少使用的 Map 数据
LFU删除最不常用的 Map 数据

如有需要,可自定义驱逐策略

配置方式 
  • XML
<hazelcast>
    <map name="nativeMap">
        <in-memory-format>NATIVE</in-memory-format>
        <eviction max-size-policy="USED_NATIVE_MEMORY_PERCENTAGE" eviction-policy="LFU" size="75"/>
    </map>
</hazelcast>
  • YAML
hazelcast:
  map:
    nativeMap:
      in-memory-format: NATIVE
      eviction:
        eviction-policy: LFU
        max-size-policy: USED_NATIVE_MEMORY_PERCENTAGE
        size: 75

内存格式

设置的用于存储数据的内存格式会对应用程序的性能产生重大影响。当数据在客户端和 Hazelcast 集群之间或集群成员之间移动时,数据始终采用序列化(二进制)格式。

设置内存格式的目标是通过仅在必要时执行操作来最大限度地减少序列化的开销。

如果集群的大部分操作是读取 ( get) 和写入 ( put),则保持数据格式 BINARY 是最有效的。在 put 操作中,执行放置的应用程序将数据序列化以便通过网络传输。集群成员只需将接收到的数据写入映射,而不进行任何格式更改。在 get 操作中,集群成员返回所请求的映射条目的二进制副本。应用程序对返回的数据执行必要的反序列化。

但是,如果大多数集群操作都是查询,则反序列化开销就成为一个问题。查询必须针对对象运行,而不是针对二进制数据。通过以 OBJECT 格式存储经常查询的数据 ,在将数据添加到地图时会产生反序列化开销。

要配置内存格式,使用 in-memory-format 设置。 

in-memory-format 所有的内存格式如下:

内存格式名描述
BINARY数据(键和值)以序列化二进制格式存储,默认格式
OBJECT数据以反序列化形式存储。键仍以二进制格式存储
NATIVE数据以序列化二进制格式存储在 JVM 堆之外,企业版可用

配置方式 
  • XML
<hazelcast>
    <map name="objectMap">
        <in-memory-format>OBJECT</in-memory-format>
    </map>
</hazelcast>
  • YAML
hazelcast:
  map:
    objectMap:
      in-memory-format: OBJECT

总结

Hazelcast Map相关的细枝末节还有很多,有需要的小伙伴访问官网查看并研究。Map 相关的内容暂时告一段落,接下来,会对 Hazelcast 的分布式查询、统计、流处理相关进行探索。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1324056.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

四川云汇优想教育咨询有限公司电商服务靠谱吗

随着抖音电商的兴起&#xff0c;越来越多的商家开始关注这一领域。四川云汇优想教育咨询有限公司作为一家专注于电商服务的企业&#xff0c;也受到了广泛的关注。那么&#xff0c;四川云汇优想教育咨询有限公司的抖音电商服务靠谱吗&#xff1f;下面我们将从多个方面进行深入剖…

OpenCV技术应用(9)— 视频的暂停播放和继续播放

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。本节课就手把手教大家如何控制视频的暂停播放和继续播放&#xff0c;希望大家学习之后能够有所收获~&#xff01;&#x1f308; 目录 &#x1f680;1.技术介绍 &#x1f680;2.实现代码 &#x1f680;1.技术介绍…

Leetcode—96.不同的二叉搜索树【中等】

2023每日刷题&#xff08;六十四&#xff09; Leetcode—96.不同的二叉搜索树 算法思想 实现代码 class Solution { public:int numTrees(int n) {vector<int> G(n 1, 0);G[0] 1;G[1] 1;for(int i 2; i < n; i) {for(int j 1; j < i; j) {G[i] G[j - 1] * …

appium工具相关

一、appium基本介绍 1、appium 基本介绍 定义&#xff1a;appium 就是一款非常流行和好用的第三方工具&#xff0c;通过该工具我们可以配合 python 脚本实现 IOS / Android 多平台的APP 自动化测试。作用&#xff1a;在编写测试脚本的PC机和运行 APP 的真机或设备之前充当一个…

Linux Mint 21.3 代号为“Virginia”开启下载

Linux Mint 团队今天放出了 Linux Mint 21.3 Beta ISO 镜像&#xff0c;正式版计划在今年圣诞节发布。 支持 在实验性支持 Wayland 之外&#xff0c;Cinnamon 6.0 版 Linux Mint 21.3 Beta 镜像还带来了其它改进&#xff0c;Nemo 文件夹管理器右键菜单支持下载相关操作。 Cin…

一个很好用的Docker可视化管理工具

目录 前言Portainer安装部署使用 前言 一个好的docker可视化管理工具&#xff0c;可以提升我们不少的工作效率&#xff0c;下面我就推荐一个我使用过的&#xff0c;感觉很不错的一个可视化管理工具给大家 Portainer Portainer是一个开源的Docker管理工具&#xff0c;提供了容…

WPF——样式和控件模板、数据绑定与校验转换

样式和控件模板 合并资源字典 Style简单样式的定义和使用 ControlTemplate控件模板的定义和使用 定义 使用 Trigger触发器 数据绑定与校验转换 数据绑定的设置 代码层实现绑定 数据模板DataTemplate xml文件的读取与显示 方法的返回值作为源绑定到控件中ObjectDataProvider L…

飞天使-k8s知识点1-kubernetes架构简述

文章目录 名词功能要点 k8s核心要素CNCF 云原生框架简介k8s组建介绍 名词 CI 持续集成, 自动化构建和测试&#xff1a;通过使用自动化构建工具和自动化测试套件&#xff0c;持续集成可以帮助开发人员自动构建和测试他们的代码。这样可以快速检测到潜在的问题&#xff0c;并及早…

Gateway网关-全局过滤器

目录 一、全局过滤器 GlobalFilter 二、案例实现 2.1 创建AuthorizeFilter实现类 2.2 重启服务测试 三、总结 3.1 全局过滤器的作用是什么? 3.2 实现全局过滤器的步骤? 一、全局过滤器 GlobalFilter 全局过滤器的作用也是处理一切进入网关的请求和微服务响应&#xff0…

(2021|EMNLP,CLIP,CLIPScore,RefCLIPScore)CLIPScore:图像标题的无参考评估指标

CLIPScore: A Reference-free Evaluation Metric for Image Captioning 公z号&#xff1a;EDPJ&#xff08;添加 VX&#xff1a;CV_EDPJ 或直接进 Q 交流群&#xff1a;922230617 获取资料&#xff09; 目录 0. 摘要 1. 简介 2. 相关工作 3. CLIPScore 4. 标题评估基准 …

clangd:Couldn‘t build compiler instance

在使用vscode clangd 搭建RK3588 5.10版本linux内核代码开发环境时&#xff0c;使用bear生成 compile_commands.json时&#xff0c;clangd生成标签失败代码无法跳转&#xff0c;查看clangd日志&#xff0c;发现标签生成失败&#xff0c;失败原因&#xff1a;Couldnt build comp…

【Spring教程32】SSM框架整合实战:从零开始学习SSM整合之功能模块开发 单元测试示例代码 PostMan接口测试示例

目录 1 功能模块开发1.1 步骤1:创建数据库及表1.2 步骤2:编写模型类1.3 步骤3:编写Dao接口1.4 步骤4:编写Service接口和实现类1.5 步骤5:编写Contorller类 2.单元测试2.1 步骤1:新建测试类2.2 步骤2:注入Service类2.3 步骤3:编写测试方法 3 PostMan测试3.1 新增3.2 修改3.3 删除…

单播、多播、广播、组播、泛播、冲突域、广播域、VLAN概念汇总

1 引言 “多播”可以理解为一个人向多个人&#xff08;但不是在场的所有人&#xff09;说话&#xff0c;这样能够提高通话的效率。如果你要通知特定的某些人同一件事情&#xff0c;但是又不想让其他人知道&#xff0c;使用电话一个一个地通知就非常麻烦&#xff0c;而使用日常…

软件企业在什么情况下需要找第三方软件测试机构?如何收费?

近年来&#xff0c;随着软件行业的迅猛发展&#xff0c;软件企业对软件测试的需求也越来越大。为了保证软件的质量和稳定性&#xff0c;许多企业选择寻找第三方软件测试机构来进行软件测试。第三方软件测试机构是独立于软件开发企业的专业机构&#xff0c;主要从事软件测试和质…

5252D 5G基站测试仪

01 5252D 5G基站测试仪 产品综述&#xff1a; 5252D多通道综测仪打破了信号发生器进行信号发射、频谱分析仪进行观看频域波形的测试方案&#xff0c;将信号收发融为一体&#xff0c;推动无线通信测试进入全新时代。其独具的多通道收发一体、高性能、全方位测试能力及直观操作…

如何在小程序中添加字符

随着移动互联网的普及&#xff0c;微信小程序已经成为众多商家的首选。通过微信小程序&#xff0c;商家可以展示产品、服务和品牌形象。那么如何在微信小程序中添加视频内容呢&#xff1f;本文将详细介绍操作步骤。 首先&#xff0c;商家需要登录乔拓云平台&#xff0c;进入门店…

计算机操作系统学习笔记

一、什么是操作系统 1、概念 操作系统&#xff08;operating system&#xff0c;简称OS&#xff09;是管理计算机硬件与软件资源的计算机程序。操作系统需要处理如管理与配置内存、决定系统资源供需的优先次序、控制输入设备与输出设备、操作网络与管理文件系统等基本事务。 …

机器学习之逻辑回归,一文掌握逻辑回归算法知识文集

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

路由跳转传递参数注意事项,查询字符串传参,params传参需要注意的地方,菜单内容的二级内容 vue3

路由跳转和传参(vue3)_vue3路由传参-CSDN博客 注意&#xff1a; import {useRouter} from "vue-router"const routeruseRouter()1.查询字符串传参&#xff0c;传一个对象&#xff0c;对象里面可以写path字段 router.push({path:/item,query:{id:1}} ) 通过当前路由…

嵌入式中GPIO的工作原理-面试工作必会技能

GPIO工作方式 1、4种输入模式 输入浮空输入上拉输入下拉模拟输入 如下图为GPIO的基本结构&#xff0c;它主要由4部分组成&#xff0c;其中我们所看到的的最右边的I/O引脚&#xff0c;也就是芯片外接可看到的引脚&#xff0c;其它的部分都是GPIO内部的结构。 ①保护二极管 保护…