Memcached

1. NoSQL介绍

NoSQL是对 Not Only SQL、非传统关系型数据库的统称。

NoSQL一词诞生于1998年,2009年这个词汇被再次提出指非关系型、分布式、不提供ACID的数据库设计模式。

随着互联网时代的到来,数据爆发式增长,数据库技术发展日新月异,要适应新的业务需求。

而随着移动互联网、物联网的到来,大数据的技术中NoSQL也同样重要。

NoSQL 分类

  • Key-value Store k/v数据库

    • 性能好 O(1) , 如: redis、memcached

  • Document Store 文档数据库

    • mongodb、CouchDB

  • Column Store 列存数据库,Column-Oriented DB

    • HBase、Cassandra,大数据领域应用广泛

  • Graph DB 图数据库

    • Neo4j

  • Time Series 时序数据库

    • InfluxDB、Prometheus

2. Memcached 

Memcached 只支持能序列化的数据类型,不支持持久化,基于 Key-Value 的内存缓存系统

memcached 虽然没有像redis所具备的数据持久化功能,比如 RDB 和 AOF 都没有,但是可以通过做集群同步的方式,让各 memcached 服务器的数据进行同步,从而实现数据的一致性,即保证各 memcached 的数据是一样的,即使有任何一台 memcached 发生故障,只要集群中有一台 memcached 可用就不会出现数据丢失,当其他 memcached 重新加入到集群的时候,可以自动从有数据的 memcached 当中自动获取数据并提供服务

Memcached 借助了操作系统的 libevent 工具做高效的读写。libevent 是个程序库,它将Linux的epoll、BSD类操作系统的kqueue等事件处理功能封装成统一的接口。即使对服务器的连接数增加,也能发挥高性能。memcached 使用这个 libevent 库,因此能在Linux、BSD、Solaris等操作系统上发挥其高性能

Memcached 支持最大的内存存储对象为1M,超过1M的数据可以使用客户端压缩或拆分报包放到多个key中,比较大的数据在进行读取的时候需要消耗的时间比较长,memcached 最适合保存用户的 session 实现 session 共享,Memcached 存储数据时, Memcached会去申请1MB的内存, 把该块内存称为一个slab, 也称为一个page

Memcached 支持多种开发语言,包括:JAVA,C,Python,PHP,C#,Ruby,Perl等

Memcached 是一个高性能、分布式的内存对象缓存系统,用于减轻数据库负载,提升动态Web应用的性能。它基于内存键值存储系统设计,通过在内存中存储数据来减少对慢速数据库的访问次数,从而提高网站或应用程序的速度和响应能力。

尽管 Memcached 在功能上有时被当作一种辅助数据库使用,但其主要角色是作为一个高性能、分布式的缓存层,适用于实时性要求高且数据可以容忍一定程度丢失的应用场景。

Memcached 的主要特性包括:

  1. 分布式缓存:可以在多台服务器上部署多个 Memcached 实例,并且客户端可以透明地将数据分发到这些实例上。

  2. 内存存储:所有数据都存储在内存中,使得数据读取速度极快,但这也意味着当服务器关闭时,未持久化的数据将会丢失。

  3. 简单键值对存储:Memcached 以键值对的形式存储数据,键是字符串类型,值可以是任意类型的数据,但在存储前会被转化为字节流。

  4. LRU(最近最少使用)淘汰策略:当内存达到预设上限时,Memcached 将根据 LRU 算法自动删除最近最少使用的数据,为新数据腾出空间。

  5. 非持久化:Memcached 不支持持久化存储,主要用于临时缓存。

  6. 高并发:Memcached 支持大量并发连接,能处理大量的读写请求。

  7. 协议简单:Memcached 使用自定义的文本协议,易于理解和实现。

Memcached 广泛应用于大型网站和服务中,如社交网络、电子商务、内容管理系统等场景,用以加速用户会话存储、数据库查询结果缓存以及其他需要快速获取的数据。

3. Memcached 和 Redis 比较

