Memcached非关系型数据库介绍

使用背景

Memcached 不是一个数据库,而是一个高性能的分布式内存对象缓存系统。它主要用于减轻数据库负载,提高动态Web应用的速度、可扩展性和性能。Memcached 的工作原理是将数据存储在内存中,以提供快速的数据访问。当应用程序需要访问数据时,它首先检查内存中是否有这个数据。如果内存中有这个数据,应用程序就可以直接从内存中获取数据,而不需要访问数据库。这样可以大大提高数据访问的速度。

目录

一、Memcached 介绍

1. NoSQL介绍

2. Memcached

3. Memcached 和 Redis 比较

4. Memcached 工作机制

二、 Memcached 部署

1. Yum 安装

2. 编译安装

3. Memcached 启动程序说明

三、 Memcached 使用

1. Memcached 开发库和工具

2. Memcached 操作命令

四、Memcached 集群部署架构

1. 部署repcached

2. 数据同步

3. 实现代理


一、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存储数据时,Memcached会去申请1MB的内存,把该块内存称为一个slab,也称为一个page

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

Memcached 官网:memcached - a distributed memory object caching system

3. Memcached 和 Redis 比较

相似之处:

① 内存存储:Memcached 和 Redis 都是将数据存储在内存中,以提供快速的数据访问。

② 键值存储:Memcached 和 Redis 都是使用键值对的方式来存储数据。

③ 分布式:Memcached 和 Redis 都支持分布式存储,可以在多台服务器上运行。

不同之处:

比较类别Redismemcached
数据类型支持更多的数据类型,包括字符串、列表、集合、有序集合、哈希表等只支持字符串
持久化支持支持数据持久化,可以将数据保存到磁盘上 不支持数据持久化,如果服务器重启,所有的数据都会丢失
高可用支持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,数据量非常大,并发量非常大的业务
社区支持Redis 的社区支持更好,有更多的插件和工具可以使用支持较少

4. Memcached 工作机制

① 数据存储:Memcached 将数据存储在内存中,以提供快速的数据访问。当应用程序需要访问数据时,它首先检查内存中是否有这个数据。如果内存中有这个数据,应用程序就可以直接从内存中获取数据,而不需要访问数据库。

② 数据分片:Memcached 将数据分片存储在多台服务器上。这样可以提高系统的可扩展性和性能。例如,如果你有 10 GB 的数据,你可以将这 10 GB 的数据分片存储在 10 台服务器上,每台服务器存储 1 GB 的数据。

③ 数据访问:当应用程序需要访问数据时,它首先计算数据的键,然后根据这个键选择一个服务器。然后,应用程序就可以直接从这个服务器获取数据。

④ 数据更新:当应用程序更新数据时,它首先计算数据的键,然后根据这个键选择一个服务器。然后,应用程序就可以直接在这个服务器上更新数据。

⑤ 数据失效:Memcached 有一个失效机制,当数据过期时,Memcached 会自动删除这个数据。这样可以避免内存被无用的数据占满。

虽然 Memcached 可以提供快速的数据访问,但它也有一些限制。例如,由于数据存储在内存中,所以 Memcached 的存储空间是有限的。另外,由于 Memcached 是一个分布式系统,所以它可能会受到网络延迟的影响。

二、 Memcached 部署

1. Yum 安装

① 直接命令安装

[root@localhost ~]# yum install -y memcached
[root@localhost ~]# systemctl start memcached.service 
[root@localhost ~]# ss -natp | grep memcached
LISTEN     0      128          *:11211                    *:*                   users:(("memcached",pid=6451,fd=26))
LISTEN     0      128         :::11211                   :::*                   users:(("memcached",pid=6451,fd=27))

② 查看配置文件

[root@localhost ~]# vim /etc/sysconfig/memcached
PORT="11211"     #监听端口
USER="memcached" #启动用户
MAXCONN="1024"  #最大连接数
CACHESIZE="64"  #最大使用内存
OPTIONS="" #其他选项

