Memcached内存缓存技术
Memcached是什么,有什么作用?
Memcached服务在企业集群架构中应用场景
1.作为数据库的前端缓存应用
完整缓存(易):例如商品分类,以及商品信息,可实现放到内存里,然后再对外提供数据访问。这个被称之为预热。用户访问时可以只读取memcached缓存,不读取数据库了。
热点缓存(难):需要前端程序配合。只缓存热点的数据,即缓存经常被访问的数据。先预热基础数据,然后再动态更新。程序先读取缓存,如果缓存里没有对应的数据,程序再去读取数据库,然后程序把读到的数据放入缓存。
2.作为集群的session会话共享存储
Memcached服务在不同企业业务应用场景中的工作流程
1.当web程序需要访问后端数据库获取数据时会优先访问Memcached内存缓存,如果缓存中有数据就直接获取返回前端服务及用户,如果没有数据(未命中),再由程序请求后端的数据库服务器,获取到对应的数据后,除了返回给前端服务及用户数据外,还会把数据放到Memcached内存中进行缓存,等待下次被访问。Memcahced内存始终是数据库的挡箭牌,从而大大的减轻数据库的访问压力,提高整个网站架构的响应速度,提升了用户体验。
2.当程序更新,修改或删除数据库中已有的数据时,会同时发送请求通知Memcached已经缓存过的同一个ID内容的旧数据失效,从而保证Memcahce中的数据和数据库中的数据保持一致。如果是在高并发场合,除了通知Memcached过期的缓存失效外,还会通过相关机制,使得在用户访问新数据前,通过程序预先把更新过的数据推送到memcached中缓存起来,这样可以减少数据库的访问压力,提升memcached中缓存的命中率。
3.数据库插件可以在写入更新数据库后,自动抛给MC缓存起来,自身不Cache
Memcached服务分布式集群如何实现?
1.程序端实现

Memcached服务特点及工作原理是什么?
Memcached内存管理机制原理

