memcache

memcache 内存管理 机制

北慕城南 提交于 2019-12-09 23:22:57
一、Memcache内存分配机制 关于这个机制网上有很多解释的,我个人的总结如下。 Page为内存分配的最小单位。 Memcached 的内存分配以page为单位,默认情况下一个page是1M,可以通过-I参数在启动时指定。如果需要申请内存时,memcached会划分出一个新的 page并分配给需要的slab区域。page一旦被分配在重启前不会被回收或者重新分配(page ressign已经从1.2.8版移除了) Slabs划分数据空间。 Memcached 并不是将所有大小的数据都放在一起的,而是预先将数据空间划分为一系列slabs,每个slab只负责一定范围内的数据存储。如下图,每个slab只存储 大于其上一个slab的size并小于或者等于自己最大size的数据。例如:slab 3只存储大小介于137 到 224 bytes的数据。如果一个数据大小为230byte将被分配到slab 4中。从下图可以看出,每个slab负责的空间其实是不等的,memcached默认情况下下一个slab的最大值为前一个的1.25倍,这个可以通过修 改-f参数来修改增长比例。 Chunk才是存放缓存数据的单位。 Chunk 是一系列固定的内存空间,这个大小就是管理它的slab的最大存放大小。例如:slab 1的所有chunk都是104byte,而slab 4的所有chunk都是280byte

MSM--Memcached_Session_Manager介绍及使用

生来就可爱ヽ(ⅴ<●) 提交于 2019-12-09 22:22:43
MSM--Memcached_Session_Manager介绍及使用 我们都知道对于一些大型的web2.0的网站,在正式部署时一般是部署在不同故障域的多台应用服务器上,以j2ee应用为例,一般我们都会部署在tomcat下,假如我们部署了10台tomcat服务器,那这10台tomcat可能是部署在不同的机器上,然后将应用程序copy到这10台tomcat下,然后启动所有tomcat,一般来说这样做的目的是为了达到负载均衡以及避免单点故障,另外也考虑到国内网络环境的原因,避免跨网络运营商访问而导致访问速度低下的问题,当然不要忘了坐镇这10台tomcat前端的还有我们的反向代理服务器,比如nginx,这个就是另一个话题了,我今天主要讲的是,对于这种分布式tomcat环境,我们如何保证session 的唯一性(我假定你知道session是什么)。这也是在日期公司的一个项目中负责解决的一个问题,当然实际上这并不是什么新的议题,之前就有很多解决方案,但是一般来说的大体的解决方案是自己通过编写一段代码或者通过配置tomcat的filter,将产生的session放到同一个内存数据库中,事实上这确实可行的,只不过我比较懒,我总是觉得这种问题应该有更省事更成熟的解决方案,那确实是有的,也就是我马上介绍的 Memcached_Session_Manager,简称msm

memcached-session-manager配置

蓝咒 提交于 2019-12-09 22:02:18
Introduction 如果为了简单使用,你只需要安装一个tomcat(6或者7)和memcached,在生产环境中可能会有多台tomcat服务器以及多台可用的memcached节点,并安装在不同的机器上,我们可以使用黏性session( sticky sessions )或者非黏性session( non-sticky sessions ),memcached-session-manager (msm) 对这两种操作模式都支持。 下面给出一个黏性session模式的设置示例,此实例中安装了2个tomcat以及2个memcached。 Tomcat-1(t1)的首要选择是把session存储在memcached-2 (m2)上(m2是t1的一个普通节点),而m2是运行在另外的一台机器上。只有当m2不可用(宕机或无法访问)时,t1才会把session存储到memcached-1(m1,m1是t1的故障转移节点)上。使用这种配置,即使机器1宕机了session也不会丢失。具体如下图所示: 我们如何设置才能实现呢? Decide which serialization strategy to use 从1.1版开始,MSM就提供了多种可选的session序列化策略,默认的策略是使用java进行序列化,这种实现已经集成在memcached-session-manager.jar包中了

用KV系统实现并发锁

守給你的承諾、 提交于 2019-12-07 03:51:21
在key-value系统中缓存了网络服务器上一个重要的ticket,这个ticket用来授权。在一定的时间周期7200s里更新。现需要实现一个CGI提供给前端获取这个ticket,CGI访问量为每天百万pv左右。 假设某一时刻ticket要过期时有A,B两个请求。A请求过来发现ticket过期,开始从网络服务器上获取最新的ticket并写入KV,同时服务器更新自己存储的ticket。而B恰好在A写入前读出了ticket,此时服务器上的ticket和A同步了。但B的ticket是过期的,这会导致用B获取的ticket去请求资源时失败。 因而需要读写分离。其实读写分离也意味着把 并发锁转移 ,从可能几K个并发争锁减少到几个并发争锁。同时在CGI中降低了加锁成本。 思路如下: CGI只进行读KV操作 实现一个daemon程序,只负责每隔固定周期往KV更新ticket。用一个并发锁去控制写入时的资源竞争。 KV实现并发锁 往KV里添加一个字段 daemon_mutex ,对应的value为 pid + timestamp 。 daemon可能会挂掉。挂掉会导致两方面问题 daemon进程占有写锁,挂掉后死锁 daemon进程挂掉后KV不会更新 因此可以启动三个daemon进程,相互监督。 步骤如下: 3个进程争写锁,争到的进程为主进程,每隔1s刷新KV中 daemon_mutex

小蚂蚁学memcache笔记(1)准备工作以及telnet操作memcache的curd