2. 编译安装

① 安装编译工具,下载安装

[root@localhost opt]# yum -y install gcc libevent-devel
[root@localhost opt]# wget http://memcached.org/files/memcached-1.6.6.tar.gz
[root@localhost opt]# tar xvf memcached-1.6.6.tar.gz
[root@localhost opt]# cd memcached-1.6.6/
[root@localhost memcached-1.6.6]# ./configure --prefix=/apps/memcached
[root@localhost memcached-1.6.6]# make -j 2 && make install
[root@localhost memcached-1.6.6]# echo 'PATH=/apps/memcached/bin:$PATH' > /etc/profile.d/memcached.sh
[root@localhost memcached-1.6.6]# . /etc/profile.d/memcached.sh

② 新建用户

[root@localhost ~]# useradd -r -s /sbin/nologin memcached

③ 编辑配置文件

[root@localhost ~]# cat > /etc/sysconfig/memcached  << eof
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS=""
eof

④ 准备service文件

[root@localhost ~]# 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@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl enable --now memcached.service

⑥ 调整哈希表大小的参数

默认前台执行
[root@localhost ~]# memcached -u memcached -m 1024 -c 65536 -f 2 -vv
#从这个命令会以默认的前台模式启动 Memcached 服务
# -u memcached 参数表示以 memcached 用户的身份运行 Memcached 服务
# -m 1024 参数表示分配 1024 MB 的内存给 Memcached 服务
# -c 65536 参数表示允许 65536 个并发连接
# -f 2 参数表示增长因子为 2
# -vv 参数表示输出详细的日志信息。

以台方式执行
[root@localhost ~]# memcached -u memcached -m 1024 -c 65536 -d
# 这个命令会以台方式启动 Memcached 服务
# -d 参数表示以台方式运行 Memcached 服务,这意味着 Memcached 服务会在后台运行,而不会占用当前的终端。其他的参数的含义和默认前台执行的命令相同。

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

三、 Memcached 使用

1. Memcached 开发库和工具

① 安装工具包

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

② 检测连接服务器

[root@localhost ~]# memping --servers 192.168.190.104
[root@localhost ~]# echo $?
0                            # 检测在线

③ 获取 Memcached 服务的基本信息

[root@localhost ~]# memstat --servers=192.168.190.104
Server: 192.168.190.104 (11211)
	 pid: 3652
	 uptime: 856
……

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            # 存储的值(始终位于第二行)
add key flags exptime bytes  #增加key,过期时间为秒,bytes为存储数据的字节数

示例:显示服务状态

[root@localhost ~]# telnet 192.168.190.104 11211
Trying 192.168.190.104...
Connected to 192.168.190.104.
Escape character is '^]'.
stats          # 显示服务状态
stats items    # 显示各个 slab 中 item 的数目和存储时长(最后一次访问距离现在的秒数)。
stats slabs    # 用于显示各个slab的信息,包括chunk的大小、数目、使用情况等

示例:添加数据

[root@localhost ~]# telnet 192.168.190.104 11211
Trying 192.168.190.104...
Connected to 192.168.190.104.
Escape character is '^]'.
add num 1 10 4           # 1:说明信息,10:超时时间,4:字节数
6666
STORED
get num                  # 调用数据
VALUE num 1 4
6666
END
get num                  # 10秒后丢失
END

示例:修改

set num 2 5 6
666666
STORED

示例:删除

set num 1 0 2
66
STORED
get num
VALUE num 1 2
66
END
delete num
DELETED
get num
END

示例:清空

set num 1 0 2  
66
STORED
get num
VALUE num 1 2
66
END
flush_all
OK
get num
END

四、Memcached 集群部署架构

