前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >memcache学习笔记

memcache学习笔记

原创
作者头像
CS逍遥剑仙
发布2018-10-11 15:41:28
1.3K0
发布2018-10-11 15:41:28
举报
文章被收录于专栏:禅林阆苑禅林阆苑

memcache学习笔记

Write By CS逍遥剑仙

我的主页: www.csxiaoyao.com

GitHub: github.com/csxiaoyaojianxian

Email: sunjianfeng@csxiaoyao.com

QQ: 1724338257

1. 安装与连接

代码语言:txt
复制
$ brew search memcache

返回结果如下,memcached是服务器,libmemcached是客户端

代码语言:txt
复制
libmemcached    memcache-top    memcached   memcacheq

进行安装

代码语言:txt
复制
# 先装服务器
$ brew install memcached
# 查看安装结果
$ which memcached  # /usr/local/bin/memcached
$ memcached -h
# 安装libmemcached客户端
$ brew install libmemcached

启动服务

代码语言:txt
复制
# 启动服务器 /usr/local/bin/memcached -d
# 以守护程序形式启动(-d),分配1GB内存(-m 1024),指定监听localhost,端口2048
$ /usr/local/bin/memcached -d -m 1024 -l localhost -p 2048
# 客户端访问
$ brew install telnet
$ telnet localhost 2048

2. 设置与删除数据

(1) 添加数据

语法:add key 是否压缩(0|1) 缓存时间(s) 数据长度(byte)

缓存周期问题

缓存周期两种设置方式:

(1) 时间间隔(s),不能超过2592000秒(30天) (2) 到期时间戳,必须大于当前时间戳才有效

注意:如果缓存周期值设置为0表明此数据永不过期

注意:add时如果键已存在,则添加失败,不会覆盖

代码语言:txt
复制
> add name 0 60 9
> csxiaoyao
> get name

(2) 修改数据

语法:replace key 0|1 缓存时间 数据长度

注意:replace时如果键不存在,则修改失败

代码语言:txt
复制
> replace name 0 120 8
> sunshine
> get name

(3) 设置数据

语法:set key 0|1 缓存时间 数据长度

注意:如果键已存在,则修改,如果键不存在,则添加

代码语言:txt
复制
> set name 0 120 8
> sunshine
> get name

(4) 删除数据

语法:delete key

语法:flush_all 删除所有缓存项

代码语言:txt
复制
> delete name
> get name
> flush_all

3. 其他指令(incr、decr、stats)

(1) incr 增加值

语法:incr key number

代码语言:txt
复制

set num 0 120 2 90 incr num 10 get num

(2) decr 减少值

代码语言:txt
复制
> decr num 10
> get num

(3) stats 状态

代码语言:txt
复制
> stats
...
STAT cmd_get 11					# 执行获取缓存项次数
STAT cmd_set 11					# 执行设置缓存项次数
STAT get_hits 5					# 命中率 = get_hits / cmd_get
STAT curr_items 0				# 当前存在的缓存项个数
STAT total_items 8				# 从启动到现在总共设置的缓存项个数,包括过期的
...

4. php操作memcached

4.1 macos安装php扩展

php作为客户端操作memcached需要安装PHP的memcache扩展

下载稳定版的memcache包,http://pecl.php.net/package/memcache

代码语言:txt
复制
$ tar -xzf memcache-2.2.7.tgz
$ cd memcache-2.2.7
$ phpize
$ ./configure --enable-memcache --with-php-config=/usr/local/opt/php54/bin/php-config --with-zlib-dir
$ make & make install 

编辑php.ini文件,加入扩展

代码语言:txt
复制
$ extension = memcache.so

重启php-fpm 和nginx

代码语言:txt
复制
$ killall php-fpm



$ /usr/local/opt/php54/sbin/php-fpm -D
$ nginx -s reload

4.2 数据操作

代码语言:txt
复制
$memcache = new Memcache();
$memcache->connect('localhost','2048');
$memcache->add(键, 值, 是否压缩, 有效期);
$memcache->replace(键, 值, 是否压缩, 有效期);
$memcache->set(键, 值, 是否压缩, 有效期);
$memcache->increment(键, 步长);
$memcache->decrement(键, 步长);
$memcache->get(key);
$memcache->delete(key);
$memcache->flush(void);
$memcache->close();

4.3 应用

存储sql查询结果

注意:sql语句执行的结果数据要小于1MB,且键的长度要小于250字节,数据值的大小要小于1MB

