在一个高并发的web应用中,数据库存取瓶颈一直是个大问题,一旦达到某个极限,数据库很容易崩溃,但是如果我们把常用的数据放到内存中,在需要的时候从内存中取,不光读取速度快,而且节约数据库IO。

memcache简介

Memcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。简单的说就是将数据调用到内存中,然后从内存中读取,从而大大提高读取速度。

memcache的mem是内存(memory),cache是缓存,结合是内存缓存的意思。我们应用memcache时,读取数据先从memcache内读取,若查找不到再去数据库里查找,并将数据存入memcache,待下次查找时便能轻易找到。

需要注意:

memcache是内存型的数据库 ,因为内存的关闭释放的特性,memcache也无法持久化存储内容;

memcache内部是分块存储,所以大于1M的数据也无法存储。

memcache依赖libevent库,安装前需确认已经安装了libevent库。

memcache是一个轻量级的内存型数据库,只支持key-value型的存储。

memcache中没有关于用户,密码的设置,所以在配置时要配置防火墙的端口限制连接,以达到安全的目的。

使用repcached也能轻易实现memcache的单master单slave主从复制。

memcache的应用场景

存储大量不需要持久存储或数据库内已存在不会变动的数据。

读取数据非常频繁数据,要求小于1M。

数据类型简单的key-value型数据。

计算好的结果和渲染后的网页模板文件。

因其原子递增性,可以用来计数。

因为可以设置数据过期时间的特性,存储期限数据。不过需要注意,memcache会在分配的内存不足时以最近最少使用原则(LRU)重用内存,可能会导致信息提前被删除。

用memcache存储session信息,以达到多服务器session共享。需要配置:php.ini:

session.save_handler = memcache //设置session的储存方式为memcache

memcache.hash_strategy = "consistent"//设置memcache的hash算法为一致性哈希算法。

session.save_path = "tcp:/ip:port" //设置session储存的位置,多台memcache用逗号隔开。

memcache服务器的安装

memcache的安装简单,服务器可以在其官网http://www.memcached.org/下载,解压后在其目录下运行./configure -prefix=/path编译,然后make / make test / make install 得到可以直接执行的二进制文件。

使用./memcached命令即可开启服务器,其常用参数如下:

-p port 监听端口 (默认: 11211)

-d 以后台方式运行Memcached

-u username 运行Memcached的账户

-m n 最大的内存使用, 单位是MB,默认 64 MB

-c connections 最大连接数量, 默认是 1024

memcache的常用命令

用memcache客户端或telnet连接到memcache后,就可以对memcache进行操作了。

memcache数据结构简单,所以命令行命令也很少,下面以一条常用命令来简析一下命令格式:

add key flags expire_time length \r\n value

flags:是否压缩/序列化,通常为0。

expire_time:从存储后多久过期。以秒(s)为单位,最大为30天的长度,超过30天的长度被视为时间戳表示"到什么时候过期",若设为0表示永不过期。

length:value长度,输入长度回车之后,命令行会读取你接下来输入的length个字符。

set key flags expire_time length //如果有值则覆盖原值,没有则新增,add在有值时会存储失败

get key //获取key的值

replace key flags expire_time length// 替换一个已存在的key

append/preappend key flags expire_time length// 给key的value后面/前面添加新内容。

preappend key flags expire_time length // 给key的value前面添加新内容。

inc/dec key [n] //key的值递增/递减1/[n]

delete key //删除一个key

flush_all [n] //[在n秒后]删除全部数据

stats [options] //获取memcache[有关某一项]的详细信息

PHP的memcache扩展及应用

在https://pecl.php.net/index.php搜索获取到所需的memcache扩展包。

linux系统,直接挑选版本(推荐最新stable稳定版)下载,解压后在解压目录下用phpize工具产生configure文件,并用它安装,安装完成后在/php.ini中添加extension。具体可看我的博文linux下的PHP中的最后一节。

windows下要点击链接右边的“windows logo DLL”链接,并在新打开的页面中,按照版本、32位/64位、线程安全/非线程安全来选择自己所需要的扩展,具体选项可以在phpinfo();页面看到。下载完成后,将其放入phppath/ext/目录下,然后在php.ini中添加extension=php_memcacache.dll;重启服务器完成安装。

在phpinfo()页面中看到memcache扩展后,说明安装成功,我们就可以在php脚本中使用关于memcache的类函数库了。

在手册中我们可以找到许多关于php的memcache扩展的使用,以下是一个典型的memcache使用流程。

$m=new Memcache();

$m->connect($host,$port);

$m->add($key,$value[,flags,$expire_time]);

$content=$m->get($key);

$m->close();

这是一个简单的memcache连接程序,在进行memcache分布式存储时,还需要用到$memcache->addServer()向memcache集群中添加服务器。

此外,还有get(),set(),flush(),delete()等方法,用法都大同小异,在手册上也能找得到,而且十分清晰。说到手册,推荐一个我正在用的,很不错。地址:http://pan.baidu.com/s/1mgCkvIo

