Memcache

本文介绍了Memcached作为高性能分布式缓存系统的原理及应用场景,并详细解释了如何在Linux环境下安装配置Memcached及其PHP扩展,同时提供了基本命令用法示例。

Memcache

Memcache是什么

高性能分布式的key->value内存对象缓存系统 动态web应用 缓解数据库的压力 在内存中缓存数据和对象读数据库的次数

在内存中 它维护一个巨大的hash表 可以存各种格式的数据 图像 视频 文件 数据库检索结果 从内存中读取速度很快

Memcache 和 Memcached区别

memcache 是项目的名称 Memcached 服务端主程序的文件名

memcached

memcache 使用场景

  • 频繁访问的数据 比如头条新闻
  • 大量的hot 数据
  • 页面缓存
  • 频繁的查询条件 和结果
  • 临时的数据

安装 memcache

yum -y install libevent libevent-devel   

准备 安装包

libmemcached-1.0.18.tar.gz memcached-1.4.33.tar.gz php-memcached-php7.zip

tar -zxvf  memcached-1.4.33.tar.gz
cd  memcached-1.4.33
./configure --prefix=/usr/local/memcached/ --enable-64bit  #支持64位  
make   #时钟错误    date -s 20190705 +11:50
make install 

cd 
cd libmemcached-1.0.18
./configure --prefix=/usr/local/libmemcached/  --with-memcached-dir=/usr/local/memcached 
make  
make install

cd php-memcached-php7
phpize  #安装PHP扩展靠这个来解压  /usr/local/php7/bin/phpize
./configure --with-php-config=/usr/local/php7/bin/php-config --with-libmemcached-dir=/usr/local/libmemcached/ --disable-memcached-sasl 

make  

make install 

cd /usr/local/memcached/bin
./memcached -u www -d
telnet 127.0.0.1 11211
也可以把它加入到开机启动
cd /etc/rc.d 
vim rc.local
./usr/local/memcached/bin/memcached -u www -d
然后重启虚拟机


vim /etc/php.ini 
extension_dir =/usr/local/php7/lib/php/extensions/no-debug-non-zts-20151012/
extension memecache.so;

重启 php-fpm
开启memcache  ./memcached -u www -d
telnet 127.0.0.1 11211

memcached 特点

  • 单个key 最大的长度 是 memcached.h 设置 KEY_MAX_LENGTH

  • 早前版本通常单个key 是 1M 新版本 2M

  • 数据保存在 内存中 断电数据消失

memcache set 命令 将 value的值 存放到指定的key中

set name 0 10 8 

set key flags exptime bytes   如果存在 更新原有的  

key name  键的名字  
falgs 0 键值额外的东西 
exptime 10 过期时间  秒为单位   
bytes 8  长度  
STORED 保存成功后输出
NOT_STORED 保存失败 退出  
ERROR 出错 比如语法错误  
----------------------------------------------
get key  获取在key 中的value值    如果key不存在  返回  null 
可以 get key1 key2 key3   

----------------------------------------------
add key flags exptime bytes  将value的值添加到制定的 key 中  如果存在  则不更新  
key name  键的名字  
falgs 0 键值额外的东西 
exptime 过期时间  秒为单位   
bytes  长度  
----------------------------------------------
delete name 删除已经存在的key 

-----------------------------
replace   key flags exptime bytes # 替换的是 key中的value值  而不是 key 
set name 0 100 5
hello   

replace name 0 100 6
hellos

get name
获取的是 hellos  

----------------------------------------

set name 0 100 6
asdfgh
STORED
get name 
VALUE name 0 6
asdfgh
END
append name 0 200 5key中 追加  value的值  追加到尾部   
hello
STORED
get name
VALUE name 0 11
asdfghhello
END
--------------------------------
incr keyname 数字  自增多少    decr keyname  自减多少     

set numer 0 100 2
10 

get number  

10 

incr number 5 

get number 15  

decr number 5 


get number 

10 

session共享 主要解决负责均衡 session 不一样 存放到 memcached 中