Memcached服务器端中保存着slab class中空闲chunk个数的列表,根据该列表选择chunk,然后将数据缓存于其中。当有数据存入时,Memcached根据接收到的数据大小,分配一个能存下这个数据的最小内存块chunk。但是缺点在于由于分配的chunk大小是固定的,所以会有部分空间被浪费。
避免浪费的办法是,预先计算出应用存入的数据大小或把同一业务类型的数据存入一个Memcached服务器中,确保存入的数据大小相对均匀。同时使用-f<factor> chunk size growth factor增长因子来划分chunk大小,进行调优。各组之间chunk的大小按照factor对应倍数递增,factor的默认值是1.25。
同时slab allocator还有重复使用已分配的chunk的作用。也就是说,分配到的chunk不会释放,而是重复利用,用新数据替换旧数据。
Memcached的删除原理与删除机制
Memcached主要的删除机制是LRU(最近最少用)算法,加上item过期失效。当您存数据到memcached中,可以指定该数据在缓存中可以呆多久。如果memcached内存不够用,过期的数据会优先被替换,接着轮到最老的未被使用的数据。在某些情况下(完整缓存),如果不想用LRU算法,可以通过-M参数启动Memcached,这样memcached内存耗尽也不会删除,宁愿报错也不删除。
Memcached服务端与客户端的安装部署与使用测试
- #安装memcached前需要安装libevent
- yum install libevent-devel nc -y
- #源码安装memcahced
- cd /server/tools
- wget http://memcached.org/files/memcached-1.4.24.tar.gz
- tar xf memcached-1.4.24.tar.gz
- cd memcached-1.4.24
- ./configure --prefix=/application/memcached-1.4.24
- make
- make install
- ln -s /application/memcached-1.4.24/ /application/memcached
- #启动一个Mem实例
- /application/memcached/bin/memcached -m 16m -p 11211 -d -u root -c 8192 # 分配的内存 端口 后台 用户 最大并发连接数
- lsof -i :11211
- ps -ef | grep memcached | grep -v grep
- root 2984 1 0 23:10 ? 00:00:00 /application/memcached/bin/memcached -m 16m -p 11211 -d -u root -c 8192
- #可以启动多个Mem实例
- /application/memcached/bin/memcached -m 16m -p 11212 -d -u root -c 8192
- ps -ef | grep memcached | grep -v grep
- root 2984 1 0 23:10 ? 00:00:00 /application/memcached/bin/memcached -m 16m -p 11211 -d -u root -c 8192
- root 3036 1 0 23:16 ? 00:00:00 /application/memcached/bin/memcached -m 16m -p 11212 -d -u root -c 8192
- #加入开机启动
- echo "/application/memcached/bin/memcached -m 16m -p 11211 -d -u root -c 8192" >> /etc/rc.local
- echo "/application/memcached/bin/memcached -m 16m -p 11212 -d -u root -c 8192" >> /etc/rc.local
- #测试服务端是否正常
- [root@nagios tools]# printf "set key1 0 0 5\r\npeter\r\n" | nc 127.0.0.1 11211
- STORED
- [root@nagios tools]# printf "get key1\r\n" | nc 127.0.0.1 11211
- VALUE key1 0 5
- peter
- END
- [root@nagios tools]# printf "delete key1\r\n" | nc 127.0.0.1 11211
- DELETED
- #客户端php插件memcache安装
- cd /server/tools/
- wget http://pecl.php.net/get/memcache-2.2.7.tgz
- tar xf memcache-2.2.7.tgz
- cd memcache-2.2.7
- /application/php/bin/phpize
- ./configure --enable-memcache --with-php-config=/application/php/bin/php-config
- make
- make install
- Installing shared extensions: /application/php-5.3.27/lib/php/extensions/no-debug-non-zts-20090626/
- ls -l /application/php-5.3.27/lib/php/extensions/no-debug-non-zts-20090626/
- total 244
- -rwxr-xr-x 1 root root 246696 Sep 1 22:51 memcache.so
- vim /application/php/lib/php.ini
- ; http://php.net/extension-dir
- extension_dir = "/application/php-5.3.27/lib/php/extensions/no-debug-non-zts-20090626/"
- extension=memcache.so
- /application/php/sbin/php-fpm -t
- pkill php-fpm
- /application/php/sbin/php-fpm
- ps -ef | grep php-fpm
- #http://10.0.0.23/test_info.php
- #连接测试
- vim op_mem.php
- <?php
- $memcache = new Memcache;
- $memcache->connect('172.16.1.23',11211) or die ("Could not connect Mc server");
- $memcache->set('key','oldboy book');
- $get=$memcache->get('key');
- echo $get;
- ?>
- /application/php/bin/php op_mem.php
- oldboy book
如何实现集群中的session共享存储?
- vim /application/php/lib/php.ini
- 1458 [Session]
- 1459 ; Handler used to store/retrieve data.
- 1460 ; http://php.net/session.save-handler
- 1461 session.save_handler = memcache #修改session存储方式
- 1462
- 1463 ; Argument passed to save_handler. In the case of files, this is the path
- 1464 ; where data files are stored. Note: Windows users have to change this
- 1465 ; variable in order to use PHP's session functions.
- 1466 ;
- 1467 ; The path can be defined as:
- 1468 ;
- 1469 session.save_path = "tcp://172.16.1.23:11211" #修改session存储路径
- pkill php-fpm
- /application/php/sbin/php-fpm
- #http://10.0.0.23/test_info.php
session同步的多种方式
MEMCACHED服务的状态信息的获取,例如:命中率
- printf "stats\r\n" | nc 127.0.0.1 11211 #Memcached各种状态信息
- STAT pid 41346 #PID
- STAT uptime 4759 #服务已运行秒数
- STAT time 1505572559 #服务当前UNIX时间戳
- STAT version 1.4.24 #Memcached版本
- STAT libevent 1.4.13-stable #libevent版本
- STAT pointer_size 64 #操作系统指针大小
- STAT rusage_user 0.121981 #进程累计用户时间
- STAT rusage_system 0.112982 #进程累计系统时间
- STAT curr_connections 10 #当前连接数
- STAT total_connections 14 #服务运行以来总连接数
- STAT connection_structures 11 #服务分配的连接结构数量
- STAT reserved_fds 20 #内部使用的FD数
- STAT cmd_get 1 #get请求次数
- STAT cmd_set 1 #set请求次数
- STAT cmd_flush 0 #flush请求次数
- STAT cmd_touch 0 #touch请求次数
- STAT get_hits 1 #get命中次数
- STAT get_misses 0 #get未命中次数
- STAT delete_misses 0 #delete未命中次数
- STAT delete_hits 1 #delete命中次数
- STAT incr_misses 0 #incr未命中次数
- STAT incr_hits 0 #incr命中次数
- STAT decr_misses 0 #decr未命中次数
- STAT decr_hits 0 #decr命中次数
- STAT cas_misses 0 #cas未命中次数
- STAT cas_hits 0 #cas命中次数
- STAT cas_badval 0 #cas使用擦拭次数
- STAT touch_hits 0 #touch命中次数
- STAT touch_misses 0 #touch未命中次数
- STAT auth_cmds 0 #认证命令处理次数
- STAT auth_errors 0 #认证命令失败次数
- STAT bytes_read 53 #读取总字节数
- STAT bytes_written 45 #写入总字节数
- STAT limit_maxbytes 16777216 #分配内存总大小(字节)
- STAT accepting_conns 1 #接受新的连接
- STAT listen_disabled_num 0 #失效的监听数
- STAT threads 4 #当前线程数
- STAT conn_yields 0 #连接操作主动放弃数目
- STAT hash_power_level 16 #hash表等级
- STAT hash_bytes 524288 #hash表大小
- STAT hash_is_expanding 0 #hash表正在扩展
- STAT malloc_fails 0 #分配内存失败的数目
- STAT bytes 0 #已过期但未获取的对象数目
- STAT curr_items 0 #当前的对象数目
- STAT total_items 1 #当前存储占用的字节数
- STAT expired_unfetched 0 #已过期但未获取的对象数目
- STAT evicted_unfetched 0 #已驱逐但未获取的对象数目
- STAT evictions 0 #LRU释放的对象数目
- STAT reclaimed 0
- STAT crawler_reclaimed 0
- STAT crawler_items_checked 0
- STAT lrutail_reflocked 0
- END
- [root@nagios ~]# printf "stats settings\r\n" | nc 127.0.0.1 11211 #Memcached设置信息
- [root@nagios ~]# printf "stats slabs\r\n" | nc 127.0.0.1 11211 #查看slabs相关信息
- [root@nagios ~]# printf "stats items\r\n" | nc 127.0.0.1 11211 #查看items相关信息
- [root@nagios ~]# printf "stats sizes\r\n" | nc 127.0.0.1 11211 #查看items的大小和个数
- [root@nagios ~]# printf "stats reset\r\n" | nc 127.0.0.1 11211 #清理统计数据
- #访问测试
- [root@nagios nginx]# printf "stats\r\n" | nc 127.0.0.1 11211 | grep get
- STAT cmd_get 1
- STAT get_hits 1
- STAT get_misses 0
- [root@nagios nginx]# printf "get key1\r\n" | nc 127.0.0.1 11211
- END
- [root@nagios nginx]# printf "stats\r\n" | nc 127.0.0.1 11211 | grep get
- STAT cmd_get 2
- STAT get_hits 1
- STAT get_misses 1
2.通过Memcached管理工具Memadmin展示
- #Memadmin是基于PHP和JQuery的Memcached管理监控工具
- cd /server/tools
- wget http://www.junopen.com/memadmin/memadmin-1.0.12.tar.gz
- tar xf memadmin-1.0.12.tar.gz
- mv memadmin /application/nginx/html/www/
- #http://10.0.0.88/memadmin
通过Nagios监控Memcached
1.监控指标:
端口
命名率
响应时间
模拟用户存取
2.Nagios插件开发
- #模拟用户进行存取,测试memcached的状态
- vim check_mc.sh
- [ $# -ne 2 ] && {
- echo "$0 ip port"
- exit
- }
- #!/bin/bash
- ServerIP=$1
- ServerPort=$2
- cmd="nc $ServerIP $ServerPort"
- printf "delete key\r\n" | $cmd > /dev/null 2>&1
- sleep 1
- printf "set key 0 0 5\r\npeter\r\n" | $cmd > /dev/null 2>&1
- if [ `printf "get key\r\n" | $cmd | grep peter | wc -l` -eq 1 ];then
- echo "mc is alive."
- exit 0
- else
- echo "mc is dead."
- exit 2
- fi
- [root@nagios ~]# sh check_mc.sh 127.0.0.1 11211
- mc is alive.
Memcached内存缓存技术的更多相关文章
- 带你走进memcache,老牌内存缓存技术
一.核心优化概述 什么是优化:以更小的资源支持更大负载网站的运行,以小博大. 思路:尽量减少用户等待时间,节省系统资源开销,节省带宽使用. 优化什么地方?有三方面:Memcache内存缓存技术.静态化 ...
- 图片_ _图片缓存之内存缓存技术LruCache,软引用
每当碰到一些大图片的时候,我们如果不对图片进行处理就会报OOM异常,这个问题曾经让我觉得很烦恼,后来终于得到了解决,那么现在就让我和大家一起分享一下吧.这篇博文要讲的图片缓存机制,我接触到的有两钟,一 ...
- 图片缓存之内存缓存技术LruCache,软引用
每当碰到一些大图片的时候,我们如果不对图片进行处理就会报OOM异常, 这个问题曾经让我觉得很烦恼,后来终于得到了解决, 那么现在就让我和大家一起分享一下吧. 这篇博文要讲的图片缓存机制,我接触到的有两 ...
- 转 图片缓存之内存缓存技术LruCache,软引用
每当碰到一些大图片的时候,我们如果不对图片进行处理就会报OOM异常,这个问题曾经让我觉得很烦恼,后来终于得到了解决,那么现在就让我和大家一起分享一下吧.这篇博文要讲的图片缓存机制,我接触到的有两钟,一 ...
- 【转】图片缓存之内存缓存技术LruCache、软引用 比较
每当碰到一些大图片的时候,我们如果不对图片进行处理就会报OOM异常,这个问题曾经让我觉得很烦恼,后来终于得到了解决,那么现在就让我和大家一起分享一下吧.这篇博文要讲的图片缓存机制,我接触到的有两钟,一 ...
- php -- memcached 内存缓存
一.memcached 简介 在很多场合,我们都会听到 memcached 这个名字,但很多同学只是听过,并没有用过或实际了解过,只知道它是一个很不错的东东.这里简单介绍一下,memcached 是高 ...
- 服务器后端开发系列——《实战Memcached内存缓存系统》
1.实战Memcached缓存系统(1)Memcached基础及示例程序 内容:建筑Memcached背景知识和入门示例程序. 2.实战Memcached缓存系统(2)Memcached Java A ...
- ASP.NET使用Memcached高缓存实例的初级介绍
Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态.数据库驱动网站的速度.Memcached ...
- 内存数据库:memcached与redis技术的对比试验
本文以高性能nginx服务器为应用背景,想利用缓存技术来减轻系统负荷,加快响应时间,从而增加web服务器的吞吐量. redis是一种分布式内存数据库,memcached是一种内存缓存技术,它们都采用k ...
随机推荐
- IBatis Map时间参数文字格式不匹配!
CS. ht.Add("start_time", startTime); Map <isNotNull prepend="and" property=&q ...
- 【题解】CF#280 C-Game on Tree
感觉对期望也一无所知……(:′⌒`)╮(╯﹏╰)╭ 一直在考虑怎么dp,最后看了题解——竟然是这样的???[震惊]但是看了题解之后,觉得确实很有道理…… 我们可以考虑最后答案的组成,可以分开计算不同的 ...
- [USACO06NOV]玉米田Corn Fields 状压DP
题面: 农场主John新买了一块长方形的新牧场,这块牧场被划分成M行N列(1 ≤ M ≤ 12; 1 ≤ N ≤ 12),每一格都是一块正方形的土地.John打算在牧场上的某几格里种上美味的草,供他的 ...
- ocker nginx 配置反向代理和负载均衡
1. 获取及配置nginx 如果需要全站通过docker部署,那么nginx或许是不可或缺的.通过配置nginx,可以迅速实现负载均衡和反向代理服务.值得一提的是,docker官网恰好也有nginx镜 ...
- 【BZOJ5301】【CQOI2018】异或序列(莫队)
[BZOJ5301][CQOI2018]异或序列(莫队) 题面 BZOJ 洛谷 Description 已知一个长度为 n 的整数数列 a[1],a[2],-,a[n] ,给定查询参数 l.r ,问在 ...
- BZOJ3339:Rmq Problem & BZOJ3585 & 洛谷4137:mex——题解
前者:https://www.lydsy.com/JudgeOnline/problem.php?id=3339 后者: https://www.lydsy.com/JudgeOnline/probl ...
- BZOJ1503:[NOI2004]郁闷的出纳员——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=1503 (题面复制的洛谷的,因为洛谷好看) 题目描述 OIER公司是一家大型专业化软件公司,有着数以万 ...
- Mysql Fabric实现学习笔记
Mysql Fabric用来管理mysql服务,提供扩展性和容易使用的系统,管理mysql分片和高可用部署(当前实现了两个特性:高可用和使用数据分片的横向扩展,能单独使用或结合使用这两个特性.). 架 ...
- react事件机制
1. react的事件是合成事件((Synethic event),不是原生事件 <button onClick={this.handleClick}></button> &l ...
- CentOS 6.5 下 QT4 连接 mysql 数据库的步骤
QT4 的安装请参考: CentOS 6.5 下安装 QT 4 mysql 的安装请参考: CentOS 6.5 下安装配置 mysql 1. 预防万一,先安装一下mysql-devel(一定要装!) ...