比较类别Redismemcached
支持的数据结构哈希、列表、集合、有序集合纯kev-value
持久化支持
高可用支持redis支持集群功能,可以实现主动复制,读写分离官方也提供了sentinel集群管理工具,能够实现主从服务监控,故障自动转移,这一切,对于客户端都是透明的,无需程序改动,也无需人工介入需要二次开发
存储value容量最大512M最大1M
内存分配临时申请空间,可能导致碎片预分配内存池的方式管理内存,能够省去内存分配时间
虚拟内存使用有自己的VM机制,理论上能够存储比物理内存更多的数据,当数据超量时,会引发swap,把冷数据刷到磁盘上所有的数据存储在物理内存里
网络类型非阻塞IO复用模型,提供一些非KV存储之外的排序聚合功能,在执行这些功能时,复杂的CPU计算,会阻塞整个IO调度非阻塞IO复用模型
水平扩展支持redis cluster 可以横向扩展暂无
多线程Redis6.0之前是只支持单线程Memcached支持多线程,CPU利用方面Memcache优于redis
单机QPS约10W约60W
源代码可读性代码清爽简洁可能是考虑了太多的扩展性,多系统的兼容性,代码不清爽
适用场景复杂数据结构、有持久化、高可用需求、value存储内容较大纯KV,数据量非常大,并发量非常大的业务

4. Memcached 工作机制

4.1 内存分配机制

应用程序运行需要使用内存存储数据,但对于一个缓存系统来说,申请内存、释放内存将十分频繁,非常容易导致大量内存碎片,最后导致无连续可用内存可用。

Memcached 采用了 Slab Allocator 机制来分配、管理内存。

  • Page:分配给 Slab 的内存空间,默认为1MB,分配后就得到一个Slab。Slab分配之后内存按照固定字节大小等分成 chunk。

  • Chunk:用于缓存记录 k/v 值的内存空间。Memcached 会根据数据大小选择存到哪一个chunk中,假设chunk有128bytes、64bytes等多种,数据只有100bytes存储在128bytes中,存在少许浪费。

  • Chunk 最大就是 Page的大小,即一个Page中就一个Chunk

  • Slab Class:Slab 按照 Chunk 的大小分组,就组成不同的 Slab Class, 第一个Chunk大小为 96B的Slab为Class1,Chunk 120B为Class 2,如果有100bytes要存,那么 Memcached 会选择下图中Slab Class 2 存储,因为它是120bytes的Chunk。Slab之间的差异可以使用Growth Factor 控制,默认1.25。

4.2 懒惰期 Lazy Expiration

memcached 不会监视数据是否过期,而是在取数据时才看是否过期,如果过期,把数据有效期限标识为0,并不清除该数据。以后可以覆盖该位置存储其它数据。

4.3 LRU(最近最少使用算法)

当内存不足时,memcached 会使用 LRU(Least Recently Used)机制来查找可用空间,分配给新记录使用

4.4 集群

Memcached 集群,称为基于客户端的分布式集群,即由客户端实现集群功能,即 Memcached本身不支持集群

Memcached集群内部并不互相通信,一切都需要客户端连接到Memcached服务器后自行组织这些节点,并决定数据存储的节点。

5. 安装和启动

5.1 yum安装

[root@localhost ~]#yum install memcached -y

使用:

要先安装 telnet 

5.2 编译安装

[root@centos7 ~]#yum -y install gcc libevent-devel
[root@centos7 ~]#自己拉包
[root@centos7 ~]#tar xvf memcached-1.6.6.tar.gz
[root@centos7 ~]#cd memcached-1.6.6/
[root@centos7 memcached-1.6.6]#./configure --prefix=/apps/memcached
[root@centos7 memcached-1.6.6]#make && make install[root@localhost memcached-1.6.6]#ln -s /apps/memcached/bin/memcached  /usr/bin#准备用户
[root@centos7 ~]#useradd -r -s /sbin/nologin memcached
-r 随机生成系统用户#写配置文件
[root@centos7 ~]#cat >    /etc/sysconfig/memcached    << eof
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS=""
eof#准备service文件
[root@centos7 ~]#cat  > /lib/systemd/system/memcached.service    << eof
[Unit]
Description=memcached daemon
Before=httpd.service
After=network.target
[Service]
EnvironmentFile=/etc/sysconfig/memcached
ExecStart=/apps/memcached/bin/memcached -p  \${PORT} -u \${USER} -m \${CACHESIZE} -c \${MAXCONN} \$OPTIONS
[Install]
WantedBy=multi-user.target
eof[root@centos7 ~]#systemctl daemon-reload 
[root@centos7 ~]#systemctl enable --now memcached.service