如果您觉得本博文对您有帮助,您可以推荐或关注我,如果您有什么问题,可以在下方留言讨论,谢谢。

memcache php mysql_PHP中的数据库二、memcache相关推荐

  1. memcache在项目中的应用

    一  安装memcache 具体流程这篇文章有写到: 点击 链接 二 在项目中应用memcache 为了减轻数据库的查询压力,所以我们把一些不经常变动的数据进行缓存,用户查询时,如果查询的要求是一样的 ...

  2. 如何在PHP中保护数据库密码?

    当PHP应用程序建立数据库连接时,通常当然需要传递登录名和密码. 如果我为我的应用程序使用单个最小权限登录名,则PHP需要在某个地方知道该登录名和密码. 保护该密码的最佳方法是什么? 似乎只在PHP代 ...

  3. java父子表_数据库二维表转父子关系,java,stream,list

    需求描述:把数据库中的省市二维表,查询到内存中后,转换为父子层级关系.通过jdk8中的stream方式实现. 数据关系: 320004    福建省    320507    南平市 430000   ...

  4. android中的数据库操作(SQLite)

    android中的数据库操作 android中的应用开发很难避免不去使用数据库,这次就和大家聊聊android中的数据库操作. 一.android内的数据库的基础知识介绍 1.用了什么数据库   an ...

  5. listview显示mysql数据_C#在listview控件中显示数据库数据

    一.了解listview控件的属性 view:设置为details columns:设置列 items:设置行 1.将listview的view设置为details 2.设置列属性 点击添加,添加一列 ...

  6. linux下数据库mysql命令大全_linux中mysql数据库操作命令大全有哪些

    Linux中经常会对数据库进行操作,除了在软件应用中操作,还能使用命令实现,具体有哪些命令呢?下面由学习啦小编为大家整理了linux重启mysql数据库命令的相关知识,希望对大家有帮助! linux中 ...

  7. python用另一个字段替代本字段的null_Python中的数据库

    数据库和Python 持久化存储 在任何应用中,都需要持久化存储,一般有三种基础的存储机制,文件,数据库系统,以及一些混合类型,一种是使用普通文件或者python特定文件进行访问,另一种是使用数据库管 ...

  8. C#中往数据库插入/更新时候关于NUll空值的处理

    本文转载:http://blog.csdn.net/chybaby/article/details/2338943 今天碰到个问题..SqlCommand对传送的参数中如果字段的值是NULL具然不进行 ...

  9. Exchange中的数据库文件

                                  Exchange中的数据库文件 Exchange中的数据库文件是edb文件.stm文件和众多的log文件组成.其中以edb结尾的文件是数据库 ...

最新文章

  1. Python基础10-函数基础
  2. windows 命令行cmd安装python matplotlib模块后pycharm显示“ModuleNotFoundError: No module named ‘matplotlib‘解决方法
  3. 红帽集群套件RHCS四部曲(维护篇)
  4. 【控制】《多无人机协同控制技术》周伟老师-第1章-无人机协同控制技术概述
  5. mfc exe 在繁体系统 乱码_MC32/MC92 自带TelnetCE界面部分字符乱码解决方案
  6. 单片机控制两个步进电机画圆_51单片机控制两个步进电机
  7. 《C++ Primer》14.4节练习(部分)
  8. 基于深度学习的场景分割算法研究综述
  9. java 程序语言中的LinkedList 集合基本方法演示
  10. mysql客户端重庆_MySQL:MySQL工具以及5.7mysqlbinlog|mysql速度极慢问题
  11. python小白从哪来开始-python入门小白的困惑,怎么入门python?
  12. 搜索很久_装了SSD你还需要这个软件才更快,搜索查找文件数据从此不再等待
  13. Flutter 常见问题总结
  14. 327.区间和的个数
  15. 如何用python处理图片_用Python简单处理图片
  16. 嵌入式linux系统移植的四大步骤_基于ARM的Linux系统移植的方法
  17. android抓trace工具,Android性能优化工具之TraceView
  18. oracle查看密码期限,oracle永久密码和登陆次数无限制设置
  19. c语言P0=0x是什么意思,0x80(单片机0x80什么意思)
  20. 【阿里聚安全·移动安全周刊】移动裸奔时代,手机已成为隐私的监视器

热门文章

  1. UITextView添加占位字符
  2. deepLink iOS 应用到自己APP 记录
  3. iOS开发系列--让你的应用“动”起来
  4. Pycharm开发环境设置与熟悉。
  5. 聚焦OA品牌:OA产品影响力是选型关键
  6. 我国网络安全人才培养缺口巨大
  7. ceph存储引擎bluestore解析
  8. VDI序曲二十一 APP-V 4.6 SP1服务器端部署
  9. 不错的工具:Reflector for .NET
  10. ubuntu14.04 升级gcc的方法