高性能内存对象缓存

1:数据存储方式与数据过期方式

数据存储方式多种多样,以下为常见的几种:
1.关系型数据库:如 MySQL、Oracle 等,通过表格形式组织数据,具有严格的数据结构和关系约束,适用于结构化数据的存储和管理。例如企业的财务数据、员工信息等。
3.非关系型数据库:包括 MongoDB、Cassandra 等,采用灵活的数据模型,如文档型、键值对型等,能够处理大规模和高并发的数据读写。像社交媒体平台上的用户动态、评论等数据适合用此类方式存储。
4.文件系统:直接将数据存储为文件,如文本文件、二进制文件等。常用于存储图片、音频、视频等大型文件。
分布式存储系统:如 Hadoop 的 HDFS,能够在多个节点上分布存储数据,实现大规模数据的可靠存储和高效访问。
数据过期方式
数据过期方式通常取决于数据的性质、业务需求和存储策略。常见的有以下几种:
1.基于时间戳:为数据添加创建时间或更新时间的字段,根据设定的时间阈值来判断数据是否过期。例如,一个电商网站可能会将 30 天前的订单标记为过期。
2.基于数据的使用频率:如果某些数据长时间未被访问或使用,就将其视为过期。比如缓存中的数据,若长时间未被请求,就会被清除。
3.基于数据的重要性或业务规则:例如金融交易数据可能需要保留一定年限,超过这个年限则过期。
4.容量限制:当存储容量达到上限时,按照一定规则删除较旧或不太重要的数据。比如日志数据,当存储空间满时,删除最早的部分日志。

2:Memcached 缓存机制


其缓存机制具有以下几个关键特点:
1. 基于内存存储:数据直接存储在内存中,这使得数据的读取和写入速度极快,能够显著提高应用程序的性能。例如,对于频繁访问但数据变动不频繁的用户信息、配置数据等,Memcached 能够快速响应请求。
2. 键值对存储:以简单的键值对形式存储数据。键作为数据的唯一标识符,值则是实际存储的数据。这种简单的数据结构易于管理和操作。
3. 分布式架构:可以在多个服务器上部署,通过分布式算法将数据均匀分布在不同的节点上,从而实现横向扩展,提高缓存的容量和性能。
4. 过期策略:支持为每个缓存项设置过期时间。当时间到达后,相应的缓存项会被自动删除,以释放内存空间。
5. 数据一致性:Memcached 本身不保证数据的一致性。在数据更新时,需要在应用层处理数据同步的逻辑。
6. 缓存淘汰策略:当内存不足时,会根据预先设定的淘汰策略删除一些缓存项,常见的策略如 LRU(最近最少使用)。
例如,在一个高并发的电商网站中,商品的热门分类信息可以存储在 Memcached 中,当用户频繁访问这些分类时,能够快速获取数据,而不必每次都从数据库读取,大大减轻了数据库的压力,提高了网站的响应速度。
在一个社交应用中,用户的最近登录时间等信息可以利用 Memcached 的缓存机制进行存储,以快速判断用户的活跃状态。
总之,Memcached 的缓存机制在提高系统性能、减轻数据库负载方面发挥着重要作用,但在使用时需要结合具体的业务需求和场景,合理配置和管理缓存。

3:Memcached 分布式

Memcached分布式部署主要依赖于Memcached的客户来端实现,多个Memcached 服务器是独立的。分布式数据如何存储是由路由算法所决定。当数据到达客户端程序库,客户端的算法就依据路由算法来决定保的Memcached 服务器。读取数据时,客户端依据使用保存数据时相同的路由算法选中和存储数据时相同的服务器来读取数据。

4:Memcached 路由算法