Magent是google开发的项目,应用端通过负载均衡服务器连接到magent,然后再由magent代理用户应用请求到memcached处理,底层的memcached为双主结构会自动同步数据。通过负载均衡连接到memcached,有两台memcached做高可用,repcached版本的memcached之间会自动同步数据,以保持数据一致性,即使其中的一台memcached故障也不影响业务正常运行,故障的memcached修复上线后再自动从另外一台同步数据即可保持数据一致性。

1. 部署repcached

① 下载安装包编译安装

[root@localhost opt]# yum -y install gcc libevent libevent-devel
[root@localhost opt]# wget  https://jaist.dl.sourceforge.net/project/repcached/repcached/2.2.1-1.2.8/memcached-1.2.8-repcached-2.2.1.tar.gz
[root@localhost opt]# tar xf memcached-1.2.8-repcached-2.2.1.tar.gz
[root@localhost opt]# cd memcached-1.2.8-repcached-2.2.1
[root@localhost memcached-1.2.8-repcached-2.2.1]# ./configure --prefix=/apps/repcached --enable-replication
[root@localhost memcached-1.2.8-repcached-2.2.1]# vim memcached.c
#改为如下内容,即删除原有的原第57,59行
56 #ifndef IOV_MAX
57 # define IOV_MAX 1024
58 #endif
[root@localhost memcached-1.2.8-repcached-2.2.1]# make -j 2 && make install

② 制作软链接,启动服务

[root@localhost ~]# ln -s /apps/repcached/bin/memcached  /usr/bin/
[root@localhost ~]# memcached -d -m 1024 -p 11211 -u memcached -c 2048 -x 192.168.190.103
[root@localhost ~]# ss -ntl | grep 11211
LISTEN     0      128          *:11211                    *:*                  
LISTEN     0      128         :::11211                   :::*      

③ 在 server1 上将整个目录拷贝到 server2 上

192.168.190.104:
[root@localhost ~]# rsync -a /apps   192.168.190.103:/

192.168.190.103:
[root@localhost ~]# useradd -r -s /sbin/nologin memcached
[root@localhost ~]# yum -y install gcc libevent libevent-devel
[root@localhost ~]# ln -s /apps/repcached/bin/memcached  /usr/bin/
[root@localhost ~]# memcached -d -m 1024 -p 11211 -u memcached -c 2048 -x 192.168.190.104
[root@localhost ~]# ss -ntl | grep 11211
LISTEN     0      128          *:11211                    *:*                  
LISTEN     0      128         :::11211                   :::* 

2. 数据同步

[root@localhost ~]# telnet 192.168.190.103 11211
Trying 192.168.190.103...
Connected to 192.168.190.103.
Escape character is '^]'.
add name 1 0 2
zs
STORED
quit
Connection closed by foreign host.
[root@localhost ~]# telnet 192.168.190.104 11211
Trying 192.168.190.104...
Connected to 192.168.190.104.
Escape character is '^]'.
get name
VALUE name 1 2
zs                               # 数据与103一致
END

3. 实现代理

① 配置haproxy代理

[root@localhost ~]# yum install -y haproxy.x86_64
[root@localhost ~]# vim /etc/haproxy/haproxy.cfg
listen mem
    bind 192.168.190.100:11211
    mode tcp
    server m1 192.168.190.103:11211 check
    server m1 192.168.190.104:11211 check
[root@localhost ~]# systemctl restart haproxy.service
[root@localhost ~]# ss -natp | grep 11211
LISTEN     0      128    192.168.190.100:11211                    *:*                   users:(("haproxy",pid=2063,fd=7))

② 访问代理地址

[root@localhost ~]# telnet 192.168.190.100 11211
Trying 192.168.190.100...
Connected to 192.168.190.100.
Escape character is '^]'.
get name
VALUE name 1 2
zs                  # 实现调度获取数据
END

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

夸克、迅雷网盘项目拉新推广去哪对接?推荐几个一手项目渠道!

