Memcached是什么,有什么作用?

Memcached是一个开源的、高性能的内存缓存软件,从名称上看Mem就是内存的意思,而Cache就是缓存的意思。
Memcached通过在事先规划好的内存空间中临时缓存数据库中的各类数据,以减少业务直接对数据库的访问,从而减轻数据库的访问压力和网站集群的响应速度。

Memcached服务在企业集群架构中应用场景

1.作为数据库的前端缓存应用

完整缓存(易):例如商品分类,以及商品信息,可实现放到内存里,然后再对外提供数据访问。这个被称之为预热。用户访问时可以只读取memcached缓存,不读取数据库了。

热点缓存(难):需要前端程序配合。只缓存热点的数据,即缓存经常被访问的数据。先预热基础数据,然后再动态更新。程序先读取缓存,如果缓存里没有对应的数据,程序再去读取数据库,然后程序把读到的数据放入缓存。

特殊说明:
如果碰到电商秒杀等高并发的业务,一定要事先预热,或者其他思想实现,例如:秒杀只是获取资格,而不是瞬间秒杀到手商品。如果数据更新,要同时触发缓存更新,防止给用户过过期数据。

2.作为集群的session会话共享存储

优点:速度比files块,可以解决共用session问题
缺点:不能持久化,只能单点部署,多点数据无法同步,即使用hash分配节点,也会有session丢失

Memcached服务在不同企业业务应用场景中的工作流程

1.当web程序需要访问后端数据库获取数据时会优先访问Memcached内存缓存,如果缓存中有数据就直接获取返回前端服务及用户,如果没有数据(未命中),再由程序请求后端的数据库服务器,获取到对应的数据后,除了返回给前端服务及用户数据外,还会把数据放到Memcached内存中进行缓存,等待下次被访问。Memcahced内存始终是数据库的挡箭牌,从而大大的减轻数据库的访问压力,提高整个网站架构的响应速度,提升了用户体验。

2.当程序更新,修改或删除数据库中已有的数据时,会同时发送请求通知Memcached已经缓存过的同一个ID内容的旧数据失效,从而保证Memcahce中的数据和数据库中的数据保持一致。如果是在高并发场合,除了通知Memcached过期的缓存失效外,还会通过相关机制,使得在用户访问新数据前,通过程序预先把更新过的数据推送到memcached中缓存起来,这样可以减少数据库的访问压力,提升memcached中缓存的命中率。

3.数据库插件可以在写入更新数据库后,自动抛给MC缓存起来,自身不Cache

Memcached服务分布式集群如何实现?

1.程序端实现

程序加载所有mc的ip列表,通过对key做hash(一致性哈希),从而映射到某一台mc,相同的key永远映射到同一台的mc。 Hash就是将任意长度的输入转化成固定长度的输出。
一致性哈希的目的:不但保证每个对象只请求一个对应的服务器,同时保证当某个节点宕机,缓存服务器的更新重新分配比例降到最低。
2.负载均衡器实现:由负载均衡器来做hash
 
特殊说明:memcached集群和web服务集群是不一样的,所有memcached数据总和才是数据库的数据。每台memcached只有一部分数据。

Memcached服务特点及工作原理是什么?

a.节点之间相互独立
b.数据是以key/value对形式存在的
c.C/S模式架构,C语言编写,总共代码2000多行
d.异步I/O模型,使用libevent事件通知机制
e.全部数据放入内存,无持久性设计,重启服务数据丢失  (缺点)
f.当内存中缓存的数据容量达到启动时设定的内存值时,自动使用LRU算法删除过期的缓存数据
g.可以对存储的数据设置过期时间,这样过期后数据自动被清除,服务本身不会监控过期,而是在访问的时候查看key的时间戳判断是否过期
h.memcached内存分配机制是对特定的内存进行分块,再把多个块分为组

Memcached内存管理机制原理

malloc的全称是memory allocation,中文叫动态内存分配,当无法知道内存具体位置的时候,想要绑定真正的内存空间,就需要用到动态的分配内存。
早期的memcached内存管理方式是通过malloc分配的内存,使用完后通过free来回收内存。这种方式容易产生内存碎片并降低操作系统对内存的管理效率。加重操作系统内存管理器的负担,最坏的情况下,会导致操作系统比memcached进程本身还慢,为了解决上述问题,Slab Allocator内存分配机制就产生了
现在的memcached就是利用Slab Allocation机制来分配和管理内存。
Slab Allocation机制原理是按照预先规定的大小,将分配给memcached的内存分割成特定长度的内存块chunk,再把尺寸相同的内存块分成组(chunks slab class),这些内存块不会释放,可以重复利用。

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不会释放,而是重复利用,用新数据替换旧数据。