增长因子的改变

#默认前台执行
[root@centos7 ~]#memcached -u memcached -m 1024 -c 65536 -f 2 -vv 
#
-u memcached:设置 Memcached 以 memcached 用户身份运行。
-m 1024:为 Memcached 分配最大内存为 1024 MB(即1GB),用于缓存数据。
-c 65536:设置最大并发连接数为 65536,这意味着同时可以有这么多的客户端连接到 Memcached 实例。
-f 2:设置核心文件大小限制,这里的“2”表示如果 Memcached 进程崩溃,将创建一个大小为当前内存两倍的核心转储文件,以便于调试。但在一些系统中,这个参数可能已经被弃用或不支持。
-vv:开启详细模式(verbose mode),让 Memcached 在运行时输出更多的信息和日志。#以台方式执行
[root@centos7 ~]#memcached -u memcached -m 1024 -c 65536 -d
#
-d:该选项会让 Memcached 在后台作为守护进程运行(daemonize),这样在终端窗口关闭后,Memcached 服务依然会继续运行,提供缓存服务。

5.3 memcached 启动程序说明

修改memcached 运行参数,可以使用下面的选项修改/etc/sysconfig/memcached文件

memcached 常见选项

-u username memcached运行的用户身份,必须普通用户
-p 绑定的端口,默认11211
-m num 最大内存,单位MB,默认64MB
-c num 最大连接数,缺省1024
-d 守护进程方式运行 后台
-f 增长因子Growth Factor,默认1.25
-v 详细信息,-vv能看到详细信息
-M 使用内存直到耗尽,不许LRU
-U 设置UDP监听端口,0表示禁用UDP

6. 使用 memcached

6.1 memcached 开发库和工具

与memcached通信的不同语言的连接器。libmemcached提供了C库和命令行工具。

示例:

yum install  libmemcached -y 

memping 检测连接服务器

memstat  用于获取 Memcached 服务的统计信息

输出一系列关于 Memcached 当前状态和性能统计的信息,如当前已用内存、缓存命中率、连接数、存储物品数量等

6.2 memcached 操作命令

四种基本 memcached 命令执行最简单的操作。这些命令和操作包括:

  • set    重新设置

  • add  新加一个数据

  • get   调用

  • delete   删除

#前三个命令是用于操作存储在 memcached 中的键值对的标准修改命令,都使用如下所示的语法:
command <key> <flags> <expiration time> <bytes>
<value>#参数说明如下:
command set/add/replace
key     key 用于查找缓存值
flags     可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息
expiration time     在缓存中保存键值对的时间长度(以秒为单位,0 表示永远)
bytes     在缓存中存储的字节数
value     存储的值(始终位于第二行)
#增加key,过期时间为秒,bytes为存储数据的字节数
add key flags exptime bytes  

操作:

显示服务状态

stats
#显示服务状态stats items #显示各个 slab 中 item 的数目和存储时长(最后一次访问距离现在的秒数)。stats slabs #用于显示各个slab的信息,包括chunk的大小、数目、使用情况等

添加数据

add name 1 30 4
zhou
STOREDadd  	添加
name  	键的名字
1    	flages标志  描述信息
30   	超时时间   默认秒  0 代表永久有效
4    	字节数  数据的大小、
zhou 	具体的值

修改

set name 1 60 5
test

调用数据

get name
VALUE name 1 4
zhou
END

删除

get class
VALUE class 1 4
xxxx
END
delete class
DELETED
get class
END

清空

flush_all
OK
get mykey
END
quit

7.memcached 集群部署架构

7.1 基于magent的部署架构

Magent 是google开发的项目,应用端通过负载均衡服务器连接到 magent,然后再由 magent 代理用户应用请求到 memcached 处理,底层的 memcached 为双主结构会自动同步数据,本部署方式存在 magent 单点问题,因此需要两个 magent 做高可用。