vim /etc/php.ini

session.save_handler = memcached;

session.save_path = “127.0.0.1:11211,10.0.164.161:11211”;存放地址

$mem = new Memcached();
$mem->addServer('127.0.0.1','11211');
$mem->set('test',['l'=>'longlong','le'=>'乐天']);
$mem->get('test')




memcached在php程序中的实现
<?php
    $list = memcached_get('list');
    if (!$list) {
        echo 'this is from mysql';
        $list = article_list();
        memcached_set('list',$list,time()+3600);
    } else {
        echo 'this is from memcached';
    }
    echo '<ul>';
        foreach ($list as $v) {
            echo '<li><a href="#">' . $v['title'] . '</a></li>';
        }
    echo '</ul>';
    function article_list()
    {
        $link = mysqli_connect('127.0.0.1','root','123456');
        mysqli_select_db($link,'chen');
        mysqli_set_charset($link,'utf8');
        $res = mysqli_query($link,'select * from article');
        $arr = [];
        while ($row = mysqli_fetch_assoc($res)) {
            $arr[] = $row;
        }
        return $arr;
    }
    function memcached_set($key,$value,$expire = null)
    {
        $mem = new Memcached();
        $mem->addServer('127.0.0.1','11211');
        if ($expire == null) {
            return $mem->set($key,$value);
        } else {
            return $mem->set($key,$value,$expire);
        } 
    }
    function memcached_get($key)
    {
        $mem = new Memcached();
        $mem->addServer('127.0.0.1','11211');
        return $mem->get($key);
    }
?>

Memcached::addSevers()