Slab主要术语:
Page:分配给Slab的内存空间
Chunk:内存块
Slab Class:多个特定大小的chunk组成的组,一般也叫slabs

Memcached的删除原理与删除机制

Memcached主要的删除机制是LRU(最近最少用)算法,加上item过期失效。当您存数据到memcached中,可以指定该数据在缓存中可以呆多久。如果memcached内存不够用,过期的数据会优先被替换,接着轮到最老的未被使用的数据。在某些情况下(完整缓存),如果不想用LRU算法,可以通过-M参数启动Memcached,这样memcached内存耗尽也不会删除,宁愿报错也不删除。

Memcached服务端与客户端的安装部署与使用测试

  1. #安装memcached前需要安装libevent
  2. yum install libevent-devel nc -y
  3. #源码安装memcahced
  4. cd /server/tools
  5. wget http://memcached.org/files/memcached-1.4.24.tar.gz
  6. tar xf memcached-1.4.24.tar.gz
  7. cd memcached-1.4.24
  8. ./configure --prefix=/application/memcached-1.4.24
  9. make
  10. make install
  11. ln -s /application/memcached-1.4.24/ /application/memcached
  12.  
  13. #启动一个Mem实例
  14. /application/memcached/bin/memcached -m 16m -p 11211 -d -u root -c 8192 # 分配的内存 端口 后台 用户 最大并发连接数
  15. lsof -i :11211
  16. ps -ef | grep memcached | grep -v grep
  17. root 2984 1 0 23:10 ? 00:00:00 /application/memcached/bin/memcached -m 16m -p 11211 -d -u root -c 8192
  18.  
  19. #可以启动多个Mem实例
  20. /application/memcached/bin/memcached -m 16m -p 11212 -d -u root -c 8192
  21. ps -ef | grep memcached | grep -v grep
  22. root 2984 1 0 23:10 ? 00:00:00 /application/memcached/bin/memcached -m 16m -p 11211 -d -u root -c 8192
  23. root 3036 1 0 23:16 ? 00:00:00 /application/memcached/bin/memcached -m 16m -p 11212 -d -u root -c 8192
  24.  
  25. #加入开机启动
  26. echo "/application/memcached/bin/memcached -m 16m -p 11211 -d -u root -c 8192" >> /etc/rc.local
  27. echo "/application/memcached/bin/memcached -m 16m -p 11212 -d -u root -c 8192" >> /etc/rc.local
  28.  
  29. #测试服务端是否正常
  30. [root@nagios tools]# printf "set key1 0 0 5\r\npeter\r\n" | nc 127.0.0.1 11211
  31. STORED
  32. [root@nagios tools]# printf "get key1\r\n" | nc 127.0.0.1 11211
  33. VALUE key1 0 5
  34. peter
  35. END
  36. [root@nagios tools]# printf "delete key1\r\n" | nc 127.0.0.1 11211
  37. DELETED
  38.  
  39. #客户端php插件memcache安装
  40. cd /server/tools/
  41. wget http://pecl.php.net/get/memcache-2.2.7.tgz
  42. tar xf memcache-2.2.7.tgz
  43. cd memcache-2.2.7
  44. /application/php/bin/phpize
  45. ./configure --enable-memcache --with-php-config=/application/php/bin/php-config
  46. make
  47. make install
  48. Installing shared extensions: /application/php-5.3.27/lib/php/extensions/no-debug-non-zts-20090626/
  49. ls -l /application/php-5.3.27/lib/php/extensions/no-debug-non-zts-20090626/
  50. total 244
  51. -rwxr-xr-x 1 root root 246696 Sep 1 22:51 memcache.so
  52.  
  53. vim /application/php/lib/php.ini
  54.  
  55. ; http://php.net/extension-dir
  56. extension_dir = "/application/php-5.3.27/lib/php/extensions/no-debug-non-zts-20090626/"
  57. extension=memcache.so
  58.  
  59. /application/php/sbin/php-fpm -t
  60. pkill php-fpm
  61. /application/php/sbin/php-fpm
  62. ps -ef | grep php-fpm
  63.  
  64. #http://10.0.0.23/test_info.php

  1. #连接测试
  2. vim op_mem.php
  3. <?php
  4. $memcache = new Memcache;
  5. $memcache->connect('172.16.1.23',11211) or die ("Could not connect Mc server");
  6. $memcache->set('key','oldboy book');
  7. $get=$memcache->get('key');
  8. echo $get;
  9. ?>
  10.  
  11. /application/php/bin/php op_mem.php
  12. oldboy book

