【Linux】缓存数据库Memcached

news2025/1/13 15:31:21

一、 什么是缓存

缓存是指可以进行高速数据交换的存储器,它先于内存与CPU交换数据,因此速率很快。

从性能分析:

CPU缓存>内存>磁盘>数据库

从性能来看内存是介于CPU和磁盘,在实际中内存是CPU和磁盘的桥梁。buffer和cache是内存的不同的 体现,接下来简单分析对buffer和cache的理解。


1.1 buffer和cache

1.1.1 buffer:

A buffer is something that has yet to be “written” to disk.翻译过来就是:buffer就是写入到磁盘buffer是为了提高内存和硬盘(或其他I/O设备)之间的数据交换的速度而设计的。buffer将数据缓冲下 来,解决速度慢和快的交接问题;速度快的需要通过缓冲区将数据一点一点传给速度慢的区域。例如: 从内存中将数据往硬盘中写入,并不是直接写入,而是缓冲到一定大小之后刷入硬盘中。


1.1.2 cache:

A cache is something that has been “read” from the disk and stored for later use.翻译过来就是: cache就是从磁盘读取数据然后存起来方便以后使用。cache实现数据的重复使用,速度慢的设备需要通 过缓存将经常要用到的数据缓存起来,缓存下来的数据可以提供高速的传输速度给速度快的设备。例 如:将硬盘中的数据读取出来放在内存的缓存区中,这样以后再次访问同一个资源,速度会快很多。


1.1.3 buffer和cache的特点

  • 共性 都属于内存,数据都是临时的,一旦关机数据都会丢失。
  • 差异:(先理解前两点,后两点有兴趣可以了解)
    • A.buffer是要写入数据;cache是已读取数据。
    • B.buffer数据丢失会影响数据完整性,源数据不受影响;cache数据丢失不会影响数据完整性,但会影响 性能。
    • C.一般来说cache越大,性能越好,超过一定程度,导致命中率太低之后才会越大性能越低。buffer来 说,空间越大性能影响不大,够用就行。cache过小,或者没有cache,不影响程序逻辑(高并发cache 过小或者丢失导致系统忙死除外)。buffer过小有时候会影响程序逻辑,如导致网络丢包。
    • D.cache可以做到应用透明,编写应用的可以不用管是否有cache,可以在应用做好之后再上cache。当 然开发者显式使用cache也行。buffer需要编写应用的人设计,是程序的一部分。

1.2 linux系统如何查看内存的缓存

1.2.1 cat /proc/meminfo

查看动态更新的虚拟文件。内容比较全面,可以查看到许多关于内存的信息。

 


1.2.2 free 快速查看内存的方法

也是经常使用的命令。-h 更人性化的显示内存的单位 -m 以M的形式显示


1.2.3 top

top命令提供了实时的运行中的程序的资源使用统计。可以根据内存的使用和大小来进行排序。 

退出top命令直接Ctrl+C

快捷键:shift+m 按内存利用率排序 shift+p 按cpu利用率排序

 


1.2.3 sar

Linux统计/监控工具sar详细介绍:要判断一个系统瓶颈问题,有时需要几个 sar 命令选项结合起来使用:

例如

  • 怀疑CPU存在瓶颈,可用 sar -u 和 sar -q deng 等来查看
  • 怀疑内存存在瓶颈,可用 sar -B、 sar -r 和 sar -W 等来查看
  • 怀疑I/O存在瓶颈,可用 sar -b、sar -u 和 sar -d 等来查看

二、memcached简介

Memcached 是 LiveJournal 旗下 Danga Interactive 公司的布拉德•菲茨帕特里克(BradFitzpatric)开 发的一款内存数据库,现在已被应用于 Facebook、LiveJournal 等公司用于提高 Web 服务质量目前这款软件流行于全球各地,经常被用来建立缓存项目,并以此分担来自传统数据库的并发负载压力。

Memcached 可以轻松应对大量同时出现的数据请求,而且它拥有独特的网络结构,在工作机制方面, 它还可以在内存中单独开辟新的空间,建立 HashTable,并对 HashTable 进行有效的管理。

Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过 在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。

Memcached基于一个存储键/值对的hashmap。其守护进程(daemon )是用C写的,但是客户端可 以用任何语言来编写,并通过memcached协议与守护进程通信。

官方网站地址:https://memcached.org/