7.2 Repcached 实现原理

项目站点:repcached - add data replication feature to memcachedicon-default.png?t=N7T8http://repcached.sourceforge.net/

在 master上可以通过 -X 选项指定 replication port(默认为11212/tcp),在 slave上通过 -x 指定复制的master并连接,事实上,如果同时指定了 -x/-X, repcached先会尝试连接对端的master,但如果连接失败,它就会用 -X参数来自己 listen(成为master);如果 master坏掉, slave侦测到连接断了,它会自动 listen而成为 master;而如果 slave坏掉,master也会侦测到连接断开,它就会重新 listen等待新的 slave加入。

从这方案的技术实现来看,其实它是一个单 master单 slave的方案,但它的 master/slave都是可读写的,而且可以相互同步,所以从功能上看,也可以认为它是双机 master-master方案

7.3 简化后的部署架构

magent 已经有很长时间没有更新,因此可以不再使用 magent,直接通过负载均衡连接到memcached,仍然有两台 memcached 做高可用,repcached 版本的 memcached 之间会自动同步数据,以保持数据一致性,即使其中的一台 memcached 故障也不影响业务正常运行,故障的memcached 修复上线后再自动从另外一台同步数据即可保持数据一致性。

7.4 部署repcached

yum -y install gcc libevent-develtar xf memcached-1.2.8-repcached-2.2.1.tar.gzcd memcached-1.2.8-repcached-2.2.1/./configure --prefix=/apps/repcached --enable-replicationmakevim memcached.c
#解决错误
56 #ifndef IOV_MAX
57 #if defined(__FreeBSD__) || defined(__APPLE__)
58 # define IOV_MAX 1024
59 #endifl
60 #endif#改为如下内容,即删除原有的原第57,59行
56 #ifndef IOV_MAX
57 # define IOV_MAX 1024
58 #endifmake && make install ln -s /apps/repcached/bin/memcached  /usr/bin/useradd -r -s /sbin/nologin memcached#两台一样,所以直接拷贝过去
rsync -a /apps 192.168.44.50:/
## apps注意不要加/  #后台启动
memcached -d -m 1024 -p 11211 -u memcached -c 2048 -x 192.168.44.50
#解释
-d:让 Memcached 在后台以守护进程模式运行。
-m 1024:分配给 Memcached 的最大内存为 1024 MB。
-p 11211:指定 Memcached 监听的 TCP 端口为 11211(默认端口)。
-u memcached:以 memcached 用户身份运行 Memcached。
-c 2048:允许的最大并发连接数为 2048。
-x  192.168.44.50  限制 Memcached 只监听特定的 IP 地址 192.168.44.50

memcached A 配置 7-6

解决报错:

memcached B 配置 7-5

[root@centos7 ~]#useradd -r -s /sbin/nologin memcached
#创建用户[root@centos7 ~]# yum -y install gcc libevent libevent-devel
#安装库否则起不来[root@node2 ~]#ln -s /apps/repcached/bin/memcached  /usr/bin/
# 做软连接
[root@centos7 ~]#memcached -d -m 1024 -p 11211 -u memcached -c 2048 -x 192.168.44.60

7-3 测试

实现了数据同步

加入 haproxy

listen membind 192.168.44.40:11211mode tcpserver m1 192.168.44.50:11211 checkserver m2 192.168.44.60:11211 check

看看真实的有没有

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

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

相关文章

安卓百度地图API显示隐藏Marker