如何实现集群中的session共享存储?

  1. vim /application/php/lib/php.ini
  2.  
  3. 1458 [Session]
  4. 1459 ; Handler used to store/retrieve data.
  5. 1460 ; http://php.net/session.save-handler
  6. 1461 session.save_handler = memcache #修改session存储方式
  7. 1462
  8. 1463 ; Argument passed to save_handler. In the case of files, this is the path
  9. 1464 ; where data files are stored. Note: Windows users have to change this
  10. 1465 ; variable in order to use PHP's session functions.
  11. 1466 ;
  12. 1467 ; The path can be defined as:
  13. 1468 ;
  14. 1469 session.save_path = "tcp://172.16.1.23:11211" #修改session存储路径
  15.  
  16. pkill php-fpm
  17. /application/php/sbin/php-fpm
  18.  
  19. #http://10.0.0.23/test_info.php

session同步的多种方式

a. lb层可以做会话保持,例如:
     lvs -p
     nginx ip_hash
     haproxy cookie insert
     PHP,JAVA都可以用
b. 软件层,可以做session复制,例如
     tomcat resin couchbase
c. session共享
      memcache或者其他nosql工具,PHP常用这个
d. 高并发场景:例如门户网站用cookies或cookies配合session把用户级会话信息缓存在用户本地。高并发的场景cookies的效率比session要好很多

MEMCACHED服务的状态信息的获取,例如:命中率

1.通过memcache命令
  1. printf "stats\r\n" | nc 127.0.0.1 11211 #Memcached各种状态信息
  2. STAT pid 41346 #PID
  3. STAT uptime 4759 #服务已运行秒数
  4. STAT time 1505572559 #服务当前UNIX时间戳
  5. STAT version 1.4.24 #Memcached版本
  6. STAT libevent 1.4.13-stable #libevent版本
  7. STAT pointer_size 64 #操作系统指针大小
  8. STAT rusage_user 0.121981 #进程累计用户时间
  9. STAT rusage_system 0.112982 #进程累计系统时间
  10. STAT curr_connections 10 #当前连接数
  11. STAT total_connections 14 #服务运行以来总连接数
  12. STAT connection_structures 11 #服务分配的连接结构数量
  13. STAT reserved_fds 20 #内部使用的FD数
  14. STAT cmd_get 1 #get请求次数
  15. STAT cmd_set 1 #set请求次数
  16. STAT cmd_flush 0 #flush请求次数
  17. STAT cmd_touch 0 #touch请求次数
  18. STAT get_hits 1 #get命中次数
  19. STAT get_misses 0 #get未命中次数
  20. STAT delete_misses 0 #delete未命中次数
  21. STAT delete_hits 1 #delete命中次数
  22. STAT incr_misses 0 #incr未命中次数
  23. STAT incr_hits 0 #incr命中次数
  24. STAT decr_misses 0 #decr未命中次数
  25. STAT decr_hits 0 #decr命中次数
  26. STAT cas_misses 0 #cas未命中次数
  27. STAT cas_hits 0 #cas命中次数
  28. STAT cas_badval 0 #cas使用擦拭次数
  29. STAT touch_hits 0 #touch命中次数
  30. STAT touch_misses 0 #touch未命中次数
  31. STAT auth_cmds 0 #认证命令处理次数
  32. STAT auth_errors 0 #认证命令失败次数
  33. STAT bytes_read 53 #读取总字节数
  34. STAT bytes_written 45 #写入总字节数
  35. STAT limit_maxbytes 16777216 #分配内存总大小(字节)
  36. STAT accepting_conns 1 #接受新的连接
  37. STAT listen_disabled_num 0 #失效的监听数
  38. STAT threads 4 #当前线程数
  39. STAT conn_yields 0 #连接操作主动放弃数目
  40. STAT hash_power_level 16 #hash表等级
  41. STAT hash_bytes 524288 #hash表大小
  42. STAT hash_is_expanding 0 #hash表正在扩展
  43. STAT malloc_fails 0 #分配内存失败的数目
  44. STAT bytes 0 #已过期但未获取的对象数目
  45. STAT curr_items 0 #当前的对象数目
  46. STAT total_items 1 #当前存储占用的字节数
  47. STAT expired_unfetched 0 #已过期但未获取的对象数目
  48. STAT evicted_unfetched 0 #已驱逐但未获取的对象数目
  49. STAT evictions 0 #LRU释放的对象数目
  50. STAT reclaimed 0
  51. STAT crawler_reclaimed 0
  52. STAT crawler_items_checked 0
  53. STAT lrutail_reflocked 0
  54. END
  55.  
  56. [root@nagios ~]# printf "stats settings\r\n" | nc 127.0.0.1 11211 #Memcached设置信息
  57. [root@nagios ~]# printf "stats slabs\r\n" | nc 127.0.0.1 11211 #查看slabs相关信息
  58. [root@nagios ~]# printf "stats items\r\n" | nc 127.0.0.1 11211 #查看items相关信息
  59. [root@nagios ~]# printf "stats sizes\r\n" | nc 127.0.0.1 11211 #查看items的大小和个数
  60. [root@nagios ~]# printf "stats reset\r\n" | nc 127.0.0.1 11211 #清理统计数据
  61.  
  62. #访问测试
  63. [root@nagios nginx]# printf "stats\r\n" | nc 127.0.0.1 11211 | grep get
  64. STAT cmd_get 1
  65. STAT get_hits 1
  66. STAT get_misses 0
  67.  
  68. [root@nagios nginx]# printf "get key1\r\n" | nc 127.0.0.1 11211
  69. END
  70.  
  71. [root@nagios nginx]# printf "stats\r\n" | nc 127.0.0.1 11211 | grep get
  72. STAT cmd_get 2
  73. STAT get_hits 1
  74. STAT get_misses 1