官方介绍: memcached is a high-performance, distributed memory object caching system, generic in nature, but originally intended for use in speeding up dynamic web applications by alleviating database load.

memcached是一种高性能、分布式内存对象缓存系统,本质上是通用的,但最初旨在通过减轻数据库 负载来加速动态web应用程序。


2.1 memcache与memcached

我们有时会见到 Memcache 和 Memcached 两种不同的说法,为什么会有两种名称?

其实 Memcache 是这个项目的名称,而 Memcached 是它服务器端的主程序文件名。一个是项目名 称,另一个是主程序文件名。

memcached是一种缓存技术,将数据放入内存,从而通过内存访问提速,因为内存是最快的, memcached的主要目的是提速。

在memcached中维护了一张大的hashtable表,该表在内存中,表的结构是key和value;

memcached的key一般是字符串,不能重复 memcached的value可以放入(字符串,数值,数组,对象,布尔,二进制数据,图片和视频)


2.2主要解决如下问题

由于网站的高并发读写和对海量数据的处理需求,传统的关系型数据库开始出现瓶颈。

对数据库的高并发读写

关系型数据库本身就是个庞然大物,处理过程非常耗时(如解析 SQL 语句、事务处理等)。如果对关系 型数据库进行高并发读写(每秒上万次的访问),数据库系统是无法承受的。

对海量数据的处理

对于大型的 SNS(Social Network Service) 网站(如 Twitter、新浪微博),每天有上千万条的数据产 生。对关系型数据库而言,如果在一个有上亿条数据的数据表中查找某条记录,效率将非常低。 使用 Memcached 就能很好地解决以上问题


2.3 Memcached数据库特点

memcached作为高速运行的分布式缓存服务器,具有以下的特点。

  • 协议简单
    • 使用基于文本行的协议,能直接通过telnet在Memcached服务器上存取数据,实现比较简单
  • 基于libevent的事件处理
    • libevent是基于C开发的程序库,Memcached利用这个库进行异步事件处理
  • 内置内存存储方式
    • Memcached有一套自己的管理内存方式,而且非常高效,所有数据都保存在Memcached内置的内存 中,当存入的数据占满空间时,会使用LRU算法来清除不使用的缓存数据,从而来重用过期数据的内存 空间,但重启服务器数据将丢失
  • memcached不互相通信的分布式
    • 各个Memcached服务器之间互不通信,都是独立存取数据,通过客户端的设计让其具有分存式特点, 支持大量缓存和大规模应用

三、Memcached 安装

yum安装(推荐)

Linux系统安装memcached,首先要先安装依赖库。

yum install gcc gcc-c++ libevent-devel

然后使用如下命令安装(仅限Redhat/Fedora/Centos)

yum install memcached -y

四、Memcached 运行

(1)作为前台程序运行:

从终端输入以下命令,启动memcached:

 memcached -u root -p 11211 -m 64m -vv

这里显示了调试信息。这样就在前台启动了memcached,监听TCP端口11211,最大内存使用量为 64M。调试信息的内容大部分是关于存储的信息。

(2)作为后台服务程序运行:

不指定IP运行:

 memcached -p 11211 -m 64m -d -u root

指定IP和PID存放位置运行:

memcached -d -m 64M -u root -l 192.168.0.200 -p 11211 -c 256 -P /tmp/memcached.pid

五、Memcached 的特征

Memcached 作为高速运行的分布式缓存服务器,具有以下特点。

  • 协议简单
    • Memcached 的服务器客户端通信并不使用复杂的.xml等格式,而是使用简单的基于文本行的协议。
  • Memcached 连接
    • 因此,通过 telnet 也能在 Memcached 上保存数据、取得数据。以下为示例代码:

         

telnet localhost 11211
Connected to localhost.localdomain(127.0.0.1).
Escape character is '^]'.
set foo 0 0 3 (保存命令)
bar (数据)
STORED (结果)
get foo (取得命令)
VALUE foo 0 3 (数据)
bar (数据)

六、Memcached之应用实例配置

1、应用实例配置

1)基础环境配置,三台服务器最好都做

①关闭防火墙:

systemctl stop firewalld

systemctl disable firewalld

sed -i 's/enforcing/disabled/' /etc/selinux/config

setenforce 0

②同步时间:

yum -y install ntp ntpdate

ntpdate cn.pool.ntp.org

hwclock --systohc