1. 求余数算法
基本原理是将 key 做哈希运算,得到一个整数,然后对 Memcached 服务器的数量进行求余数,根据余数来决定存储到哪个 Memcached 实例。
例如,有 4 台 Memcached 服务器,计算方式如下:
8 % 4 = 0,则数据存储到第 1 台服务器(余数从 0 开始计数);
7 % 4 = 3,则数据存储到第 4 台服务器;
6 % 4 = 2,则数据存储到第 3 台服务器;
5 % 4 = 1,则数据存储到第 2 台服务器。
这种算法的优点是能够使数据较为均匀地分布在每个 Memcached 服务器上。然而,它存在很大的缺点,一旦某个 Memcached 服务器宕机,或有新的 Memcached 服务器加入,就可能会找不到数据,导致严重的数据丢失。
2. 一致性哈希算法
一致性哈希算法通过一个叫作一致性哈希环的数据结构实现 key 到缓存服务器的哈希映射。具体算法过程为:先构造一个长度为 0 到 2^32 的整数环(即一致性哈希环),根据节点名称(通常是 IP)的哈希值(其分布范围同样为 0 到 2^32)将缓存服务器节点放置在这个哈希环上。然后根据需要缓存的数据的 key 值计算得到其哈希值(其分布范围也同样为 0 到 2^32),然后在哈希环上顺时针查找距离这个 key 的哈希值最近的缓存服务器节点,完成 key 到服务器的哈希映射查找。
当缓存服务器集群需要扩容时,只需要将新加入的节点名称的哈希值放入一致性哈希环中。由于 key 是顺时针查找距离其最近的节点,因此新加入的节点只影响整个环中的一小段。这样能保证大部分被缓存的数据还可以继续命中,例如 3 台服务器扩容至 4 台服务器,可以继续命中原有缓存数据的概率是 75%,远高于余数哈希算法的 25%,而且随着集群规模越大,继续命中原有缓存数据的概率也逐渐增大。

Memcached 实现主主复制和高可用的方式


Memcached 主主复制架构

1:安装带有复制功能的 Memcached

安装 Libevent

systemctl stop firewalld
setenforce 0
yum -y install gcc* psmisc

安装memcached-1.2.8-repcached

[root@memcache1 ~]# tar zxvf memcached-1.2.8-repcached-2.2.tar.gz 
[root@memcache1 ~]# cd memcached-1.2.8-repcached-2.2
[root@Memcached1 memcached-1.2.8-repcached-2.2]# ./configure \
--prefix=/usr/local/memcached_replication \
--enable-replication \
--with-libevent=/usr/local/libevent[root@memcache1 memcached-1.2.8-repcached-2.2]# vim memcached.c
#找到如下几行(在55行--60行):
/* FreeBSD 4.x doesn't have IOV_MAX exposed. */
#ifndef IOV_MAX
#if defined(__FreeBSD__) || defined(__APPLE__)
# define IOV_MAX 1024
#endif
#endif#修改成如下所示:(删掉上面红色的两行)
/* FreeBSD 4.x doesn't have IOV_MAX exposed. */
#ifndef IOV_MAX
# define IOV_MAX 1024
#endif[root@memcache1 memcached-1.2.8-repcached-2.2]# make && make install

启动 Memcached 服务

在memcache1上启动

[root@memcache1 ~]# ln -s /usr/local/libevent/lib/libevent-2.1.so.6 /usr/lib64/
[root@Memcached1 ~]# /usr/local/memcached_replication/bin/memcached -d -u root -m 128 -x 192.168.10.102

在memcache2上启动

[root@memcache1 ~]# ln -s /usr/local/libevent/lib/libevent-2.1.so.6 /usr/lib64/
[root@Memcached1 ~]# /usr/local/memcached_replication/bin/memcached -d -u root -m 128 -x 192.168.10.101

在两台服务器上检查进程

[root@memcache1 ~]# netstat -antp |grep memcached
tcp        0      0 0.0.0.0:11211           0.0.0.0:*               LISTEN      52646memcached     
tcp        0      0 192.168.10.101:11212    192.168.10.102:38298    ESTABLISHED 52646memcached     
tcp6       0      0 :::11211                :::*                    LISTEN      52646memcached [root@memcache2 ~]# netstat -antp |grep memcached
tcp        0      0 0.0.0.0:11211           0.0.0.0:*               LISTEN      29976memcached     
tcp        0      0 192.168.10.102:38298    192.168.10.101:11212    ESTABLISHED 29976memcached     
tcp6       0      0 :::11211                :::*                    LISTEN      29976memcached 

使用 telnet 进行简单验证复制功能

Memcached1 上插入一条具有特点的键值

