——方法一——-cmd上直接清除,清除所有缓存
$ telnet localhost 11211
Trying 127001
Connected to localhost
Escape character is '^]'
flush_all
OK
quit
Connection to localhost closed by foreign host
——方法二——-PHP清理缓存方法
<php
$memcache = new Memcache;
$memcache->connect(‘localhost’, 11211) or die (“Could not connect”);
$version = $memcache->getVersion();
echo ”Server’s version: ”$version”
\n”;
>
<php
$memcache = new Memcache;
$memcache->connect(‘localhost’, 11211) or die (“Could not connect”);
print_r($memcache->getStats());
/
Array
(
[pid] => 8052
[uptime] => 9205
[time] => 1205898428
[version] => 125 >ehcache是纯Java编写的,通信是通过RMI方式,适用于基于java技术的项目。
memcached服务器端是c编写的,客户端有多个语言的实现,如c,PHP(淘宝,sina等各大门户网站),Python(豆瓣网), java(Xmemcached,spymemcached)。memcached服务器端是使用文本或者二进制通信的。
项目
Memcache
Ehcache
分布式
不完全,集群默认不实现
支持
集群
可通过客户端实现
支持(默认是异步同步)
持久化
可通过第三方应用实现,如sina研发的memcachedb,将cache的数据保存到[url=]Berkerly DB[/url]
支持。持久化到本地硬盘,生成一个data和index文件。cache初始化时会自动查找这两个文件,将数据放入cache
效率
高
高于Memcache
容灾
可通过客户端实现。
支持
缓存数据方式
缓存在memcached server向系统申请的内存中
可以缓存在内存(JVM中),也可以缓存在硬盘。通过CacheManager管理cache。多个CacheManager可配置在一个JVM内,CacheManager可管理多个cache。
缓存过期移除策略
LRU
LRU(默认),FIFO,LFU
缺点
功能不完善,相对于Ehcache效率低
只适用于java体系,只能用java编写客户端
优点
简洁,灵活,所有支持socket的语言都能编写其客户端
效率高。功能强大。1定期从DB里查询数据,再刷到memcached里
这种方法有个缺点是,有些业务的key可能是变化的,不确定的。
而且不好界定哪些数据是应该查询出来放到缓存中的,难以区分冷热数据。
2当缓存取到为null时,加锁去查询DB,只允许一个线程去查询DB
这种方式不太靠谱,不多讨论。而且如果是多个web服务器的话,还是有可能有并发的 *** 作。
3在向memcached写入value时,同时写入当前机器在时间作为过期时间
当get得到数据时,如果当前时间 - 过期时间 > 5s,则后台启动一个任务去查询DB,更新缓存。
当然,这里的后台任务必须保证同一个key,只有一个线程在执行查询DB的任务,不然这个还是高并发查询DB。
缺点是要把过期时间和value合在一起序列化,取出数据后,还要反序列化。很不方便。
网上大部分文章提到的都是前面两种方式,有少数文章提到第3种方式。下面提出一种基于两个key的方法:
4两个key,一个key用来存放数据,另一个用来标记失效时间
比如key是aaa,设置失效时间为30s,则另一个key为expire_aaa,失效时间为25s。
在取数据时,用multiget,同时取出aaa和expire_aaa,如果expire_aaa的value == null,则后台启动一个任务去查询DB,更新缓存。和上面类似。
对于后台启动一个任务去查询DB,更新缓存,要保证一个key只有一个线程在执行,这个如何实现?
对于同一个进程,简单加锁即可。拿到锁的就去更新DB,没拿到锁的直接返回。
对于集群式的部署的,如何实现只允许一个任务执行?
这里就要用到memcached的add命令了。
add命令是如果不存在key,则设置成功,返回true,如果已存在key,则不存储,返回false。
当get expired_aaa是null时,则add expired_aaa 过期时间由自己灵活处理。比如设置为3秒。
如果成功了,再去查询DB,查到数据后,再set expired_aaa为25秒。set aaa 为30秒。
综上所述,来梳理下流程:
比如一个key是aaa,失效时间是30s。查询DB在1s内。
put数据时,设置aaa过期时间30s,设置expire_aaa过期时间25s;
get数据时,multiget aaa 和 expire_aaa,如果expired_aaa对应的value != null,则直接返回aaa对应的数据给用户。如果expire_aaa返回value == null,则后台启动一个任务,尝试add expire_aaa,并设置超时过间为3s。这里设置为3s是为了防止后台任务失败或者阻塞,如果这个任务执行失败,那么3秒后,如果有另外的用户访问,那么可以再次尝试查询DB。如果add执行成功,则查询DB,再更新aaa的缓存,并设置expire_aaa的超时时间为25s。
5 时间存到Value里,再结合add命令来保证只有一个线程去刷新数据
update:2014-06-29
最近重新思考了下这个问题。发现第4种两个key的办法比较耗memcached的内存,因为key数翻倍了。结合第3种方式,重新设计了下,思路如下:
仍然使用两个key的方案:
key
__load_{key}
其中,__load_{key} 这个key相当于一个锁,只允许add成功的线程去更新数据,而这个key的超时时间是比较短的,不会一直占用memcached的内存。
在set 到Memcached的value中,加上一个时间,(time, value),time是memcached上的key未来会过期的时间,并不是当前系统时间。
当get到数据时,检查时间是否快要超时: time - now < 5 1000,假定设置了快要超时的时间是5秒。
如果是,则后台启动一个新的线程:
尝试 add __load_{key},
如果成功,则去加载新的数据,并set到memcached中。
原来的线程直接返回value给调用者。一、下载MemercachedForWindows
二、安装步骤
1、解压到指定目录,如:C:\Memcached\memcached-win32-144-14。
2、用cmd打开命令窗口,转到解压的目录,输入“memcachedexe-dinstall”。
3、打开控制面板,打开服务,可以看到memcached已经在上面可,如果没有启动,则手动启动一下。
4、使用telnet命令验证缓存服务器是否可用。开始什么都不显示,回车后输入命令stats查看统计信息,说明服务器运作正常。
三、参数介绍1、以上的安装和启动都是在默认环境下进行的,在安装时可设置如下参数:-p监听的端口-l连接的IP地址,默认是本机-dstart启动memcached服务-drestart重起memcached服务-dstop|shutdown关闭正在运行的memcached服务-dinstall安装memcached服务-duninstall卸载memcached服务-u以的身份运行(仅在以root运行的时候有效)-m最大内存使用,单位MB。默认64MB-M内存耗尽时返回错误,而不是删除项-c最大同时连接数,默认是1024-f块大小增长因子,默认是125-n最小分配空间,key+value+flags默认是48-h显示帮助如:“memcached-dinstall-l127001-m1024-c2048”
。2、如果在安装时没有添加参数,可通过修改注册表信息进行设置,打开注册表,找HKEY_LOCAL_MACHINE\SYSTEM\Curr
希望可以帮到您Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的hashmap。其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。但是它并不提供冗余(例如,复制其hashmap条目);当某个服务器S停止运行或崩溃了,所有存放在S上的键/值对都将丢失。
下载Windows的Server端
安装Memcache Server(也可以不安装直接启动)
1 下载memcached的windows稳定版,解压放某个盘下面,比如在c:\memcached
2 在CMD下输入 "c:\memcached\memcachedexe -d install" 安装
3 再输入:"c:\memcached\memcachedexe -d start" 启动。NOTE: 以后memcached将作为windows的一个服务每次开机时自动启动。这样服务器端已经安装完毕了。
如果下载的是二进制的版本,直接运行就可以了,可以加上参数来加以设置。
常用设置:
-p <num> 监听的端口
-l <ip_addr> 连接的IP地址, 默认是本机
-d start 启动memcached服务
-d restart 重起memcached服务
-d stop|shutdown 关闭正在运行的memcached服务
-d install 安装memcached服务
-d uninstall 卸载memcached服务
-u <username> 以<username>的身份运行 (仅在以root运行的时候有效)
-m <num> 最大内存使用,单位MB。默认64MB
-M 内存耗尽时返回错误,而不是删除项
-c <num> 最大同时连接数,默认是1024
-f <factor> 块大小增长因子,默认是125
-n <bytes> 最小分配空间,key+value+flags默认是48
-h 显示帮助在PHP的ini配置文件里面提供了[Session]相关配置,可以支持将信息存到文件或memcached服务器里面。由配置项sessionsave_handler = memcached决定。大多数场景,该session数据并不需要持久化,且为了提升网站性能,会选择将session信息缓存到memcached里面。
需要修改phpini配置文件:
1、session段
找到[Session]段落,修改存储引擎为:
sessionsave_handler = memcached(注意是带d扩展)
修改存储地址,即OCS访问地址为:
sessionsave_path = “be6b6b8221cc11e4mcnhzalicm10pub001ocsaliyuncscom:11211″(注意带d扩展,则前面不用加tcp://,不带d的扩展需要加)
修改缓存到memcached的key的时间
sessiongc_maxlifetime = 1440(单位是秒,强烈建议必须设置一个合理时间,以保证OCS始终只缓存热点数据)
2、memcached段
在phpini的全局段,建一个单独段落[memcached],然后在空白地方加入下面配置
[memcached]
memcacheduse_sasl = On
memcachedsess_binary = On
memcachedsess_sasl_username = “your_ocs_name”
memcachedsess_sasl_password = “your_ocs_password”
memcachedsess_locking = Off
举例:
<php
$memc = new Memcached();
$memc->setOption(Memcached::OPT_COMPRESSION, false);
$memc->setOption(Memcached::OPT_BINARY_PROTOCOL, true);
$memc->addServer(“be6b6b8221cc11e4mcnhzalicm10pub001ocsaliyuncscom”, 11211);
$memc->setSaslAuthData(“your_ocs_name”, “your_ocs_password”);
echo $memc->get(“memcsesskey ttrct9coa2q62r2sodlq4qf376″);
/注意这里的key是有前缀的,由phpini中memcachedsess_prefix字段决定,默认值为“memcsesskey”。然后再拼接上面打出来的sessionid“ttrct9coa2q62r2sodlq4qf376”即可。/
>
该代码输出如下:
ocs_key|s:13:”session_value”;
即PHP SESSION已经成功写入OCS。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)