③环境规划:

IP地址环境
192.168.198.142memcache
192.168.198.147web
192.168.198.148mysql

2)web服务器配置

在web服务器192.168.198.147 上安装软件,启动服务

卸载系统默认的mysql版本

rpm -e mariadb-libs postfix

安装数据库软件,如果是克隆过来的因为已经安装过了则不需要安装;

过程略,如果没有安装参考之前的mysql博客进行安装;

安装lnmp环境

yum install httpd php php-gb php-mysql php-memcache

启动apache服务

systemctl restart httpd

sysstemctl enable httpd


3)mysql数据库服务器配置

在mysql服务端创建用户(192.168.198.148)


mysql8.0中默认的身份认证插件是caching_sha2_password,替代了之前的
mysql_navtive_password,并且设置用户的host范围为%,使所有主机都可以连接

create user 'memcache'@'%' identified by 'Nebula@123';

ALTER USER'memcache'@'%' IDENTIFIED WITH mysql_native_password BY 'Nebula@123';

flush privileges;

 检查mysql用户表中有刚才创建的用户信息

select user,host,plugin from mysql.user;


4) web服务器测试

(web服务器上)测试http功能,如下图则正常

 vim /var/www/html/index.html


测试PHP测试功能

vim /var/www/html/index.php  
<?php
phpinfo();
?>


5) 在web服务器上测试mysql服务器是否连接成功

 在web服务器(192.168.198.147)上编写下面的文件:

vim /var/www/html/mysql.php
<?php
$link=mysql_connect('192.168.198.148','memcache','Nebula@123');

if($link) echo "Success!!";
else echo "Fail!!";
mysql_close();
?>

 写完之后保存退出;

然后浏览器上连接你的web服务器IP;显示Success!!成功连接mysql服务器。


 6)memcache 服务配置及测试

安装启动略(未安装参考之前的安装方法) 测试略,只要保证服务正常启动并能正常访问就可


7)实例功能测试 


①测试web和memcache的连通性

如果你是使用后台开启的memcache服务,就不用杀死


②Web服务器(192.168.42.30)做代码测试

这里的IP地址为memcached端,和他的端口号 

<?php
$memcache = new Memcache;
$memcache->connect('192.168.198.142', 11211) or die ("Could not connect");
$version = $memcache->getVersion();
echo "Server's version: ".$version."
";
$tmp_object = new stdClass;
$tmp_object->str_attr = 'test';
$tmp_object->int_attr = 123;
$memcache->set('key', $tmp_object, false, 10) or die ("Failed to save data at the server");
echo "Store data in the cache (data will expire in 10 seconds)
";
$get_result = $memcache->get('key');
echo "Data from the cache:
";
var_dump($get_result);
?>


③ 在web服务器下配置session(web端192.168.198.147): 

 vim /etc/php.ini
session.save_handler = memcache
session.save_path ="tcp://192.168.42.29:11211?
persistent=1&weight=1&timeout=1&retry_interval=15"


④ 测试memcached的可用性:

 vim /var/www/html/memcache1.php
<?php
session_start();
if (!isset($_SESSION['session_time']))
{
 $_SESSION['session_time'] = time();
}
echo "session_time:".$_SESSION['session_time']."
";
echo "now_time:".time()."
";
echo "session_id:".session_id()."
";
?>


 ⑤ 在mysql服务器(192.168.198.148)上创建测试数据库:

create database testab1;


use testab1;

create table test1(id int not null auto_increment,name varchar(20) default null,primary key(id))
engine=innodb auto_increment=1 default charset=utf8;

insert into test1(name) values ('tom1'),('tom2'),('tom3'),('tom4'),('tom5');


 对memcache用户赋予库testab1的查看权限

grant select on testab1.* to memcache@'%';

show grants for memcache@'%';


⑦ 在web服务器上创建下面的文件:

vim /var/www/html/memcache2.php

$key=md5($query);
if(!$memcache->get($key))
{
 $conn=mysql_connect("192.168.198.148","memcache","Nebula@123"); //数据库节点,地址,用户,密码
 mysql_select_db(testab1);
 $result=mysql_query($query);
 while ($row=mysql_fetch_assoc($result))
 {
 $arr[]=$row;
 }
 $f = 'mysql';
 $memcache->add($key,serialize($arr),0,30);
 $data = $arr ;
}
else{
 $f = 'memcache';
 $data_mem=$memcache->get($key);
 $data = unserialize($data_mem);
}
echo $f;
echo "";
echo "$key";
echo "";
//print_r($data);
foreach($data as $a)
{
echo "number is $a[id]";
echo "";
echo "name is $a[name]";
echo "";
}
?>

