zoukankan      html  css  js  c++  java
  • memcache 杂记


     它是一个一个高性能的分布式内存对象缓存系统。
     端口号 11211
     目前被许多网站使用以提升网站的访问速度,尤其对于一些大型的、
     需要频繁访问数据库的网站访问速度提升效果十分显著
     根据一个sql取出的数据,把sql取出的数据,给缓存到memcache里面,
     当下次再操作该sql语句的时候,则直接从memcache里面获取

    跟mysql比较一下
     
         它是一个c/s架构

        mysql的数据是存在磁盘的 memcache存在内存里

        mysql的数据存储是,由数据库,数据表,数据的记录,
        存储数据是按照表的结构进行存储的。

        memcache的数据存储格式是:keyalue的格式,来存储的,
        相当于在内存里面有一张两列的哈希表。类似于php的里面的关联数组

    memcache细节讨论

      1、缓存周期(有效期)
        缓存周期的设置有两种方式:
        如果缓存周期设置为0表明此数据永不过期

        第一种使用:秒数,最大不能超过30天,即2592000秒,

        第二种使用:使用时间戳,该时间戳是到的哪个时间点。比如我们要把一个数据缓存60天,
        $mem->add($key,$value,0,time()+60*24*3600)

     2、 惰性删除,
        就是说,缓存的数据,到期后,不会自动删除,当get数据的时候,查看有没有到期,如果到期了,则再删除该数据。
         memcache不会开启进程来监视键是否过期,省memcache的资源,也省cpu.

     3、Least Recently Used(LRU)
        最近 最少使用原则,

        当前存储的数据的在memcache里面空间已经占满后,则memcache会把不活跃(get或set次数比较少的)的数据(不管是否到期)清除,让新的数据给存储进来。

     4、安全性

        memcache定位就是做数据的缓存的,不是数据的持久存储的,因此没有做一些用户的验证,目的提高连接速度,发挥自己的独特功能。

        memcahe该软件本身没有提供一些安全机制,如果要限制使用,则只能在操作系统的层面来解决,比如window系统、安装防火墙的软件,在linux下面使用iptables,seclinux(安全机制)

     5、memcache比较适合于存储哪些数据。
        存储的数据的特点:
         访问比较频繁,
        安全性不高,丢失无所谓,
        修改比较频繁的数据,比如一些用户的在线状态。

    memcache实现原理

        1、访问数据的速度比传统的关系型数据库要快,因为Oracle、MySQL这些传统的关系型数据库为了保持数据的持久性,数据存放在硬盘中,IO操作速度慢

        2、memcache的数据存放在内存中同时意味着只要memcache重启了,数据就会消失

        3、既然memcache的数据存放在内存中,那么势必受到机器位数的限制,32位机器最多只能使用2GB的内存空间,64位机器可以认为没有上限

        4、memcache采用的内存分配方式是固定空间分配

            1、memcache将内存空间分为一组slab

            2、每个slab下又有若干个page,每个page默认是1M,如果一个slab占用100M内存的话,那么这个slab下应该有100个page

            3、每个page里面包含一组chunk,chunk是真正存放数据的地方,同一个slab里面的chunk的大小是固定的

            4、应该可以理解为什么memcache存放的value大小是限制的,因为一个新数据过来,slab会先以page为单位申请一块内存,申请的内存最多就只有1M,所以value大小自然不能大于1M了

            5、memcache的内存分配chunk里面会有内存浪费,88字节的value分配在128字节(紧接着大的用)的chunk中,就损失了30字节,但是这也避免了管理内存碎片的问题

            6、memcache的LRU算法不是针对全局的,是针对slab的


    总结memcache的特性和限制

        1、memcache中可以保存的item数据量是没有限制的,只要内存足够

        2、memcache单进程在32位机中最大使用内存为2G,64位机则没有限制。

        3、Key最大为250个字节,超过该长度无法存储

        4、单个item最大数据是1MB,超过1MB的数据不予存储

        5、memcache服务端是不安全的,比如已知某个memcache节点,可以直接telnet过去,并通过flush_all让已经存在的键值对立即失效//这个不太懂 抽时间实践

        6、不能够遍历memcache中所有的item,因为这个操作的速度相对缓慢且会阻塞其他的操作

        8、memcache设置添加某一个Key值的时候,传入expiry为0表示这个Key值永久有效,这个Key值也会在30天之后失效

            数据在内存中失效后,并不会立马被删除,只有在下次get时候,系统才会将其删除。
            memcache可以因此,被一些未被及时删除的数据占满空间。
            加之LRU淘汰机制,永久数据如果很少被访问的话,在内存空间被占满的情况下,再有新数据被缓存,则永久数据,就有可能被删除


    PHP的memcache客户端所有方法总结
     
     memcache::add

        添加一个值,如果已经存在,则返回false

     memcache::addServer

        添加一个可供使用的服务器地址

     memcache::close

        关闭一个memcache对象

     memcache::connect

        创建一个memcache对象
        
    memcache::decrement

        对保存的某个key中的值进行减法操作
     
     memcache::delete

        删除一个key值

     memcache::flush

        清除所有缓存的数据
        实际上没有释放资源,它仅仅将所有的缓存标记为过期,这样可以使新的缓存来覆盖被占的内存空间。

     memcache::get

        获取一个key值

     memcache::getExtendedStats

        获取进程池中所有进程的运行系统统计

     memcache::getServerStatus

        获取运行服务器的参数
        成功返回服务器状态,服务器没有启动会返回0,其他数字的时候表示服务器是启动状态的。

     memcache::getStats

        返回服务器的一些运行统计信息
     
     memcache::getVersion    

        返回运行的memcache的版本信息

     memcache::increment

        对保存的某个key中的值进行加法操作

     memcache::pconnect

        创建一个memcache的持久连接对象

     memcache::replace

        对一个已有的key进行覆写操作

     memcache::set
        添加一个值,如果已经存在,则覆写
     














  • 相关阅读:
    学习shell脚本
    Python 3.3.2 round函数并非"四舍五入"
    Python 通过继承实现标准对象的子类
    Python 继承标准类时发生了什么
    Python 表示无穷大的数
    用Python最原始的函数模拟eval函数的浮点数运算功能(2)
    Python 函数参数*expression 之后为什么只能跟关键字参数
    RE模块疑问
    用Python最原始的函数模拟eval函数的浮点数运算功能
    Python 好用得让人发指的函数参数语法糖
  • 原文地址:https://www.cnblogs.com/lele925/p/7403084.html
Copyright © 2011-2022 走看看