回眸只為那壹抹淺笑 提交于 2019-12-06 14:50:30
memcache的应用条件 1.频繁变化的数据。2.丢了也无所谓的数据。 形式: 键值对的形式储存。 key -> value value可以储存的类型:1.字符串 2.数值 3.数组 4.对象 5.布尔 6.二进制数据(图片、视频) 安装步骤: 下载 memcache 安装进入cmd,切换到所在目录 使用命令 memcache.exe -d install 启动 memcached.exe -d start 使用 netstat -an 查看11211端口如果被监听,就说明启动成功。 netstat -anb 可以查看是什么程序正在监听该端口 计算机端口的范围:0~65535。因为端口是使用两个字节表示。 有名端口 : 0 ~ 1024 这些端口一般都是被一些有名的程序占用了,所以不要轻易使用这些端口。 一些常用的软件占用端口 1. apache 80 2. mysql 3306 3. ftp 21 4. ssh 22 5. oracle 1521 6. memcache 11211 telnet 操作memcache的 curd 1.登陆 telnet 链接到 memcache服务 telnet 127.0.0.1 11211 操作 增加 语法:add key 0 (存放时间,秒计算) 字符大小 获取 语法:get key 修改 语法:set key 0 (存放时间,秒计算)

小蚂蚁学memcache笔记—php操作memcache(2)

こ雲淡風輕ζ 提交于 2019-12-06 14:50:17
准备工作 把php_memcache.dll文件拷贝到php的ext下。 特别说明:不同版本php所用的php_memcache.dll版本不同。 修改php.ini文件,加载php_memcache.dll(这个文件其实就是加载了一大堆的函数) 重启apache php实际操作 $mem = new Memcache(); //实例化对象 $mem = connect('127.0.0.1',11211); $mem -> add(键,值,是否压缩,生存时间); $mem -> set(同上); //键如果存在就修改,不存在就添加 memcache可以保存字符串和数组、数字、对象 保存对象的时候会产生一个问题:在另外一个文件中取出对象的时候,有一个需要注意的地方。对应php5.2这个版本会提示错误,对php5.3这个版本会提示incomplete信息。这个错误和保存在$_SESSION中是一样的,解决方法也一样。 解决方法:在当前脚本在重新声明类定义(把类也拿过去) 添加 null 取出 null 添加 false 取出 ‘’ 修改 $mem->replace(同添加); 删除 $mem->delete(键); 全部冲掉 flush 注意细节:在添加数据时,如果把expire(超时)设为0,表示永不过期。expire直接给秒数,则最大只能是30天,即30*3600*24

小蚂蚁学memcache笔记—php操作memcache(3)

懵懂的女人 提交于 2019-12-05 20:50:27
上篇在学习$mem->set();的时候少写了一个参数,第三个参数,MEMCACHE_COMPRESSED,这个参数的作用在于压缩。 memcache是独立机构,是C/S结构。如果memcache满了,LRU算法删除,把最早没有访问过的拿掉。 memcache的分布式 这里是重点 在第二部中将connect这个方法改成addserver(),在链接池中添加了一个memcache服务器。 例如 : $mem -> new Memcache(); $mem -> addServer('127.0.0.1',11211); //增加链接池 $mem -> addServer('127.0.0.1',9999); //增加链接池 $mem -> get($key); memcached尽管是‘分布式’缓存服务器,但服务器端并没有分布式功能。 各个memcache不会互相通信以便信息共享。每个memcache服务的数据不是同步的。 而且把什么样的数据放入到哪一个memcached是由客户端的mem对象来决定的。 当执行addServer的时候,并不是立即去连接mem服务,而是通过计算,hash后才去决定链接哪一台mem服务,所以当大量加入服务到连接池,不会有多余的开销。 memcache细节的研究 生命周期。从放入开始计时,时间到就自动销毁。memcache被销毁有以下几种情况。一,时间到

小蚂蚁学memcache笔记(完结)

巧了我就是萌 提交于 2019-12-05 20:50:11
memcache安全讨论 memcache和session的比较 memcache主要目的用于提速,因此它是一种无状态的数据,即数据不会和任何用户绑定。 session数据是和用户绑定的,因此是一种有状态的数据。 memcache应该放入到内网,用防火墙阻止外网对11211端口的访问。坚决不能放到外网去。 在linux下也可以使用防火墙 setup 配置防火墙 iptables -a input -p tcp -s 127.0.0.1 -d port 11211 -j ACCEPT 该命令只允许本机访问。 和memcache功能相近的还有一个叫redis的nosql有时间也可以研究一下。 memcache就学习的这里,在工作中多多使用,增加经验积累。 来源: oschina 链接: https://my.oschina.net/u/1423209/blog/505466

在Cakephp中使用XML和Memcache持久化保存数据

一曲冷凌霜 提交于 2019-12-05 20:46:13
在实际网站项目中需要把一些配置文件放到XML文件中,有时也需要把一些非关键的用户信息或者应用信息放到xml中保存。这么有几个好处,一方面xml文件可以灵活的配置,减少对数据库的改动;另一方面,可以降低数据库服务器的压力。 当然单纯的读取XML来获取配置信息并不划算,我们使用XML同时结合Memcache内存缓存保存数据,可以提高应用程序的执行效率。在Cakephp框架中配置Memcache如下: Cache::config('memcache', array( 'engine' => 'Memcache', 'duration'=> '+1 day', 'probability'=> 100, 'prefix' => 'whatever_', 'servers' => array( '127.0.0.1:11211' ), 'compress' => false, )); 那么就使用Cache::write,Cache::read和Cache::del来操作Memcache变量。另外,通过引入Cakephp核心类库Xml App::import('Core', 'Xml') 可以很方便的读取XML文件、toArray和toString。结合以上两点,可以设计一个Cakephp组件SiteConfig来完成一下功能: 1)读取站点配置getConfig 2