方法 BaiduMap.Marker.setVisible(boolean) 实现 List<Marker> list_marker new ArrayList<>(); boolean isShowMarker true;Override public boolean onCreateOptionsMenu(Menu menu) {String[] sm { "显隐信息", "显隐照片", "截…

【Qt】QListView 显示富文本,设置文本内容颜色

【Qt】QListView 显示富文本 文章目录 I - 控件使用II - 显示富文本III - 注意事项 I - 控件使用 Qt 的 MVC 架构为 MV &#xff0c;Controller 部分继承到了 View 里&#xff0c;View(视图) 设置 Model(模型)&#xff0c;Model 设置数据 这里使用 QStringListModel &#xff0…

一文彻底搞懂OSI七层模型和TCP/IP四层模型

文章目录 1. OSI七层模型2. TCP/IP四层模型 1. OSI七层模型 OSI&#xff08;Open System Interconnect&#xff09;七层模型是一种将计算机网络通信协议划分为七个不同层次的标准化框架。每一层都负责不同的功能&#xff0c;从物理连接到应用程序的处理。这种模型有助于不同的…

CC工具箱使用指南:【BSM编码】

一、简介 一般的数据库要素或表格都有一个【BSM】字段&#xff0c;用来标识唯一值。 【BSM】的计算一般都有同样的规律&#xff0c;前缀中间的填充数字OBJECT码。 即然有通用性&#xff0c;那就做一个小工具吧。 二、工具参数介绍 点击【小工具】组里的【汉字转为Unicode】…

rtsp流实现web端实时播放(海康+大华)

最近的电力项目需要嵌入海康摄像头画面&#xff0c;之前没有做过类似的流媒体播放&#xff0c;所以有些懵&#xff1b; 海康开放平台的webAPI&#xff0c;有插件还是无插件&#xff0c;都不适合自研web系统的嵌入&#xff0c;所以需要自己进行解流&#xff1b; 首先&#xff0c…

02- 使用Docker安装RabbitMQ

使用Docker安装RabbitMQ 下载安装镜像 方式一: 启动docker服务,然后在线拉取 # 在线拉取镜像 docker pull rabbitmq:3-management# 使用docker images查看是否已经成功拉取方式二: 从本地加载 ,将RabbitMQ上传到虚拟机中后使用命令加载镜像即可 docker load -i mq.tar启动M…

Linux编程4.5 网络编程-套接字(Socket)

1、简介 Socket(套接字)是一种通讯机制&#xff0c;它包含一整套的调用接口和数据结构的定义&#xff0c;它给应用进程提供了使用如TCP/UDP等网络协议进行网络通讯的手段。 Linux中的网络编程通过Socket接口实现&#xff0c;Socket既是一种特殊的IO&#xff0c;提供对应的文件…

TEC温度器温度控制器

一 主要特点 1 两路独立的串口&#xff0c;可同时手动和串口指令设定 PID 和温度&#xff1b; 2 一拖二结构&#xff0c;一个调试器控制两个控温模块单元&#xff1b; 3 精准控制温度&#xff0c;用户可自行修正&#xff1b;PT100/PT1000/NTC3435 温度电阻偏差&#xff1b; …

数据结构从入门到精通——堆

堆 前言一、二叉树的顺序结构及实现 (堆&#xff09;1.1二叉树的顺序结构1.2堆的概念及结构 二、堆的练习题答案 三、堆的实现3.1堆向下调整算法3.2堆的创建3.3建堆时间复杂度3.4堆的插入3.5堆的删除3.6堆的代码实现 四、堆的具体实现代码Heap.hHeap.cTest.c堆的初始化堆的销毁…

3、鸿蒙学习-在AGC创建HarmonyOS 项目或应用

项目和应用介绍 关于项目 项目是资源、应用的组织实体。资源包括服务器、数据库、存储&#xff0c;以及您的应用、终端用户的数据等。在您使用部分服务时&#xff0c;您是数据的控制者&#xff0c;数据将按照您设置的数据处理位置来存储在指定区域。 通常&#xff0c;您不需…

如何使用EMC测试软件执行辐射抗扰度测试?(二)测试、校准方法及调制

一、前言 上一篇文章为大家介绍了使用EMC测试软件执行辐射抗扰度测试的测试方法。本章将介绍频率变化模式测试方法、校准方法及调制。 如何使用EMC测试软件执行辐射抗扰度测试&#xff1f;&#xff08;一&#xff09;测试方法 二、频率变化模式测试方法 大多数EMC标准没有描…

R语言自定义颜色

一、创建颜色梯度&#xff08;渐变色&#xff09; 在绘热图时&#xff0c;需要将数值映射到不同的颜色上&#xff0c;这时就需要一系列的颜色梯度colorRampPalette 函数支持自定义的创建一系列的颜色梯度。 代码示例&#xff1a; library(RColorBrewer)x <- colorRampPal…