在进行夸克、迅雷网盘等项目的拉新推广时&#xff0c;对接合适的渠道和平台是至关重要的。本文将分享几个地推、网推一手渠道&#xff0c;帮助您轻松开展拉新推广项目。 1.任推邦 国内知名项目拉新平台&#xff0c;这个平台对接的项目大多是官方直签&#xff0c;截至目前已经…

Facebook账号防封的有效方法附解禁方法

Facebook作为跨境主要业务平台&#xff0c;一直以来封号率都非常高。相信点进来的各位或多或少地遇见了个人号被封&#xff0c;广告账户被禁&#xff0c;FB主页被封等情况。针对此类问题&#xff0c;今天就小编也来分享自己的Facebook防封经验。 一、Facebook被封原因 主要有以…

【电能管理】安科瑞AEM碳排放功能表/电碳表/碳结算/三相嵌入式电表/尖峰平谷峰谷分时/最大需量/二部制电价/节能降碳/CE认证

什么是电碳表!!! 电碳表是一种计量设备&#xff0c;可以帮助用户了解和控制电力使用中的碳排放。原理是根据实际电力系统的计量数据&#xff0c;动态计算并更新电碳因子&#xff08;平均每度电所蕴含的碳排放量&#xff09;&#xff0c;并且这个数据是实时更新的&#xff0c;真…

【云效测试管理】测试用例、测试计划(用例执行)、缺陷管理、测试报告全流程管理

背景 我们公司之前使用过很多测试管理软件&#xff0c;从最开始原始的Excel来管理缺陷&#xff0c;再到Worktitle管理缺陷&#xff0c;再到现在的云效&#xff1b;用例管理管理在本地。 再后来我们转用云效流水线来部署测试环境&#xff0c;开始尝试发掘云效中的“测试管理”…

泛型可空类型Nullable<T>

.Net Framework 4.8版本开始&#xff0c;引入了可空类型Nullable<T>. 对于引用类型的变量来说&#xff0c;如果未赋值&#xff0c;默认情况下是 Null 值&#xff0c; 对于值类型的变量&#xff0c;如果未赋值&#xff0c;整型变量的默认值为 0,Boolean默认为false&…

项目2-用户登录

1.创建项目 2.引入前端代码并检查是否有误 3.定义接口 需求分析 对于后端开发⼈员⽽⾔, 不涉及前端⻚⾯的展⽰, 只需要提供两个功能 1. 登录⻚⾯: 通过账号和密码, 校验输⼊的账号密码是否正确, 并告知前端 2. ⾸⻚: 告知前端当前登录⽤⼾. 如果当前已有⽤⼾登录, 返回登录的账…

【算法与数据结构】总结

目录 引言 一、线性数据结构 1. 1 数组&#xff08;Array&#xff09; 1.2 链表&#xff08;Linked List&#xff09; 1.3 栈&#xff08;Stack&#xff09; 1.4 队列&#xff08;Queue&#xff09; 二、图形数据结构 2.1 深度优先搜索&#xff08;DFS&#xff09;&…

机器学习之线性回归与逻辑回归【完整房价预测和鸢尾花分类代码解释】

目录 前言 一、什么是线性回归 二、什么是逻辑回归 三、基于Python 和 Scikit-learn 库实现线性回归 示例代码&#xff1a; 使用线性回归来预测房价: 四、基于Python 和 Scikit-learn 库实现逻辑回归 五、总结 线性回归的优缺点总结&#xff1a; 逻辑回归&#xff08;Logistic…

数字孪生技术在健康医疗的应用

数字孪生技术在健康医疗领域的应用前景广阔&#xff0c;它通过创建物理实体或工作过程的虚拟版本&#xff0c;为医疗健康领域带来了革命性的变化。以下是数字孪生在医疗健康领域的一些关键应用&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件…

[深度学习]yolov8+pyqt5搭建精美界面GUI设计源码实现一