2.通过Memcached管理工具Memadmin展示

  1. #Memadmin是基于PHP和JQuery的Memcached管理监控工具
  2. cd /server/tools
  3. wget http://www.junopen.com/memadmin/memadmin-1.0.12.tar.gz
  4. tar xf memadmin-1.0.12.tar.gz
  5. mv memadmin /application/nginx/html/www/
  6.  
  7. #http://10.0.0.88/memadmin

通过Nagios监控Memcached

1.监控指标:

端口

命名率

响应时间

模拟用户存取

2.Nagios插件开发

  1. #模拟用户进行存取,测试memcached的状态
  2. vim check_mc.sh
  3. [ $# -ne 2 ] && {
  4. echo "$0 ip port"
  5. exit
  6. }
  7. #!/bin/bash
  8. ServerIP=$1
  9. ServerPort=$2
  10. cmd="nc $ServerIP $ServerPort"
  11. printf "delete key\r\n" | $cmd > /dev/null 2>&1
  12. sleep 1
  13. printf "set key 0 0 5\r\npeter\r\n" | $cmd > /dev/null 2>&1
  14. if [ `printf "get key\r\n" | $cmd | grep peter | wc -l` -eq 1 ];then
  15. echo "mc is alive."
  16. exit 0
  17. else
  18. echo "mc is dead."
  19. exit 2
  20. fi
  21.  
  22. [root@nagios ~]# sh check_mc.sh 127.0.0.1 11211
  23. mc is alive.
 

