php分布式缓存系统 Memcached 入门

     Memcached 是一个分布式的缓存系统, 但是 Memcachd 到底是什么意思,有什么作用呢?缓存一般用来保存一些经常被存取的数据和资源(例如:浏览器会将访问过的网页会话缓存起来),因为通过缓存来存取数据要比从磁盘存取同样的数据要快得多。所以 Memcached 顾名思义,意味着 “内存缓存”,所有缓存的内容都在服务器的内存中。内存中的这些缓存数据可以通过 API 的方式被存取。数据是以 key/value 的配对方式存在的,就像一像大的 Hash 表。

    分布式是 Memcached 的主要特性,所以你可以在多台服务器上来安装 Memcached 来组建一个更大的缓存服务器。这样一来,Memcached 可以帮助我们使数据库的压力降到最低, 从而我们可以构建出更快的、更具扩展性的 WEB 应用。图一展示了 Memcache 如何与数据库端协同工作的情况。

Memcache 如何工作?

图一展示的流程,相信有开发过数据库应用的同学都不会陌生。我们来一步步的说明图中发生了什么事情:

  1. 检查用户请求的数据是缓存中是否有存在,如果有存在的话,只需要直接把请求的数据返回,这时候跟数据库就完全扯不上关系了。
  2. 如果请求的数据在缓存中找不到,这时候再去查询数据库。返回请求数据的同时,把数据存储到缓存中一份。
  3. 保持缓存的“新鲜性”,每当数据发生变化的时候(比如,数据有被修改,或被删除的情况下),要同步的更新缓存信息,确保用户不会在缓存取到旧的数据。

显而易见,Memcached 在高并发的数据查询和海量数据输出的情况下,可以起到很大的作用。因为访问 Memcached 中的内存数据,要比数据库的磁盘数据快的多。

如何安装 Memcache?

如果你想在自己的服务器上尝试使用 Memcached,第一步就是要在你的服务器上安装 Memcached 的相关组件。好在Memcached 在很多服务器的发行版软件上都已经被预安装了。你可以通过在 Shell 下执行下面的命令,来检查你的服务器上有没有被预安装了 Memcached:

memcached -h

如果 Memcached 有被安装过,上面的命令会输出已经安装的版本号信息及一些帮助信息,否则则会返回一个错误。

下面以 CentOs 发行版为例,简单介绍一下如何安装 Memcached。

yum install memcached 上面的命令会在线搜索并安装最新的 Memcached 包。

Memcache 在什么情况下被使用,什么情况下不要使用?

 

你在何时应该使用 Memcache,又要在何时避免使用它?现在你已经知道了,Memcahced 是被设计为减轻数据库端压力的。但是你最好能制定一个良好的策略,来想办法让 Memcached 来尽可能的缓存那些最影响性能的查询。你可以试着为应用中的所有查询做一些执行时间日志,可以帮助你来分析哪些内容是要重点被缓存的。

现在假设你正在运营一个电子商务网站。 你可以在 Memcached 中缓存产品的简介、运送信息,或者其它一些需要复杂查询的数据,等等。当一个产品页被加载的时候,上面提到的数据将会跳过数据库查询,直接从缓存中取得。 缓存可以大大的改变你的网站整体性能表现,你只需要记得在后台更新产品的时候,把这些缓存一并更新就行了。

还有一些情况下,缓存数据并不是一个好主意,比如在一个数据被频繁更新的时候,每一次数据的更新,我们都需要去同时更新缓存,缓存的命中率不高,会导致一些额外的性能牺牲。这种情况下,或许直接查数据库会更好一些。

Memcached 的安全性

 

如果你了解了 Memcached 的工作流程, 你可能已经注意到了,在访问缓存的过程中,没有任何权限控制的相关流程。如果你的数据不是非常重要的,你大可不必担心这方面的安全问题。如果你需要的话,以下几点可以协助你更完全的使用它:

  1. 使用唯一的 Key:因为在 Memcached 中的数据是以一个大的数组形式存在的,所以你应该使用唯一的 key。访问你的数据的唯一办法就是通过你保存数据时的 key,除此之外再没有其它可查询的办法。
  2. 保证你的 Memcached 器安全: 因为 Memcached 本身并没有身份验证机制,所以对 Memcached 的服务器查询,都应该通过防火墙进行。你可以在防火墙上设定规则,哪些服务器是允许被访问的,哪些是不允许被访问的。
  3. 加密你的数据: 你可以将数据和 Key 通过加密的方式保存在 Memcached 中。 这需要花费一些额外的 CPU 时间,但是为了你的数据安全,在情况允许的情况下,这个方法值得你去尝试。Memcached 代码实例

 

Memcached 代码实例

让我们来看一个实际的 PHP 例子。下面的代码展示了如何从缓存中取得数据,如果数据不存在,则自动从数据库中查询需要的数据,并将查询到的数据保存到缓存中的过程。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

<?php

   

class MyCache

{

  private $cache;

  function  __construct()

  {

    $this->cache = new Memcache();

    // you can replace localhost by Memcached server IP addr and port no.

    $this->cache->connect('localhost', 10987);

  }

   

  function get_data($key)

  {

    $data = $this->cache->get($key);

    if($data != null)

      return $data;

    else

    {

      if($this->cache->getResultCode() == Memcached::RES_NOTFOUND)

      {

        //do the databse query here and fetch data

        $this->cache->set($key,$data_returned_from_database);

      }

      else

      {

        error_log('No data for key '.$key);

      }

    }

  }

}

   

$cache = MyCache();

$cache->get_data('foo');

   

?>

 

要在你的网站使用上面的代码,请先确认你有安装 Memcached 的 PHP 扩展。你可以通过 PECL 来安装对应的开发包。

phper在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家需要的(点击→)我的官方群677079770

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值