【简单介绍】 基于YOLOv8与PyQt5的精美界面GUI设计&#xff0c;旨在为用户提供一个直观、易用且功能强大的目标检测平台。通过结合YOLOv8的先进目标检测能力与PyQt5的丰富界面设计元素&#xff0c;我们打造了一款高效、稳定的软件产品。 在界面设计上&#xff0c;我们注重用户…

R语言在气象、水文中数据处理及结果分析、绘图实践技术应用

R 语言是一门由统计学家开发的用于统计计算和作图的语言&#xff08;a Statistic Language developed for Statistic by Statistician&#xff09;&#xff0c;由 S 语言发展而来&#xff0c;以统计分析功能见长。R 软件是一款集成 了数据操作、统计和可视化功能的优秀的开源软…

Java中的代理模式(动态代理和静态代理)

代理模式 我们先了解一下代理模式&#xff1a; 在开发中&#xff0c;当我们要访问目标类时&#xff0c;不是直接访问目标类&#xff0c;而是访问器代理类。通过代理类调用目标类完成操作。简单来说就是&#xff1a;把直接访问变为间接访问。 这样做的最大好处就是&#xff1a…

C++第十一弹---类与对象(八)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 目录 1、友元 1.1、友元函数 1.2、友元类 2、内部类 3、匿名对象 4、拷贝对象时的一些编译器优化 总结 1、友元 友元提供了一种突破封装的方式&a…

最新Java面试题5【2024初级】

互联网大厂面试题 1&#xff1a;阿里巴巴Java面试题 2&#xff1a;阿里云Java面试题-实习生岗 3&#xff1a;腾讯Java面试题-高级 4&#xff1a;字节跳动Java面试题 5&#xff1a;字节跳动Java面试题-大数据方向 6&#xff1a;百度Java面试题 7&#xff1a;蚂蚁金服Java…

由浅到深认识Java语言(26):阶段性练习

该文章Github地址&#xff1a;https://github.com/AntonyCheng/java-notes 在此介绍一下作者开源的SpringBoot项目初始化模板&#xff08;Github仓库地址&#xff1a;https://github.com/AntonyCheng/spring-boot-init-template & CSDN文章地址&#xff1a;https://blog.c…

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之六 简单图像倾斜校正处理效果

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之六 简单图像倾斜校正处理效果 目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之六 简单图像倾斜校正处理效果 一、简单介绍 二、简单图像倾斜校正处理效果实现原理 三、简单图像倾斜校正…

数据结构——认识二叉树

这是一篇回顾二叉树概念的文章 前言&#xff1a;一、了解树形结构1.2 树的定义2.2 树的相关概念2.2 树的表示形式 二、了解二叉树结构和性质2.1 什么是二叉树&#xff1f;2.2 二叉树的性质2.3 二叉树的遍历2.3 二叉树的应用范围2.5 二叉树的优缺点 三、掌握二叉树的存储结构3.1…

NX二次开发常用函数:UF_MODL_ask_feat_......(二)

最近学习NX二次开发发现有一些函数经常使用&#xff0c;俗话说得好&#xff0c;好记性不如烂笔头&#xff0c;现在做一下笔记&#xff0c;帮助理解。 UF_MODL_ask_feat_......在头文件uf_modl.h中 1、UF_MODL_ask_feat_direction &#xff08;查询特征的方向&#xff09; 概…

Java基于微信小程序的校园订餐小程序的实现,附源码和数据库

博主介绍&#xff1a;✌Java徐师兄、7年大厂程序员经历。全网粉丝13w、csdn博客专家、掘金/华为云等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb; 不…

TypeScript类型缩小

类型缩小的概念 前面我们写了一些这样的代码&#xff1a; function padLeft(padding: number | string, input: string): string {if (typeof padding number) {return .repeat(padding) input}return padding input }没有if判断时&#xff0c;无法执行语句return ’ .re…