注意:memcached有个缓存时间默认是1分钟,过了一分钟后,memcached需要重新从数据库中取得数据 

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

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

相关文章

【Linux】进程优先级PRI NI/并行与并发的概念

文章目录 基本概念为什么会有优先级&#xff1f;如何查看进程优先级&#xff1f;PRI and NI如何更改进程优先级&#xff1f;优先级vs权限并行与并发的概念 基本概念 CPU资源分配的先后顺序&#xff0c;就是指进程的优先权&#xff08;priority&#xff09;。优先权高的进程有优…

C# 使用PdfiumViewer实现对PDF文档打印预览(二)

文章目录 前言关于PdfiumViewer配置PdfiumViewer环境PdfiumViewer 打开并预览本地的PDF文档PdfiumViewer 预览PDF文件流小节附录 前言 想要对PDF文档进行预览和打印&#xff0c;实际上这个文档可以是存在的&#xff0c;也可以是一个PDF文件流&#xff08;本地并没有PDF文件&am…

家用洗地机哪个好用?家用洗地机分享

洗地机是一种代表现代化清洁的设备&#xff0c;它具有高效、环保、经济、智能等多种特点。洗地机可以为您提供先进的清洁技术和设备&#xff0c;为您的清洁工作提供有力的支持。洗地机可以适应不同场所和建筑物的需求&#xff0c;提高工作效率和卫生形象。因此&#xff0c;选择…

Dockerfile构建镜像读取环境变量问题

起初使用如下Dockerfile构建Java镜像&#xff1a; FROM 10.170.33.245/base/openjdk:11.0.6-jdk-slim-busterMAINTAINER luo.hq <luo.hqneusoft.com>ENV TZ "Asia/Shanghai" ENV TERM xterm ENV LC_ALL C.UTF-8 ENV LANG C.UTF-8 ENV JVM_OPTIONS ""…

CSS 径向渐变

background: radial-gradient([ <ending-shape> || <size> ]? [ at <position> ]? , <color-stop-list> ); 属性解析&#xff1a; ending-shape &#xff1a;渐变结束的形状 默认为椭圆ellipse&#xff0c;可以设置为圆形circle size&#xff1a;渐…

R语言 | 认识apply家族

目录 一、apply()函数 二、sapply()函数 三、lapply()函数 四、tapply()函数 ​五、iris鸢尾花数据集 R语言提供了一个循环系统称apply家族&#xff0c;它具有类似for循环的功能&#xff0c;但是若想处理相同问题&#xff0c;apply家族函数好用太多了。 一、apply()函数 …

隐藏加密文件夹怎么找到?看这里就够了!

当隐藏遇到加密&#xff0c;可以很好地保护电脑文件夹数据安全&#xff0c;那么隐藏加密的文件夹该怎么找到呢&#xff1f;方法其实很简单&#xff0c;下面我们通过两款提供文件夹隐藏加密的软件来了解一下。 文件夹加密超级大师 作为一款能够提供5种文件夹加密类型的软件&…

Java线程池七个参数详解:核心线程数、最大线程数、空闲线程存活时间、时间单位、工作队列、线程工厂、拒绝策略

ThreadPoolExecutor是JDK中的线程池实现&#xff0c;这个类实现了一个线程池需要的各个方法&#xff0c;它提供了任务提交、线程管理、监控等方法。 下面是ThreadPoolExecutor类的构造方法源码&#xff0c;其他创建线程池的方法最终都会导向这个构造方法&#xff0c;共有7个参…

什么是网络——TCP/IP协议

个人简介&#xff1a;云计算网络运维专业人员&#xff0c;了解运维知识&#xff0c;掌握TCP/IP协议&#xff0c;每天分享网络运维知识与技能。座右铭&#xff1a;海不辞水&#xff0c;故能成其大&#xff1b;山不辞石&#xff0c;故能成其高。个人主页&#xff1a;小李会科技的…

聚观早报 | 科大讯飞称10月整体赶超ChatGPT;苹果遭欧盟警告