[root@memcache1 ~]# yum -y install telnet
[root@memcache1 ~]# telnet 192.168.10.102 11211
set username 0 0 8    #自定义信息+永不过期+8个字节
12345678
STORED
get username
VALUE username 0 8
12345678
END
quit

Memcached2 上进行查看刚刚插入的键值

[root@localhost ~]# telnet 192.168.10.101 11211
Trying 192.168.10.101...
Connected to 192.168.10.101.
Escape character is '^]'.
get username
VALUE username 0 8
zhangsan
END

Memcached 主主复制+Keepalived 高可用架构

安装配置 keepalived(两台主机都安装)

[root@memcache1 ~]# yum -y install keepalived

配置主 keepalived

[root@memcache1 ~]# vim /etc/keepalived/keepalived.conf 
! Configuration File for keepalivedglobal_defs {notification_email {acassen@firewall.locfailover@firewall.locsysadmin@firewall.loc}notification_email_from Alexandre.Cassen@firewall.locsmtp_server 192.168.200.1smtp_connect_timeout 30router_id LVS_01vrrp_skip_check_adv_addr#vrrp_strictvrrp_garp_interval 0vrrp_gna_interval 0
}vrrp_script check_down {     ##定义要执行的脚本
script "/etc/keepalived/memcached.sh"		##脚本路径和名称
interval 1		##间隔1秒执行一次
}vrrp_instance VI_1 {state BACKUP      ##master角色不能设置nopreempt,所以此处要设置为BACKUPinterface ens33virtual_router_id 51priority 100    ##从主机的优先级要小于此数字
advert_int 1
nopreempt		##添加,此语句关闭了抢占功能,从主机不需要authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.10.100
}track_script {		##调用前面的脚本check_down
}}
[root@memcached1 keepalived]# vim /etc/keepalived/memcached.sh
#!/bin/bash
#
if [ $(ps -C memcached --no-header | wc -l) -eq 0 ]; thensystemctl stop keepalived
fi[root@memcached1 keepalived]# chmod +x /etc/keepalived/memcached.sh

配置从keepalived

[root@memcache2 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalivedglobal_defs {notification_email {acassen@firewall.locfailover@firewall.locsysadmin@firewall.loc}notification_email_from Alexandre.Cassen@firewall.locsmtp_server 192.168.200.1smtp_connect_timeout 30router_id LVS_02vrrp_skip_check_adv_addr#vrrp_strictvrrp_garp_interval 0vrrp_gna_interval 0
}vrrp_script check_down {     ##定义要执行的脚本
script "/etc/keepalived/memcached.sh"		##脚本路径和名称
interval 1		##间隔1秒执行一次
}vrrp_instance VI_1 {state BACKUP      interface ens33virtual_router_id 51priority 99    ##从主机的优先级要小于此数字
advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.10.100
}track_script {		##调用前面的脚本check_down
}}[root@memcached2 keepalived]# 	#!/bin/bash
#
if [ $(ps -C memcached --no-header | wc -l) -eq 0 ]; thensystemctl stop keepalived
fi[root@memcached2 keepalived]# chmod +x /etc/keepalived/memcached.sh

测试验证

在两台服务器上启动keepalived

[root@Memcached1 ~]# systemctl start keepalived 
[root@memcached2 ~]# systemctl start keepalived

在客户端修改缓存服务器地址

[root@memcached-api ~]# vim /usr/local/httpd/htdocs/test3.php
<?php 
$memcache = new Memcached(); 
$memcache->addServer('192.168.10.100', 11211); 
$memcache->set('key', 'Memcache test successful!', 0, 60); 
$result = $memcache->get('key'); 
unset($memcache); 
echo $result; 
?> 

pkill memcached

检查当前主机的memceched进程和keepalived进程,

关闭memcached后,该主机的keepalived也会被脚本关闭,于是VIP就漂移到了另一台主机,待此主机修好后,把memcached和keepalived开启,由于设置了不抢占,VIP不会抢占回来,但是把第二台主机的memcached关闭后,第二台主机的keepalived也会关闭,于是VIP就漂移回了第一台主机。完成故障的转移。

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

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

相关文章

设计模式第一天|了解设计模式、设计模式七大原则