Memcached内存缓存技术的更多相关文章

  1. 带你走进memcache,老牌内存缓存技术

    一.核心优化概述 什么是优化:以更小的资源支持更大负载网站的运行,以小博大. 思路:尽量减少用户等待时间,节省系统资源开销,节省带宽使用. 优化什么地方?有三方面:Memcache内存缓存技术.静态化 ...

  2. 图片_ _图片缓存之内存缓存技术LruCache,软引用

    每当碰到一些大图片的时候,我们如果不对图片进行处理就会报OOM异常,这个问题曾经让我觉得很烦恼,后来终于得到了解决,那么现在就让我和大家一起分享一下吧.这篇博文要讲的图片缓存机制,我接触到的有两钟,一 ...

  3. 图片缓存之内存缓存技术LruCache,软引用

    每当碰到一些大图片的时候,我们如果不对图片进行处理就会报OOM异常, 这个问题曾经让我觉得很烦恼,后来终于得到了解决, 那么现在就让我和大家一起分享一下吧. 这篇博文要讲的图片缓存机制,我接触到的有两 ...

  4. 转 图片缓存之内存缓存技术LruCache,软引用

    每当碰到一些大图片的时候,我们如果不对图片进行处理就会报OOM异常,这个问题曾经让我觉得很烦恼,后来终于得到了解决,那么现在就让我和大家一起分享一下吧.这篇博文要讲的图片缓存机制,我接触到的有两钟,一 ...

  5. 【转】图片缓存之内存缓存技术LruCache、软引用 比较

    每当碰到一些大图片的时候,我们如果不对图片进行处理就会报OOM异常,这个问题曾经让我觉得很烦恼,后来终于得到了解决,那么现在就让我和大家一起分享一下吧.这篇博文要讲的图片缓存机制,我接触到的有两钟,一 ...

  6. php -- memcached 内存缓存

    一.memcached 简介 在很多场合,我们都会听到 memcached 这个名字,但很多同学只是听过,并没有用过或实际了解过,只知道它是一个很不错的东东.这里简单介绍一下,memcached 是高 ...

  7. 服务器后端开发系列——《实战Memcached内存缓存系统》

    1.实战Memcached缓存系统(1)Memcached基础及示例程序 内容:建筑Memcached背景知识和入门示例程序. 2.实战Memcached缓存系统(2)Memcached Java A ...

  8. ASP.NET使用Memcached高缓存实例的初级介绍

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

  9. 内存数据库:memcached与redis技术的对比试验

    本文以高性能nginx服务器为应用背景,想利用缓存技术来减轻系统负荷,加快响应时间,从而增加web服务器的吞吐量. redis是一种分布式内存数据库,memcached是一种内存缓存技术,它们都采用k ...

随机推荐

  1. IBatis Map时间参数文字格式不匹配!

    CS. ht.Add("start_time", startTime); Map <isNotNull prepend="and" property=&q ...

  2. 【题解】CF#280 C-Game on Tree

    感觉对期望也一无所知……(:′⌒`)╮(╯﹏╰)╭ 一直在考虑怎么dp,最后看了题解——竟然是这样的???[震惊]但是看了题解之后,觉得确实很有道理…… 我们可以考虑最后答案的组成,可以分开计算不同的 ...

  3. [USACO06NOV]玉米田Corn Fields 状压DP

    题面: 农场主John新买了一块长方形的新牧场,这块牧场被划分成M行N列(1 ≤ M ≤ 12; 1 ≤ N ≤ 12),每一格都是一块正方形的土地.John打算在牧场上的某几格里种上美味的草,供他的 ...

  4. ocker nginx 配置反向代理和负载均衡

    1. 获取及配置nginx 如果需要全站通过docker部署,那么nginx或许是不可或缺的.通过配置nginx,可以迅速实现负载均衡和反向代理服务.值得一提的是,docker官网恰好也有nginx镜 ...

  5. 【BZOJ5301】【CQOI2018】异或序列(莫队)

    [BZOJ5301][CQOI2018]异或序列(莫队) 题面 BZOJ 洛谷 Description 已知一个长度为 n 的整数数列 a[1],a[2],-,a[n] ,给定查询参数 l.r ,问在 ...

  6. BZOJ3339:Rmq Problem & BZOJ3585 & 洛谷4137:mex——题解

    前者:https://www.lydsy.com/JudgeOnline/problem.php?id=3339 后者: https://www.lydsy.com/JudgeOnline/probl ...

  7. BZOJ1503:[NOI2004]郁闷的出纳员——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=1503 (题面复制的洛谷的,因为洛谷好看) 题目描述 OIER公司是一家大型专业化软件公司,有着数以万 ...

  8. Mysql Fabric实现学习笔记

    Mysql Fabric用来管理mysql服务,提供扩展性和容易使用的系统,管理mysql分片和高可用部署(当前实现了两个特性:高可用和使用数据分片的横向扩展,能单独使用或结合使用这两个特性.). 架 ...

  9. react事件机制

    1. react的事件是合成事件((Synethic event),不是原生事件 <button onClick={this.handleClick}></button> &l ...

  10. CentOS 6.5 下 QT4 连接 mysql 数据库的步骤

    QT4 的安装请参考: CentOS 6.5 下安装 QT 4 mysql 的安装请参考: CentOS 6.5 下安装配置 mysql 1. 预防万一,先安装一下mysql-devel(一定要装!) ...