今日要闻&#xff1a;科大讯飞称10月整体赶超ChatGPT&#xff1b;苹果遭欧盟警告&#xff1b;科研人员研发纳米粒子治疗癌症&#xff1b;中小学教材不得夹带商业广告&#xff1b;Z-Library又被美国FBI查封了 科大讯飞称10月整体赶超ChatGPT 5 月 6 日&#xff0c;科大讯飞董事…

JS判断用户终端与CSS判断用户终端的写法(源代码实例)

当用户使用手机等移动终端访问网站时&#xff0c;我们可以通过程序检测用户终端类型&#xff0c;如果是手机用户&#xff0c;则引导用户访问适配手机屏幕的移动站点。 JS判断用户终端&#xff1a; // 判断浏览器类型 myBrowser() {var userAgent navigator.userAgent; //取得…

Python每日一练(20230508) 石子游戏 I\II\III

目录 1. 石子游戏 Stone Game I 2. 石子游戏 Stone Game II 3. 石子游戏 Stone Game III &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 石子游戏 Stone Game I Alice 和 Bob 用几堆…

数字化转型对企业的好处有哪些(下)

过时的技术、流程和客户关系管理困难是当前阻碍企业增长的主要障碍&#xff0c;CRM系统是企业数字化转型的主要工具&#xff0c;帮助企业简化操作、提高效率&#xff0c;为客户提供更加卓越的客户体验。下面说说&#xff0c;企业数字化转型的十大好处。 5、提升竞争力 数字技…

HQChart实战教程61-自定义十字星K线颜色

HQChart实战教程61-自定义平盘K线颜色 十字星步骤1. 注册事件2. 监听回调函数阐述说明HQChart插件源码地址完整的demo源码十字星 十字星是一种K线基本型态。十字星,是一种只有上下影线,没有实体的K线图。开盘价即是收盘价,表示在交易中,股价出现高于或低于开盘价成交,但收…

asp.net+sqlserver社区居民健康档案管理系统

社区居民健康档案管理系统1 摘 要1 1 课题背景及研究内容1 1.1 课题背景和意义1 1.2 研究现状1 1.3 论文结构安排1 2 系统开发环境3 2.1开发工具介绍3 2.1.1 Visual Studio介绍3 2.1.2 SQL Server介绍4 2.1.3 IIS介绍4 2.2 动态网站技术介绍4 2.3开发模式B/S介绍4 2.4 AS…

【云台】开源版本SimpleBGC的传感器校准与姿态融合

传感器校准 俄版云台使用的是 MPU6050&#xff0c;磁力计使用的是 HMC5883 MPU6050校准 MPU6050校准包含两部分&#xff1a;加速度计与陀螺仪。校准过程想要校准出的数据也就是加速度计与陀螺仪的温漂与零漂。 正常来说&#xff0c;如果将 IMU 朝上静置&#xff0c;加速度计…

SSM框架学习-Spring Framework系统架构

Spring是一个用来管理对象的技术&#xff1b; 上层需要依赖下层的支持&#xff1b; 面向切面编程&#xff1a;在不影响原始程序的基础上&#xff0c;增强功能&#xff1b; 提供数据访问与集成&#xff1a;说明兼容其它方式访问数据&#xff1b; Transactions&#xff1a;事务控…

第四十章 Unity 按钮 (Button) UI

本章节我们介绍一下按钮UI。首先&#xff0c;我们创建一个新的场景“SampleScene3.unity”。然后&#xff0c;在菜单栏中点击“GameObject”->“UI”->“Button”&#xff0c;截图如下 我们选中刚刚创建的Button&#xff0c;然后查看它的Inspector检视面板&#xff0c;如…

SonarQube Api调用指南

好几年前写过一篇sonar api调用的文档&#xff0c;很多人看&#xff0c;但是当时写的比较简陋&#xff0c;很多小伙伴在下方留言&#xff0c;也答应过一些小伙伴些一篇示例&#xff0c;本文主要目的是一篇扫盲贴。 一、接口文档 要使用sonarqube的api接口&#xff0c;你首先要…

递归递推练习题答案

1.用递归的方法123…N的值&#xff08;in:5,out:15&#xff09; def dg(n):if n1:return 1else:return dg(n-1)n nint(input()) print(dg(n))2.输出斐波那契数列的第N项&#xff0c;0&#xff0c;1&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;5&#xff0c;8&#xf…