文章目录 了解设计模式概念优点核心原则 设计模式七大原则单一职责原则里氏替换原则依赖倒置原则接口隔离原则迪米特法则开闭原则合成复用原则 了解设计模式 概念 软件设计模式(Software Design Patten),又称设计模式,是一套被反复使用,多数人只晓的,经过分类编目的,代码设计…

JVM知识点总结(全网最详细)!!!!

JVM知识总结 运行时数据区域程序计数器Java虚拟机栈局部变量表 StackOverflowError异常和OutOfMemoryError异常本地方法栈Java堆方法区运行时常量池 对象的创建对象的内存分配对象的内存布局对象头实例数据对齐填充 对象的访问定位使用句柄直接指针使用句柄和直接指针的优缺点 …

android11 屏蔽usb通过otg转接口外接鼠标设备

硬件平台&#xff1a;QCS6125 软件平台&#xff1a;Android11 需求&#xff1a;Android设备通过接usb转接线连接鼠标功能屏蔽。 考虑到屏蔽的层面可以从两个层面去做&#xff0c;一个是驱动层面不识别&#xff0c;一个就是Android系统层面不识别加载&#xff0c;本篇只讲后者。…

重置Kafka

重置kafka 1、关闭kafka kill -9 进程号 2、删除元数据 1&#xff09;zk zkCli.sh 2&#xff09;删除预kafka有关的所有信息 ls / rmr /config rmr /brokers 3、删除kafka的数据 所有节点都要删除 rm -rf /usr/local/soft/kafka_2.11-2.0.0/data 4、 重启 kafka-server-sta…

PHP房产中介租房卖房平台微信小程序系统源码

​&#x1f3e0;【租房卖房新选择】揭秘房产中介小程序&#xff0c;一键搞定置业大事&#xff01;&#x1f3e1; &#x1f50d;【开篇&#xff1a;告别繁琐&#xff0c;拥抱便捷】&#x1f50d; 还在为找房子跑断腿&#xff1f;为卖房发愁吗&#xff1f;今天给大家安利一个超…

IPython与Pandas:数据分析的动态组

IPython与Pandas&#xff1a;数据分析的动态组合 前言 欢迎来到"iPython与Pandas&#xff1a;数据分析的动态组合"教程&#xff01;无论你是数据分析新手还是希望提升技能的专业人士&#xff0c;这里都是你开始的地方。让我们开始这段数据分析之旅吧&#xff01; …

【.NET全栈】ASP.NET开发Web应用——AJAX开发技术

文章目录 前言一、ASP.NET AJAX基础1、AJAX技术简介2、ASP.NET AJAX技术架构 二、ASP.NET AJAX服务器端扩展1、声明ScriptManager控件2、使用ScriptManager分发自定义脚本3、在ScriptManager中注册Web服务4、处理ScriptManager中的异常5、编程控制ScriptManager控件6、使用Upda…

如何高效定制视频扩散模型?卡内基梅隆提出VADER:通过奖励梯度进行视频扩散对齐

论文链接&#xff1a;https://arxiv.org/pdf/2407.08737 git链接&#xff1a;https://vader-vid.github.io/ 亮点直击&#xff1a; 引入奖励模型梯度对齐方法&#xff1a;VADER通过利用奖励模型的梯度&#xff0c;对多种视频扩散模型进行调整和对齐&#xff0c;包括文本到视频和…

如何评估 5G 毫米波相控阵天线模块

5G 新无线电 (5G NR) 是空中接口或无线接入网络 (RAN) 技术的行业标准和全球规范。它涵盖 6 GHz 及以下频率&#xff08;称为 FR1&#xff09;和 24 GHz 至 50 GHz 或更高频段&#xff08;称为 FR2 或 mmWave&#xff09;的运行。该技术可用于固定或移动接入、回程和日益流行的…

Flutter 插件之 package_info_plus

当使用Flutter开发应用时,通常需要获取应用程序的基本信息,例如包名、版本号和构建号。Flutter提供了一个名为 package_info_plus 的插件,它能方便地帮助我们获取这些信息。 1. 添加依赖 首先,需要在项目的 pubspec.yaml 文件中添加 package_info_plus 的依赖。打开 pubs…