<think>好的,我现在需要向用户介绍Memcache。首先,我应该回忆一下Memcache的基本概念和主要用途。Memcache是一个分布式内存缓存系统,对吧?它主要用于减轻数据库负载,通过缓存数据来提升应用性能。接下来,我需要确定用户可能关心的几个方面,比如工作原理、主要特性、使用场景、优缺点以及和类似技术的比较。 用户可能想知道Memcache是如何工作的。这时候我需要解释它基于键值存储,数据存储在内存中,所以访问速度很快。另外,分布式特性也很重要,Memcache可以在多台服务器上运行,客户端通过一致性哈希来选择节点。不过,这里可能需要详细说明一下一致性哈希的作用,避免用户不理解。 然后,主要特性方面,内存存储、键值对结构、分布式、LRU淘汰策略都是关键点。需要简单解释每个特性的作用和好处。例如,LRU策略用于在内存不足时自动移除最久未使用的数据,保持缓存的有效性。 使用场景部分,用户可能想知道什么时候应该使用Memcache。常见的场景包括数据库查询缓存、会话存储、API调用缓存和页面片段缓存。每个场景都需要一个例子,比如缓存频繁查询的数据库结果,减少数据库压力。 优缺点方面,优点包括高速访问、扩展性好、简单易用;缺点则是数据易失性、不支持复杂查询、容量受限。这里需要平衡说明,让用户了解在什么情况下适合使用Memcache,什么情况下可能需要其他解决方案。 可能用户还会想知道Memcache和Redis的区别,但用户没有直接问,不过作为补充说明可以提到,比如Redis支持持久化和更多数据结构,而Memcache更简单,适合纯缓存需求。但根据系统指令,用户不可见层要求只回答用户的问题,可能需要避免扩展太多,除非必要。 接下来需要确保使用正确的格式,行内数学表达式用$...$,比如提到内存容量时,如果有涉及数值可能需要,但可能这里不太需要。不过根据示例,用户提到了变量和方程的例子,可能这里不太适用,但要注意如果有数学相关内容的话要正确应用格式。 结构方面,需要分点清晰,使用标题和子标题,但根据Markdown格式,用户希望的是结构清晰,但实际输出可能需要避免使用Markdown,所以可能需要用文字描述结构,比如用数字和项目符号。不过根据用户提供的示例回答,是使用了加粗和分点,但可能不需要Markdown语法,而是自然语言的结构。 另外,需要检查LaTeX语法是否正确,虽然Memcache的介绍可能不涉及太多数学公式,但如果提到性能指标或算法名称,可能需要确认。例如,LRU算法可以提到,但不需要用公式,除非特别说明。 最后,确保用中文回答,语言简洁明了,逐步解释,帮助用户理解Memcache的各个方面。需要避免技术术语过于复杂,必要时进行解释,比如“一致性哈希”可能需要简单说明其作用,如帮助数据分布和节点增减时的最小数据迁移。 总结,回答的结构应该是:概述、工作原理、主要特性、使用场景、优缺点,最后可能有个小结。每个部分分点说明,使用例子帮助理解,同时确保符合系统级指令的格式要求,没有使用任何Markdown,行内公式正确应用(如果有的话),独立公式单独成段(但可能这里不需要)。检查语法和正确性,确保信息准确无误。</think>Memcache 是一种高性能的分布式内存缓存系统,主要用于通过缓存数据来减轻数据库负载、提升应用响应速度。以下是其核心内容的逐步解析: --- ### 1. **基本概念** - **定位**:Memcache 专为缓存设计,将数据存储在内存中,通过键值对(Key-Value)形式提供快速访问。 - **分布式特性**:支持多服务器节点组成的集群,数据分布通过**一致性哈希算法**实现(例如:节点增减时仅影响部分数据)。 --- ### 2. **工作原理** - **数据存储**:应用程序将查询结果或计算数据存入 Memcache,键名(Key)需唯一,值(Value)可以是字符串、对象等。 - **数据读取**:请求优先访问 Memcache,若命中(存在数据)则直接返回;若未命中(无数据),则从数据库读取并回填缓存。 - **内存管理**:采用 **LRU(Least Recently Used)算法** 自动淘汰最久未使用的数据,释放内存空间。 --- ### 3. **主要特性** - **高速访问**:内存操作使得读写延迟极低(通常为毫秒级)。 - **横向扩展**:可通过增加节点提升容量与吞吐量。 - **协议简单**:基于文本或二进制的协议(如 `memcached protocol`),易于集成。 - **无持久化**:数据仅存于内存,重启或崩溃后丢失。 --- ### 4. **典型使用场景** - **数据库查询缓存**:缓存频繁访问的 SQL 查询结果(例如:商品信息)。 - **会话存储**:存储用户登录状态(Session),替代传统文件或数据库存储。 - **API 响应缓存**:缓存第三方 API 结果(例如:天气数据),避免重复调用。 - **页面片段缓存**:缓存网页局部内容(例如:导航栏),加速页面渲染。 --- ### 5. **优缺点分析** #### **优点** - 显著降低数据库压力,提升吞吐量。 - 分布式架构易于扩展。 - 轻量级,部署和维护成本低。 #### **缺点** - 数据易失性:不适用于需持久化的场景。 - 功能单一:仅支持键值操作,不支持复杂查询或事务。 - 容量限制:受内存大小制约,需合理规划淘汰策略。 --- ### 6. **与 Redis 的对比** - **Memcache**:专注纯缓存场景,多线程模型性能高,但仅支持字符串类型。 - **Redis**:支持持久化、更多数据结构(如列表、哈希),适合需复杂操作的场景。 --- ### 7. **示例代码(伪代码)** ```python # 连接 Memcache 客户端 client = memcache.Client(['127.0.0.1:11211']) # 缓存数据(键:user_123,值:用户对象,过期时间:300秒) client.set('user_123', user_data, time=300) # 读取数据 user_data = client.get('user_123') if not user_data: user_data = db.query("SELECT * FROM users WHERE id=123") client.set('user_123', user_data, time=300) ``` --- ### 总结 Memcache 是解决高并发场景下数据库性能瓶颈的经典工具,适用于对速度要求高、允许数据临时性的场景。使用时需结合业务特点设计键名策略、过期时间和淘汰机制,以最大化缓存效率。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值