5. 数据类型

数据类型分为标量和非标量两大类

标量:内容转换成字符串进行存储

代码语言:txt
复制
$mem->set('string','csxiaoyao',0,120); // "csxiaoyao"
$mem->set('int',100,0,120); // "100"
$mem->set('float',100.100,0,120); // "100.1"
$mem->set('bool1',true,0,120); // "1"
$mem->set('bool2',false,0,120); // ""

非标量:序列化后存储到memcached服务器中,保存数据原有类型,获取数据时,再反序列化。序列化与反序列化在memcached客户端的set和get方法中完成,用户无需手动序列化

注意:资源类型不能被合理序列化

代码语言:txt
复制
class Dog{}
$dog1 = new Dog();
$dog1->name = 'liuliu';
$res = fopen('./test.php','r');

$mem->set('array',array(1,2,'one'),0,120); // 返回数组
$mem->set('obj',$dog1,0,120); // 返回对象
$mem->set('res',$res,0,120); // int(0)
$mem->set('null',null,0,120); // NULL

is_scalar() 可以判断是否是标量类型

6. 分布式缓存服务的搭建

6.1 概述

分布式的memcached集群能够提高性能,而寻址的分布式算法则由memcache客户端实现(php提供的memcached扩展),利用key确定当前数据的目标操作服务器。

6.2 搭建方法

使用$memcache->addServer()方法添加多台memcached服务器

代码语言:txt
复制
$memcache = new Memcache();
$memcache->connect('localhost','1024');
$memcache->connect('localhost','2048');
$memcache->set(键, 值, 是否压缩, 有效期);
var_dump($memcache->get(键));
$memcache->close();

7. session数据使用memcache

分布式服务器进行负载均衡,导致各台服务器的session零散,不利于用户登录等操作。可以通过配置将session存储到memcache中解决上述问题。

代码语言:txt
复制
; 配置php.ini中session文件的存储方式
; session.save_handler = files
session.save_handler = memcache
; 配置session文件的存储路径,多个用逗号隔开
session.save_path = "tcp://127.0.0.1:1024"

具体的逻辑代码常规使用session即可。

代码语言:txt
复制
// 注意:可以使用ini_set()函数设置,仅在当前页面有效
ini_set('session.save_handler','memcache');
ini_set('session.save_path','tcp://127.0.0.1:1024');

session_start();
$_SESSION['name'] = 'csxiaoyao';
echo session_id();

session信息存储到memcache以sessionid为键,失效时间与session相同。

8. 其他问题

8.1 memcache适合于存储的数据类型

(1) 安全性要求不高、允许丢失的数据,因为memcache服务器重启或关机会丢失所有数据

(2) 查询频繁、改动周期长的数据,如热点新闻等

(3) 键值数据量不大(小于1MB的数据)

8.2 安全完整性问题

memcache本身不提供认证机制,如果需要限制请求连接,需要通过防火墙等在操作系统上进行限制。常规的memcached服务器部署在内网环境。

8.3 缓存失效问题

memcached内部不会监视记录是否过期,而是在get时查看记录的时间戳,检查记录是否过

期,因此不会在过期监视上耗费CPU时间,这种技术被称为lazy expiration。

8.4 缓存已满,删除旧数据

算法:LRU,least Recently Used,最近最少使用算法

memcache在插入新数据时,空间不足会删除最不活跃的缓存项。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • memcache学习笔记
    • 1. 安装与连接
      • 2. 设置与删除数据
        • 3. 其他指令(incr、decr、stats)
          • 4. php操作memcached
            • 4.1 macos安装php扩展
            • 4.2 数据操作
            • 4.3 应用
          • 5. 数据类型
            • 6. 分布式缓存服务的搭建
              • 6.1 概述
              • 6.2 搭建方法
            • 7. session数据使用memcache
              • 8. 其他问题
                • 8.1 memcache适合于存储的数据类型
                • 8.2 安全完整性问题
                • 8.3 缓存失效问题
                • 8.4 缓存已满,删除旧数据
            相关产品与服务
            负载均衡
            负载均衡(Cloud Load Balancer,CLB)提供安全快捷的流量分发服务,访问流量经由 CLB 可以自动分配到云中的多台后端服务器上,扩展系统的服务能力并消除单点故障。负载均衡支持亿级连接和千万级并发,可轻松应对大流量访问,满足业务需求。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档