C语言结构体字节对齐技术详解

C语言结构体字节对齐技术详解&#xff08;第一部分&#xff09; 在C语言中&#xff0c;结构体字节对齐是一个重要的概念&#xff0c;它涉及到内存中数据的布局和访问效率。字节对齐可以帮助提高程序的性能&#xff0c;减少内存碎片&#xff0c;并确保数据的一致性和正确性。本…

一些简单的基本知识(与C基本一致)

一、注释 1.单行注释&#xff1a;//&#xff08;快捷键&#xff1a;ctrlshift&#xff1f;&#xff0c;可以选择多行&#xff09; 2.多行注释&#xff1a;/* 文本 */ 二、变量 变量的作用是给一段内存空间起名&#xff0c;方便操作内存中的数据。 通过赋予某数据的…

逆向案例二十五——webpack所需模块函数很多,某翼云登录参数逆向。

解决步骤&#xff1a; 网址&#xff1a;aHR0cHM6Ly9tLmN0eXVuLmNuL3dhcC9tYWluL2F1dGgvbG9naW4 不说废话&#xff0c;密码有加密&#xff0c;直接搜索找到疑似加密位置打上断点。 再控制台打印&#xff0c;分析加密函数 有三个处理过程&#xff0c;b[g]得到的是用户名,b[f] 对…

【ASP.NET网站传值问题】“object”不包含“GetEnumerator”的公共定义,因此 foreach 语句不能作用于“object”类型的变量等

问题一&#xff1a;不允许遍历 原因&#xff1a;实体未强制转化 后端: ViewData["CateGroupList"] grouplist; 前端加上&#xff1a;var catelist ViewData["CateGroupList"] as List<Catelogue>; 这样就可以遍历catelist了 问题二&#xff1a…

数据结构初阶·排序算法(内排序)

目录 前言&#xff1a; 1 冒泡排序 2 选择排序 3 插入排序 4 希尔排序 5 快速排序 5.1 Hoare版本 5.2 挖坑法 5.3 前后指针法 5.4 非递归快排 6 归并排序 6.1递归版本归并 6.2 非递归版本归并 7 计数排序 8 排序总结 前言&#xff1a; 目前常见的排序算法有9种…

探索Eureka的高级用法:在服务中实现分布式锁

在分布式系统中&#xff0c;实现分布式锁是一种常见需求&#xff0c;用于确保多个服务实例不会同时访问共享资源或执行相同的任务。虽然Eureka本身是一个服务发现工具&#xff0c;并不直接提供分布式锁功能&#xff0c;但我们可以通过结合其他技术&#xff08;如Redis、Zookeep…

Torch-Pruning 库入门级使用介绍

项目地址&#xff1a;https://github.com/VainF/Torch-Pruning Torch-Pruning 是一个专用于torch的模型剪枝库&#xff0c;其基于DepGraph 技术分析出模型layer中的依赖关系。DepGraph 与现有的修剪方法&#xff08;如 Magnitude Pruning 或 Taylor Pruning&#xff09;相结合…

TCP重传机制详解

1.什么是TCP重传机制 在 TCP 中&#xff0c;当发送端的数据到达接收主机时&#xff0c;接收端主机会返回⼀个确认应答消息&#xff0c;表示已收到消息。 但是如果传输的过程中&#xff0c;数据包丢失了&#xff0c;就会使⽤重传机制来解决。TCP的重传机制是为了保证数据传输的…

React安装(学习版)

1. 安装Node.js和npm 首先&#xff0c;确保你的电脑上已经安装了Node.js和npm&#xff08;Node Package Manager&#xff09;。你可以从 Node.js官网 下载安装包并按照提示进行安装。安装完成后&#xff0c;可以在命令行终端中验证Node.js和npm是否正确安装&#xff1a; node …

【Node.js】初识 Node.js

Node.js 概念 Node.js 是一个开源与跨平台的 JavaScript运行时环境 &#xff0c;在浏览器外运行 V8 JavaScript 引擎(Google Chrome的内核)&#xff0c;利用事件驱动、非阻塞和异步输入输出 等技术提高性能。 可以理解为 Node.js就是一个服务器端的、非阻塞式 l/O 的、事件驱…