关于memcached:Memcached-1512-移植指南openEuler-2003-LTS-SP1

Memcached 1.5.12 移植指南介绍简要介绍Memcached是LiveJournal旗下Danga Interactive公司以Brad Fitzpatric为首开发的一款高性能分布式内存对象缓存零碎,通过缓存数据库查问后果,缩小数据库拜访次数,来进步动静Web利用的访问速度、进步可扩展性。 Memcached的官网链接:https://memcached.org/ 开发语言:C 一句话形容:分布式内存对象缓存零碎 环境要求硬件要求硬件要求如下表所示。 我的项目阐明服务器TaiShan 200服务器(型号2280)CPU鲲鹏920 5250处理器磁盘分区对磁盘分区无要求操作系统要求操作系统要求如下表所示。 我的项目版本openEuler20.03 LTS SP1 aarch64Kernel4.19查问以后零碎版本信息 cat /etc/os-release 装置openEuler操作系统,请参考https://openeuler.org/zh/docs... 阐明:装置形式倡议抉择“Server with GUI”装置形式。 配置编译环境编译Memcached须要筹备C编译器、GNU、make、automake、libevent和libevent-devel。 装置gcc,已装置则跳过 yum -y install gcc gcc-c++ kernel-devel 装置GNU make和automake、unzip、telnet,已装置则跳过 yum -y install make automake unzip telnet装置libevent和libevent-devel yum -y install libevent libevent-devel获取源码若您的服务器能够拜访网络,执行 wget https://github.com/memcached/... 命令下载源码。否则,请拜访 https://github.com/memcached/... 下载源码并复制到服务器“/home”目录。 编译和装置以本地下载源码并上传到服务器为例阐明编译和安装操作 解压源码包 cd /homeunzip 1.5.12.zip进入“memcached-1.5.12”目录 cd memcached-1.5.12配置Memcached sh autogen.sh./configure --prefix=/opt/memcached可在该步骤指定Memcached装置目录,例如本文指定装置在“/opt/memcached”目录下。 执行编译 make -j60-j60参数充分利用多核CPU劣势,放慢编译速度。 执行装置 make install进入指定的Memcached装置目录“/opt/memcached”,若生成的“bin”目录中呈现“memcached”可执行文件,阐明编译装置实现配置环境变量 a. 将以下命令增加至“/etc/profile”文件中 export PATH=/opt/memcached/bin/:$PATHb. 使环境变量失效 ...

November 7, 2022 · 1 min · jiezi

关于memcached:网络协议之memcached-binary-protocol详解

简介后面讲到了memcached的文本协定,尽管文本协定看起来非常简单,然而对于客户端来说个别还是会抉择效率更高的二进制协定。 二进制协定的实质和文本协定是一样的,只是他们的体现形式不同而已。本文将会具体介绍memcached中二进制协定的实现细节。 memcached的协定包对于memcached的申请包和响应包来说,除了申请头有所区别之外,其余的格局都是一样的。 所以对memcached的申请和响应都能够用同一个包的格局来示意: 后面的24个byte是包头局部,接下来的是命令行的额定数据extra,memcached中的key和value。 下面也提到了,申请包和响应包的区别就是header,上面是申请包头和响应包头的定义: 申请包头: 响应包头: 包头中各个字段的含意如下: Magic: 魔法数字,用来辨别包头是申请包头还是响应包头如果是申请,那么对应的Magic= 0x80,如果是响应,那么对应的Magic= 0x81。 在最后的设计中,Magic应该和协定的版本绝对应的,当版本升级之后,对应的Magic也要进行相应的调整。然而到目前为止,binary协定的magic值还没有变动过。 Opcode: 操作符,也就是对应的命令memcached协定中有上面这些操作符: 其中带星号的示意该命令未定,将来可能会有批改。 以Q结尾的命令,示意这个命令是一个quiet的版本,它会疏忽不感兴趣的返回数据。 Key length: key的长度Status: 申请响应response的状态response的值有上面几种: Extras length: command extras的长度Data type:保留字段data type是一个保留字段,目前只有一个固定的值:0x00。 vbucket id: 命令对应的virtual bucketTotal body length:extra + key + value的总长度Opaque: 申请生成的一个数据,会被一成不变在对应的响应中返回CAS:数据的一个惟一标记memcached命令举例为了更好的了解memcached的二进制协定,咱们以几个罕用的命令为例,来看一下memcached具体的申请和响应流程。 最罕用的就是get申请,用于向服务器端请某个key对应的值。 如果当初客户端要向服务器端get一个key=hello的数据,那么申请的包如下所示: 其中Magic=0x80, Opcode=0x00,Key length=0x0005,Total body=0x00000005,Key="Hello" 如果服务器端存在对应的key的值,那么将会返回如下的数据包: 咱们要留神上面几个跟request值不同的字段: 其中Magic=0x81示意这个是一个response, 因为这是一个response,所以对应的Key length=0x0000。 另外response中蕴含了get申请中并不存在的Extra length和Extras Flags,这里他们的值别离是0x04和0xdeadbeef,示意Extra length是4个bytes,它的值是0xdeadbeef。 那么这个Extras Flags值是哪里来的呢?如果比照之前讲到的text协定,就能够晓得,Extras Flags是在set key value的时候传入的,这个Flags会寄存到服务器端,并在get申请中返回。 最初,response中蕴含了要返回的值"World"。 如果服务器端并没有这个key的值,那么对应的返回包可能是这样的: ...

June 13, 2022 · 1 min · jiezi

关于memcached:网络协议之memcached-text-protocol详解

简介用过缓存零碎的必定都听过memcached的小名,memcached是一个十分优良的分布式内存缓存零碎,利用十分的宽泛。Memcached不仅仅是Web缓存,它更是一个通用的数据缓存,基本上你能够将任何货色存入memcached中,它的分布式设计具备很好的可扩展性和灵活性。 Memcached是一个客户端-服务器端的架构模式。一般来说,在服务器上搭建好Memcached的服务器端,接下来就能够应用Memcached的客户端和服务器端进行替换了。 作为客户端和服务器端的模型,两者的通信必定是有特定的协定的,实用于memcached的协定就叫做memcached protocol。 memcached的协定有两种,别离是text协定和binary协定。本文将会具体解说memcached text protocol的定义。 memcached protocol介绍memcached能够看做是一个简略的key-value的存储系统,客户端通过key来申请服务器端的数据,服务器端通过key的hash值来查找对应的数据,而后返回给客户端。 memcached中的key长度个别不能超过250个字符。key不能蕴含控制字符或空白字符。 为了保障客户端和服务器端的音讯通信顺畅,一般来说都会制订非凡的客户端和服务器端的通信协定,这个协定就叫做protocol。 什么是protocol呢?protocol听起来很浅近很神秘,然而实际上protocol就是约定好的单方交互的音讯格局。 对于memcached来说,memcached同时反对UDP和TCP协定,并且提供了两种协定形式,别离是“文本协定”和“二进制协定”。 其中文本协定是在第一个版本就反对的协定,而二进制协定是在v1.4之后才反对的。 文本协定和二进制协定都反对同样的命令,两者的惟一区别就是二进制协定具备更低的性能提早和更好的可扩展性,而文本协定的有点就是它的可调试性能更好。 memcached text协定蕴含两局部数据,文本行和非结构化数据。前者是来自客户端的命令或来自服务器的响应,后者代表客户端拜访的数据。命令以\r\n结尾,数据能够用\r、\n或\r\n,示意数据局部的完结。 memcached反对的命令memcached反对三种命令,别离是存储命令,读取命令和其余命令。 存储命令memcached中的存储命令总共有6个,别离是“set”、“add”、“replace”、“append”、"prepend" 和 "cas"。 首先,客户端发送如下所示的命令行: command key [flags] [exptime] length [noreply]另外cas命令的格局和其余几个不太一样: cas key [flags] [exptime] length [casunique] [noreply]下面的命令中,command代表的是命令的名字,也就是下面的“set”、“add”、“replace”、“append”和"prepend"。 set示意给key设置一个值。 Add示意如果key不存在的话,就增加。 replace用来替换已知key的value。 append示意将提供的值附加到现有key的value之后,是一个附加操作。 prepend将以后key对应的value增加到提供的值前面。 cas是一个原子操作,只有当casunique匹配的时候,才会设置对应的值。 flags是一个十分乏味的参数,这个参数对于memcached server来说是通明的,这个参数只是用来标记客户端命令的类型,并不会被服务器端辨认。另外flags的长度在不同的memcached版本中也有所不同,在memcached 1.2.0或者依据低级的版本中,flags是一个16-bit的整数。在memcached 1.2.1或以上的版本,flags是一个32-bit的整数。 exptime是过期工夫,0示意不会过期。 length是以byte示意的value的长度,这个值并不蕴含value中的结束符"\r\n"。 casunique是一个64-bit的现有entry的惟一值。 noreply通知服务器端,这是个不须要reply的命令。 在发送完命令行之后,客户端还须要发送数据块: <data block>\r\n举个例子,咱们想要将jack这个值设置到student这个key上,那么对应的命令应该如下所示: set student 0 0 4\r\njack\r\n对应的客户端收到的服务器端的返回可能有这些值: "STORED\r\n",示意存储胜利。"NOT_STORED\r\n" 示意数据因为某些谬误未存储胜利。这通常意味着不满足“add”或“replace”命令的条件。"EXISTS\r\n" 示意要设置的值在上次进行cas操作之后曾经被批改了。"NOT_FOUND\r\n" 示意要设置的值用在cas。读取命令memcached的读取命令有4个,别离是“get”、“gets”、“gat”和“gats,这些命令的格局如下: get <key>*\r\ngets <key>*\r\ngat <exptime> <key>*\r\ngats <exptime> <key>*\r\nmemcached中的读取命令前面不须要跟额定的数据块。 服务器端会依据接管到的key进行查问,每个key返回一条数据,格局如下: ...

May 30, 2022 · 1 min · jiezi

关于memcached:Memcached一键安装入门教程

Memcached一键装置入门教程Memcached 是一个自在开源的、高性能的分布式内存对象缓存零碎,用于动静Web利用以加重数据库负载。 Memcached是一套分布式的快取零碎,与redis类似,当初是Danga Interactive为了LiveJournal所倒退的,但被许多软件(如MediaWiki)所应用。这是一套凋谢源代码软件,以BSD license受权协定公布。Memcached的API应用32位元的循环冗余校验(CRC-32)计算键值后,将材料扩散在不同的机器上。当表格满了当前,接下来新增的材料会以LRU机制替换掉。因为Memcached通常只是当作快取零碎应用,所以应用Memcached的应用程式在写回较慢的零碎时(像是后端的数据库)须要额定的程式码更新Memcached内的材料。Memcached 的守护过程(daemon )是用C写的,然而客户端能够用任何语言来编写,并通过Memcached协定与守护过程通信。然而它并不提供冗余(例如,复制其hashmap条目);当某个服务器S进行运行或解体了,所有寄存在S上的键/值对都将失落。Memcached由Danga Interactive开发,其最新版本公布于2010年,作者为Anatoly Vorobey和Brad Fitzpatrick。用于晋升LiveJournal . com访问速度的。LJ每秒动静页面访问量几千次,用户700万。Memcached将数据库负载大幅度降低,更好的分配资源,更快速访问。上面咱们就来学习一下如何简略疾速的装置部署好Memcached服务。1.找到Memcached 的装置服务可点击试用。 2.装置部署,点击增加节点-抉择版本-填写参数-部署胜利 装置部署过程简略又疾速,具体的装置教程如下: 如何增加节点?https://www.bilibili.com/vide... 如何装置部署Memcached?https://www.bilibili.com/vide...

October 18, 2021 · 1 min · jiezi

关于memcached:如何安装部署Memcached

Memcached 是一个自在开源的、高性能的分布式内存对象缓存零碎,用于动静Web利用以加重数据库负载。 它是以LiveJournal旗下Danga Interactive公司的Brad Fitzpatric为首开发的一款软件。当初已成为mixi、hatena、Facebook、Vox、LiveJournal等泛滥服务中进步Web利用扩展性的重要因素。 Memcached是一种基于内存的key-value存储,用来存储小块的任意数据(字符串、对象)。这些数据能够是数据库调用、API调用或者是页面渲染的后果。通过在内存中缓存数据和对象来缩小读取数据库的次数,从而进步动静、数据库驱动网站的速度。 基于一个存储键/值对的hashmap。其守护过程(daemon )是用C写的,然而客户端能够用任何语言来编写,并通过Memcached 协定与守护过程通信。 Memcached简洁而弱小。它的简洁设计便于疾速开发,加重开发难度,解决了大数据量缓存的很多问题。它的API兼容大部分风行的开发语言。个别的应用目标是,通过缓存数据库查问后果,缩小数据库拜访次数,以进步动静Web利用的速度、进步可扩展性。 上面咱们就来学习一下如何简略疾速的装置部署好Memcached服务 1.找到Memcached 的装置服务可点击试用。 2.装置部署,点击增加节点-抉择版本-填写参数-部署胜利 装置部署过程简略又疾速,具体的装置教程如下: 如何增加节点?https://www.bilibili.com/vide... 如何装置部署Memcached?https://www.bilibili.com/vide...

August 23, 2021 · 1 min · jiezi

关于memcached:使用-Memcached-实现-Session-共享

应用 Memcached 实现 Session 共享 利用场景当有很多用户的时候,这些用户的登录地位在各个不同的服务器上,因为 session 是生成在服务器上的,当用户互访的时候,有的时候发现自己有权限,有时候发现自己没有权限。因为缓存是集中式的,所有的缓存都在一起,那么就能够把 session 放到 memcached 缓存中。所有服务器都能够在专用的服务器下面来取 session,这样无论用户在哪一台服务器下面登录,都有正确的 session。这样的话,有两个长处,第一,解决了 session 共享的问题。第二,当用户量很大的时候,session 是寄存在服务器下面的,因而就会减少了磁盘的 IO,然而如果放在缓存中,性质则齐全不一样。实现形式设置 php.ini 配置文件vim /etc/php/7.2/fpm/php.ini 将 seesion 存储形式改为 memcached默认 php 是以文件的模式寄存 session 的 1337 session.save_handler = files因而须要批改成 memcached session.save_handler = "memcached"批改 session 寄存地位默认 php 正文掉了 1366 ;session.save_path = "/var/lib/php/sessions"批改为 留神:192.168.174.128 是我虚拟机的 ip 地址,这里须要批改成你 memcached 服务器的 ip 地址# 对于 php 5.6 及以下,须要写成如下session.save_path = "tcp://192.168.174.128:11211"# 对于 php 7 以上能够间接写成session.save_path = "192.168.174.128:11211"如果只想单个 php 文件,取 session 的时候间接取缓存中取的话,能够如下设置vim test.php ...

July 19, 2021 · 1 min · jiezi

关于memcached:手电筒nrcan注册在线

NRcan涵盖产品范畴 涵盖简直所有含可充电电池的产品(多数产品可豁免,如:UPS,医疗类产品,电动汽车) 公布日期和失效日期 公布日期:2018-10-30 失效日期:2019-06-13 能效认证分为测试和注册两局部,具体步骤如下: 1.测试 执行测试方法可二选1 (1)CSAC381.2-17 (2)10C.F.R.AppendixY 2.测试实现后拿报告去网上注册 实现注册后即可打上NRcan标识,产品可进入加拿大市场。 深圳九方检测有限公司

March 10, 2021 · 1 min · jiezi

讲讲NoSQL比较火的三个数据库MemcachedRedisMongoDB

前言NoSQL,泛指非关系型的数据库。随着互联网不断的发展,传统的关系数据库在应付新互联网模式的网站,特别是超大规模和高并发的SNS类型的纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。而今天主要讲用得比较多的三个NoSQL:Memcached、Redis、MongoDB。 Memcached优点1.Memcached可以利用多核优势,单实例吞吐量极高,可以达到几十万QPS(取决于key、value的字节大小以及服务器硬件性能,日常环境中QPS高峰大约在4-6w左右)。适用于最大程度扛量。 2.支持直接配置为session handle。 缺点1.只支持简单的key/value数据结构,不像Redis可以支持丰富的数据类型。 2.无法进行持久化,数据不能备份,只能用于缓存使用,且重启后数据全部丢失。 3.无法进行数据同步,不能将MC中的数据迁移到其他MC实例中。 4.Memcached内存分配采用Slab Allocation机制管理内存,value大小分布差异较大时会造成内存利用率降低,并引发低利用率时依然出现踢出等问题。需要用户注重value设计。 Redis优点1.支持多种数据结构,如 string(字符串)、 list(双向链表)、dict(hash表)、set(集合)、zset(排序set)、hyperloglog(基数估算)。 2.支持持久化操作,可以进行aof及rdb数据持久化到磁盘,从而进行数据备份或数据恢复等操作,较好的防止数据丢失的手段。 3.支持通过Replication进行数据复制,通过master-slave机制,可以实时进行数据的同步复制,支持多级复制和增量复制,master-slave机制是Redis进行HA的重要手段。 4.单线程请求,所有命令串行执行,并发情况下不需要考虑数据一致性问题。 5.支持pub/sub消息订阅机制,可以用来进行消息订阅与通知。 6.支持简单的事务需求,但业界使用场景很少,并不成熟。 缺点1.Redis只能使用单线程,性能受限于CPU性能,故单实例CPU最高才可能达到5-6wQPS每秒(取决于数据结构,数据大小以及服务器硬件性能,日常环境中QPS高峰大约在1-2w左右)。 2.支持简单的事务需求,但业界使用场景很少,并不成熟,既是优点也是缺点。 3.Redis在string类型上会消耗较多内存,可以使用dict(hash表)压缩存储以降低内存耗用。 MongoDB优点1.更高的写负载,MongoDB拥有更高的插入速度。 2.处理很大的规模的单表,当数据表太大的时候可以很容易的分割表。 3.高可用性,设置M-S不仅方便而且很快,MongoDB还可以快速、安全及自动化的实现节点(数据中心)故障转移。 4.快速的查询,MongoDB支持二维空间索引,比如管道,因此可以快速及精确的从指定位置获取数据。MongoDB在启动后会将数据库中的数据以文件映射的方式加载到内存中。如果内存资源相当丰富的话,这将极大地提高数据库的查询速度。 5.非结构化数据的爆发增长,增加列在有些情况下可能锁定整个数据库,或者增加负载从而导致性能下降,由于MongoDB的弱数据结构模式,添加1个新字段不会对旧表格有任何影响,整个过程会非常快速。 缺点1.不支持事务。 2.MongoDB占用空间过大 。 3.MongoDB没有成熟的维护工具。 Memcached、Redis、MongoDB的区别1.性能三者的性能都比较高,总的来讲:Memcached和Redis差不多,要高于MongoDB。 2.便利性Memcached数据结构单一。 Redis丰富一些,数据操作方面,Redis更好一些,较少的网络IO次数。 MongoDB支持丰富的数据表达,索引,最类似关系型数据库,支持的查询语言非常丰富。 3.存储空间Memcached可以修改最大可用内存,采用LRU算法。 Redis在2.0版本后增加了自己的VM特性,突破物理内存的限制;可以对key value设置过期时间(类似memcached)。 MongoDB适合大数据量的存储,依赖操作系统VM做内存管理,吃内存也比较厉害,服务不要和别的服务在一起。 4.可用性Memcached本身没有数据冗余机制,也没必要;对于故障预防,采用依赖成熟的hash或者环状的算法,解决单点故障引起的抖动问题。 Redis,依赖客户端来实现分布式读写;主从复制时,每次从节点重新连接主节点都要依赖整个快照,无增量复制,因性能和效率问题,所以单点问题比较复杂;不支持自动sharding,需要依赖程序设定一致hash 机制。一种替代方案是,不用redis本身的复制机制,采用自己做主动复制(多份存储),或者改成增量复制的方式(需要自己实现),一致性问题和性能的权衡。 MongoDB支持master-slave,replicaset(内部采用paxos选举算法,自动故障恢复),auto sharding机制,对客户端屏蔽了故障转移和切分机制。 5.可靠性Memcached不支持,通常用在做缓存,提升性能。 Redis支持(快照、AOF):依赖快照进行持久化,aof增强了可靠性的同时,对性能有所影响。 MongoDB从1.8版本开始采用binlog方式支持持久化的可靠性。 6.一致性Memcached在并发场景下,用cas保证一致性。 Redis事务支持比较弱,只能保证事务中的每个操作连续执行。 MongoDB不支持事务。7.数据分析 MongoDB内置了数据分析的功能(mapreduce),其他两者不支持。 8.应用场景Memcached:用于在动态系统中减少数据库负载,提升性能;做缓存,提高性能(适合读多写少,对于数据量比较大,可以采用sharding)。 Redis:数据量较小的高性能操作和运算上。 MongoDB:主要解决海量数据的访问效率问题。 总结分析1.若是简单的存取key-value(主要是读)这样的数据用Memcached好一些。若是要支持数据持久化,量也不大,操作很频繁,多数据类型(如集合、散列之类的),用列表类型做队列之类的高级应用,就用Redis,但如果是数据量比较大时就采用MongoDB。 2.Memcached的很多客户端更加成熟稳定,Redis协议比Memcached复杂。Redis不可能比Memcached快?但是测试结果基本是Redis占绝对优势。 3.云数据库Memcached版实例中的数据是存储在内存中的,当出现宕机、机房断电等意外,或是云数据库Memcached版实例在正常升级维护时,内存中的数据均会丢失。因此,云数据库Memcached版不能作为持久化的数据存储服务使用。Redis的数据都存放在内存中,如果没有配置持久化,Redis重启后数据就全丢失了,于是需要开启Redis的持久化功能,将数据保存到磁盘上,当Redis重启后,可以从磁盘中恢复数据,实现持久化。 4.对于Redis和MongoDB来说,大家一般称之为Redis缓存、MongoDB数据库。Redis主要把数据存储在内存中,其“缓存”的性质远大于其“数据存储“的性质,其中数据的增删改查也只是像变量操作一样简单;MongoDB却是一个“存储数据”的系统,增删改查可以添加很多条件,就像SQL数据库一样灵活。 5.MongoDB和Redis都是NoSQL,采用结构型数据存储。二者在使用场景中,存在一定的区别,这也主要由于二者在内存映射的处理过程,持久化的处理方法不同。MongoDB建议集群部署,更多的考虑到集群方案,Redis更偏重于进程顺序写入,虽然支持集群,也仅限于主-从模式。 相关资料Nosql简介 Redis,Memchche,MongoDb的区别

June 8, 2019 · 1 min · jiezi

windows下安装memcache-php链接memcache

一 首先声明很重要的我问题 确认好自己系统是 32位还是64位 以及使用的php集成环境的版本号和32位64位 二 下载并安装memcached服务器端软件32位系统 1.2.5版本:http://static.runoob.com/down...32位系统 1.2.6版本:http://static.runoob.com/down...32位系统 1.4.4版本:http://static.runoob.com/down...64位系统 1.4.4版本:http://static.runoob.com/down...32位系统 1.4.5版本:http://static.runoob.com/down...64位系统 1.4.5版本:http://static.runoob.com/down...下载后解压到任意盘cmd 中进行安装以管理员身份运行 cmd.exe,并转至memcached所在文件夹。并安装memcached c:memcachedmemcached.exe -d install(安装)c:memcachedmemcached.exe -d start(开启)然后去任务管理器中进程查看memcached服务是否已经启动。 4、memcached基本参数设置 -p 监听的端口 -l 连接的IP地址, 默认是本机 -d start 启动memcached服务 -d restart 重起memcached服务 -d stop|shutdown 关闭正在运行的memcached服务 -d install 安装memcached服务 -d uninstall 卸载memcached服务 -u 以的身份运行 (仅在以root运行的时候有效) -m 最大内存使用,单位MB。默认64MB -M 内存耗尽时返回错误,而不是删除项 -c 最大同时连接数,默认是1024 -f 块大小增长因子,默认是1.25 -n 最小分配空间,key+value+flags默认是48 -h 显示帮助 5、memcached的停止与卸载命令三 PHP安装memcache扩展下载memcache.dll扩展 下载地址:http://pecl.php.net/package/m...根据自己php 版本号和集成环境的位数进行下载将其中的php_memcache.dll 扩展文件拷贝到 php 的扩展目录中在php.ini中添加extension=php_memcache.dll重启一下环境 使用phpinfo()查看memcache是否安装成功四、PHP程序测试memcache功能本地是否可用<?php $memcache = new Memcache;$memcache->connect('127.0.0.1',11211) or die('shit'); ...

May 8, 2019 · 1 min · jiezi

[转载] Redis、MongoDB及Memcached的区别

1 基本概念1.1 Redis(内存数据库)Redis是一个key-value存储系统(布式内缓存,高性能的key-value数据库)。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set –有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。1.2 MongoDB(NoSQL数据库)MongoDB是一个介于关系数据库和非关系数据库之间的产品(基于分布式文件存储的数据库),是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。1.3 Memcached(内存Cache)Memcached是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的hashmap。其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。2 特点2.1 Redis支持多种数据结构,如 string(字符串)、list(双向链表)、dict(hash表)、set(集合)、zset(排序set)、hyperloglog(基数估算)。 支持持久化操作,可以进行aof及rdb数据持久化到磁盘,从而进行数据备份或数据恢复等操作,较好的防止数据丢失的手段。 支持通过Replication进行数据复制,通过master-slave机制,可以实时进行数据的同步复制,支持多级复制和增量复制,master-slave机制是Redis进行HA的重要手段。 单线程请求,所有命令串行执行,并发情况下不需要考虑数据一致性问题。 支持pub/sub消息订阅机制,可以用来进行消息订阅与通知。 支持简单的事务需求,但业界使用场景很少,并不成熟。 Redis 只能使用单线程,性能受限于CPU性能,故单实例CPU最高才可能达到5-6w QPS(取决于数据结构,数据大小以及服务器硬件性能,日常环境中QPS高峰大约在1-2w左右)。 依赖快照进行持久化,AOF增强了可靠性的同时,对性能有所影响。 Redis在string类型上会消耗较多内存,可以使用dict(hash表)压缩存储以降低内存耗用。 Memcached和Redis都是Key-Value类型,不适合在不同数据集之间建立关系,也不适合进行查询搜索。比如redis的keys pattern这种匹配操作,对redis的性能是灾难; Redis在2.0版本后增加了自己的VM特性,突破物理内存的限制;可以对key value设置过期时间(类似memcache); Redis事务支持比较弱,只能保证事务中的每个操作连续执行。2.2 MongoDB适合大数据量的存储,依赖操作系统VM做内存管理,吃内存也比较厉害,服务不要和别的服务在一起。支持丰富的数据表达,索引,最类似关系型数据库,支持的查询语言非常丰富。支持master-slave,replicaset(内部采用paxos选举算法,自动故障恢复),auto sharding机制,对客户端屏蔽了故障转移和切分机制。从1.8版本开始采用binlog方式支持持久化的可靠性。MongoDB不支持事务。MongoDB内置了数据分析的功能(mapreduce),其他不支持。2.3 Memcached可以利用多核优势,单实例吞吐量极高,可以达到几十万QPS(取决于key、value的字节大小以及服务器硬件性能,日常环境中QPS高峰大约在4-6w左右)。适用于最大程度扛量。支持直接配置为session handle。只支持简单的key/value数据结构,不像Redis可以支持丰富的数据类型。无法进行持久化,数据不能备份,只能用于缓存使用,且重启后数据全部丢失。无法进行数据同步,不能将MC中的数据迁移到其他MC实例中。内存分配采用Slab Allocation机制管理内存,value大小分布差异较大时会造成内存利用率降低,并引发低利用率时依然出现踢出等问题。需要用户注重value设计。Memcached可以修改最大可用内存,采用LRU算法。3 应用场景3.1 Redis适用于对读写效率要求都很高,数据处理业务复杂和对安全性要求较高的系统(如新浪微博的计数和微博发布部分系统,对数据安全性、读写要求都很高)。3.2 MongoDB主要解决海量数据的访问效率问题。3.3 Memcached动态系统中减轻数据库负载,提升性能;做缓存,适合多读少写,大数据量的情况(如人人网大量查询用户信息、好友信息、文章信息等);用于在动态系统中减少数据库负载,提升性能;做缓存,提高性能(适合读多写少,对于数据量比较大,可以采用sharding)。

March 8, 2019 · 1 min · jiezi

PHP面试常考内容之Memcache和Redis(3)

你好,是我琉忆。今天是周五了,再上一天班就周末了,提前祝大家周末愉快。嘿嘿。这篇文章是本周Memcache和Redis内存数据库常考的专题。本周一和周三更新的文章路径:PHP面试常考内容之Memcache和Redis(1)PHP面试常考内容之Memcache和Redis(2)本周(2019.2-18至2-22)的文章内容点为以下几点,更新时间为每周一三五,可以关注本栏持续关注,感谢你的支持。一、什么是Memcache?二、Memcache有什么特征?三、Memcache的内存管理机制是什么样的?四、Memcache和Memcached有什么区别?五、如何操作Memcache?六、如何使用Memcache做Session共享?七、什么是Redis?八、如何使用Redis?九、使用Redis需要注意哪些问题?十、新增:Redis和Memcache有什么不同?十一、新增:Redis如何实现持久化?十二、Memcache和Redis常考的面试题本章节的内容将会被分为三篇文章进行讲解完整块内容,第一篇主要讲解一到六,第二篇主要讲解七到十一(新增了十和十一),第三篇围绕第十二点。自己整理了一篇“PHP不同等级面试都问什么?”的文章,关注公众号:“琉忆编程库”,回复:“等级”,我发给你。以下正文的部分内容来自《PHP程序员面试笔试真题解析》书籍,如果转载请保留出处:十二、Memcache和Redis常考的面试题【真题1】Memcache的工作原理是什么?答案:Memcache的工作就是在专门的机器内存里维护一张巨大的hash表,存储经常被读写的一些文件与数据,从而极大地提高网站的运行效率。 Memcache的程序运行在一个或多个服务器中,Memcache把全部的数据保存在内存中,通过hash表的方式,每条数据由key/value的形式构成,随时接受客户端的请求,然后返回结果。客户端与Memcache建立连接后,存储对象主要是通过唯一的key存储value到内存中,取数据时通过这个key从内存中获取对应的value。由于Memcache的数据是存储在内存中而不是保存在cache文件中,所以Memcache访问比较快,但是由于这些数据不是永久化存储,所以不建议存储重要数据在Memcache中,因为重启服务器后这些数据就会消失。【真题2】Memcache的优点有哪些?答案:Memcache是一个高性能的分布式内存对象缓存系统,主要通过在内存里维护一个巨大的hash表进行数据缓存。它主要是将数据存储到内存中,然后从内存中读取数据,从而提高读取速度。它主要通过key-value的形式存储各种数据,包括图像、视频、文件等。它具有以下几点优点:(1)支持多台服务器使用Memcache,由于Memcache的存储数据大小必须小于内存的大小,所以可以将Memcache使用在多台服务器上,增加缓存容量;(2)支持均衡请求。当使用多台Memcache服务器时,可以均衡请求,避免所有请求都进入一台Memcache服务器中,避免服务器挂掉而丢失数据;(3)支持分布式,可以解决缓存本身水平线性扩展的问题和缓存大并发下的自身性能问题,避免缓存的单点故障问题;(4)支持部分容灾问题,如果多台服务器存储了Memcache数据,其中一台Memcache服务器挂掉,部分请求还是可以在其它服务器的Memcache中命中,为修复挂掉的服务器争取一些时间。【真题3】如何合理地使用Memcache缓存?如果缓存数据量过大,那么如何部署?(分布式,缓存时间,优化缓存数据)答案:如果要合理地使用Memcache缓存,那么需要注意以下几点内容:(1)因为Memcache支持最大的存储对象大小为1M,所以当合理使用Memcache缓存时,要求不能往Memcache存储一个大于1MB的数据;(2)Memcache存储的所有数据,如果数据大小分布于各种chunk大小区间,从64B到1MB都有,那么会造成内存的极大浪费和Memcache的异常。所以需要注意数据大小的分布区间;(3)key的长度不能大于250个字符;(4)虚拟主机不允许运行Memcache服务,所以不能把Memcache部署到虚拟主机中;(5)因为Memcache可以轻松访问到,所以可以运行在不安全的环境中,如果对数据安全要求高,那么需要着重考虑运行环境的安全问题;(6)因为Memcache存储的数据都在内存中,服务器挂掉就会清空内存,所以缓存中的数据尽量是丢失了也不会有太大影响的数据。如果缓存中的数据量过大,那么可以采取以下的办法:(1)使用Memcache服务器集群的方法,首先是将数据安排放在不同的Memcache服务器上,可以将不同硬件服务器上的Memcache服务器再做成一个数据互相备份的组,避免数据的单点丢失问题;(2)缓存数据到数据库中,在数据库中先建一张表来说明Memcache服务器集群中缓存数据的存放逻辑,然后实现把缓存数据存到数据库中,可以保证数据库和缓存的数据双向存取。【真题4】Redis 与 Memcache有什么区别?答案:Redis是一个完全开源免费的高性能key-value数据库,具有丰富的数据类型,可以支持数据的持久化,将内存中的数据保存在磁盘中,当重启服务器时可以再次加载使用。Memcache是一个高性能的分布式内存对象缓存系统,用于动态的Web应用中帮助数据库减轻负担,在内存中缓存数据和对象,减少每次访问数据时对数据库的访问次数,从而提高访问速度。它们具有以下几点区别:(1)Redis和Memcache的最大区别是,虽然Memcache和Redis都是将数据存在内存中,是内存数据库,但Redis存储时,并不是所有的数据都一直存储在内存中,而Memcache存储时,数据都存在内存中;(2)数据安全问题,由于memecache 把数据全部存在内存之中,服务器挂掉后,重启服务器数据就会丢失,而Redis可以定期保存数据到磁盘中做持久化存储,当需要时可以再加载使用。对于灾难恢复,Memcache挂掉后,数据不可恢复,但Redis数据丢失后可以通过aof恢复;(3)Redis支持多种数据结构存储,例如list,set,hash等数据结构的存储,而Memcache主要是在内存中维护一个统一的巨大的hash表进行存储数据,只支持简单的key/value类型的数据存储,但Memcache可以存储图片、视频、文件及数据库检索结果等;(4)数据备份问题,Redis支持数据的备份,即master-slave模式的数据备份。而Memcache不支持数据持久化,所以无法进行数据备份;(5)在内存使用率上,使用简单的key-value存储的话,Memcached的内存利用率更高,而如果Redis采用hash结构来做key-value存储,由于其组合式的压缩,其内存利用率会高于Memcached。具体和应用场景、数据特性有关;(6)在线程上的比较,Memcache是支持多线程的,而Redis只支持单线程,所以CPU利用方面Memcache优于Redis;(7)它们的扩展都需要做集群;实现方式:master-slave、Hash;(8)数据的读写方面,Redis和Memcache在写入性能上面差别不大,读取性能上面尤其是批量读取性能上Memcache更强。【真题5】Redis集群方案应该怎么做?都有哪些方案?答案:1.twemproxy,大概概念是,它类似于一个代理方式,使用方法和普通redis无任何区别,设置好它下属的多个redis实例后,使用时在本需要连接redis的地方改为连接twemproxy,它会以一个代理的身份接收请求并使用一致性hash算法,将请求转接到具体redis,将结果再返回twemproxy。使用方式简便(相对redis只需修改连接端口),对旧项目扩展的首选。 问题:twemproxy自身单端口实例的压力,使用一致性hash后,对redis节点数量改变时候的计算值的改变,数据无法自动移动到新的节点。2.codis,目前用的最多的集群方案,基本和twemproxy一致的效果,但它支持在 节点数量改变情况下,旧节点数据可恢复到新hash节点。3.redis cluster3.0自带的集群,特点在于他的分布式算法不是一致性hash,而是hash槽的概念,以及自身支持节点设置从节点。具体看官方文档介绍。4.在业务代码层实现,起几个毫无关联的redis实例,在代码层,对key 进行hash计算,然后去对应的redis实例操作数据。 这种方式对hash层代码要求比较高,考虑部分包括,节点失效后的替代算法方案,数据震荡后的自动脚本恢复,实例的监控,等等。自己整理了一篇“PHP不同等级面试都问什么?”的文章,关注公众号:“琉忆编程库”,回复:“等级”,我发给你。【真题6】Redis有哪些适合的场景?答案:(1)、会话缓存(Session Cache)最常用的一种使用Redis的情景是会话缓存(session cache)。用Redis缓存会话比其他存储(如Memcached)的优势在于:Redis提供持久化。当维护一个不是严格要求一致性的缓存时,如果用户的购物车信息全部丢失,大部分人都会不高兴的,现在,他们还会这样吗?幸运的是,随着 Redis 这些年的改进,很容易找到怎么恰当的使用Redis来缓存会话的文档。甚至广为人知的商业平台Magento也提供Redis的插件。(2)、全页缓存(FPC)除基本的会话token之外,Redis还提供很简便的FPC平台。回到一致性问题,即使重启了Redis实例,因为有磁盘的持久化,用户也不会看到页面加载速度的下降,这是一个极大改进,类似PHP本地FPC。再次以Magento为例,Magento提供一个插件来使用Redis作为全页缓存后端。此外,对WordPress的用户来说,Pantheon有一个非常好的插件 wp-redis,这个插件能帮助你以最快速度加载你曾浏览过的页面。(3)、队列Reids在内存存储引擎领域的一大优点是提供 list 和 set 操作,这使得Redis能作为一个很好的消息队列平台来使用。Redis作为队列使用的操作,就类似于本地程序语言(如Python)对 list 的 push/pop 操作。如果你快速的在Google中搜索“Redis queues”,你马上就能找到大量的开源项目,这些项目的目的就是利用Redis创建非常好的后端工具,以满足各种队列需求。例如,Celery有一个后台就是使用Redis作为broker,你可以从这里去查看。(4),排行榜/计数器Redis在内存中对数字进行递增或递减的操作实现的非常好。集合(Set)和有序集合(Sorted Set)也使得我们在执行这些操作的时候变的非常简单,Redis只是正好提供了这两种数据结构。所以,我们要从排序集合中获取到排名最靠前的10个用户–我们称之为“user_scores”,我们只需要像下面一样执行即可:当然,这是假定你是根据你用户的分数做递增的排序。如果你想返回用户及用户的分数,你需要这样执行:ZRANGE user_scores 0 10 WITHSCORESAgora Games就是一个很好的例子,用Ruby实现的,它的排行榜就是使用Redis来存储数据的,你可以在这里看到。(5)、发布/订阅最后(但肯定不是最不重要的)是Redis的发布/订阅功能。发布/订阅的使用场景确实非常多。我已看见人们在社交网络连接中使用,还可作为基于发布/订阅的脚本触发器,甚至用Redis的发布/订阅功能来建立聊天系统!(不,这是真的,你可以去核实)。【真题7】Redis持久化数据和缓存怎么做扩容?答案:如果Redis被当做缓存使用,使用一致性哈希实现动态扩容缩容。如果Redis被当做一个持久化存储使用,必须使用固定的keys-to-nodes映射关系,节点的数量一旦确定不能变化。否则的话(即Redis节点需要动态变化的情况),必须使用可以在运行时进行数据再平衡的一套系统,而当前只有Redis集群可以做到这样。【真题8】Redis回收进程如何工作的?答案:一个客户端运行了新的命令,添加了新的数据。Redi检查内存使用情况,如果大于maxmemory的限制, 则根据设定好的策略进行回收。一个新的命令被执行,等等。所以我们不断地穿越内存限制的边界,通过不断达到边界然后不断地回收回到边界以下。如果一个命令的结果导致大量内存被使用(例如很大的集合的交集保存到一个新的键),不用多久内存限制就会被这个内存使用量超越。【真题9】都有哪些办法可以降低Redis的内存使用情况呢?答案:如果你使用的是32位的Redis实例,可以好好利用Hash,list,sorted set,set等集合类型数据,因为通常情况下很多小的Key-Value可以用更紧凑的方式存放到一起。【真题10】你知道有哪些Redis分区实现方案?答案:客户端分区就是在客户端就已经决定数据会被存储到哪个redis节点或者从哪个redis节点读取。大多数客户端已经实现了客户端分区。代理分区 意味着客户端将请求发送给代理,然后代理决定去哪个节点写数据或者读数据。代理根据分区规则决定请求哪些Redis实例,然后根据Redis的响应结果返回给客户端。redis和memcached的一种代理实现就是Twemproxy查询路由(Query routing) 的意思是客户端随机地请求任意一个redis实例,然后由Redis将请求转发给正确的Redis节点。Redis Cluster实现了一种混合形式的查询路由,但并不是直接将请求从一个redis节点转发到另一个redis节点,而是在客户端的帮助下直接redirected到正确的redis节点。自己根据不同PHP不同等级面试时,会问哪些PHP常考的知识点整理成了一篇文章自己整理了一篇“PHP不同等级面试都问什么?”的文章,关注公众号:“琉忆编程库”,回复:“等级”,我发给你。更多相关面试常考真题可以阅读《PHP程序员面试笔试真题解析》。预告:下周(2019.2.25至2019.3.1)一三五将更新的主题为:PHP面试之会话控制、网络协议、相关的面试题。以上内容摘自《PHP程序员面试笔试真题解析》书籍,该书已在天猫、京东、当当等电商平台销售。更多PHP相关的面试知识、考题可以关注公众号获取:琉忆编程库对本文有什么问题或建议都可以进行留言,我将不断完善追求极致,感谢你们的支持。

February 22, 2019 · 1 min · jiezi

PHP面试常考内容之Memcache和Redis(2)

你好,是我琉忆。继周一(2019.2-18)发布的“PHP面试常考内容之Memcache和Redis(1)”后,这是第二篇,感谢你的支持和阅读。本周(2019.2-18至2-22)的文章内容点为以下几点,更新时间为每周一三五,可以关注本栏持续关注,感谢你的支持。一、什么是Memcache?二、Memcache有什么特征?三、Memcache的内存管理机制是什么样的?四、Memcache和Memcached有什么区别?五、如何操作Memcache?六、如何使用Memcache做Session共享?七、什么是Redis?八、如何使用Redis?九、使用Redis需要注意哪些问题?十、新增:Redis和Memcache有什么不同?十一、新增:Redis如何实现持久化?十二、Memcache和Redis常考的面试题本章节的内容将会被分为三篇文章进行讲解完整块内容,第一篇主要讲解一到六,第二篇主要讲解七到十一(新增了十和十一),第三篇围绕第十二点。以下正文的部分内容来自《PHP程序员面试笔试宝典》书籍,如果转载请保留出处:七、什么是Redis?Redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set,有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集、并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,Redis支持各种不同方式的排序。与Memcached一样,为了保证效率,数据都是缓存在内存中。区别是Redis会周期性地把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。Redis的出现,很大程度上弥补了Memcached这类key/value存储的不足,在部分场合可以对关系数据库起到很好的补充作用。它提供了Java、C/C++、C#、PHP、JavaScript、Perl、Object-C、Python、Ruby、Erlang等客户端,使用起来很方便。Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意地对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。八、如何使用Redis?set方法的使用示例:<?php $Redis = new Redis(); $Redis->connect(‘127.0.0.1’, 6378); $res = $Redis->set(aaa,“bbbb”); var_dump($res); //结果:bool(true) ?>以下仅罗列各使用方法的汇总,具体使用方法可以参考示例和PHP的写法进行使用:1、字符串类型的使用方法2、Hash类型使用方法3、List类型使用方法4、Set类型使用方法5、Sorted set类型使用方法九、使用Redis需要注意哪些问题?与MySQL一样,Redis在使用过程中,也会碰到很多的问题,适当的技巧和优化将大大提高Redis的使用性能,提高服务的质量。现将常见的一些问题总结如下:1.停止使用keys 操作keys操作执行速度将会变慢。因为keys命令的时间复杂度是O(n),其中n是要返回的keys的个数,由此可见这个命令的复杂度就取决于数据量的大小了。当数据量比较大时,在这个操作执行期间,其他任何命令在实例中都无法执行,严重影响了性能。可以使用scan命令来代替,scan命令通过增量迭代的方式来扫描数据库。2.定位Redis速度降低的原因使用INFO commandstats命令来查看所有命令的统计情况,如命令执行了多少次,执行命令所耗费的毫秒数等信息。3.尽量使用hash的存储方式Hash的存储方式会大大提高操作效率。4.设置key值的存活时间无论什么时候,只要有可能就利用key超时的优势。一个很好的例子就是存储一些诸如临时认证key之类的东西。当你去查找一个授权key时——以OAUTH为例——通常会得到一个超时时间。这样在设置key的时候,设成同样的超时时间,Redis就会自动为你清除!而不再需要使用KEYS *来遍历所有的key了。5.对于很重要的数据,请使用异常处理机制如果必须确保关键性的数据可以被放入Redis的实例中,那么请使用异常处理机制。几乎所有的Redis客户端采用的都是“发送即忘”策略,因此经常需要考虑一个 key 是否真正被放到Redis数据库中了。加入异常处理机制是程序健壮性保障的前提。6.多实例应用无论什么时候,只要有可能就分散多Redis实例的工作量。Redis集群允许基于key范围分离出部分包含主/从模式的key。多实例是保证集群资源最大利用,集群稳定的重要保障。自己整理了一篇“Redis如何实现集群?”的文章,关注公众号:“琉忆编程库”,回复:“redis”,我发给你。十、Redis和Memcache有什么不同?(1)数据结构:Memcache只支持key value存储方式,Redis支持更多的数据类型,比如Key value、hash、list、set、zset;(2)多线程:Memcache支持多线程,Redis支持单线程;CPU利用方面Memcache优于Redis;(3)持久化:Memcache不支持持久化,Redis支持持久化;(4)内存利用率:Memcache高,Redis低(采用压缩的情况下比Memcache高);(5)过期策略:Memcache过期后,不删除缓存,会导致下次取数据数据的问题,Redis有专门线程,清除缓存数据;十一、Redis如何实现持久化?Redis是一个支持数据持久化的内存数据库,可以对Redis设置,让Redis周期性的把更新的数据同步到磁盘中保证数据持久化。Redis支持的持久化策略有两种,分别是:RDB和AOF。1、RDB持久化RDB持久化的意思是:指定的时间间隔内保存数据快照。Redis默认的持久化方式就是RDB。RDB的工作原理为当 Redis 需要做持久化时,Redis 会 fork 一个子进程,子进程将数据写到磁盘上一个临时 RDB 文件中。当子进程完成写临时文件后,将原来的 RDB 替换掉,这样的好处就是可以 copy-on-write。在Redis.conf 文件中RDB持久化的默认设置为:save 300 10 #300秒内,如果超过10个key被修改,则发起快照保存;RDB的优点:因为RDB的持久化方式是可以在时间间隔内进行数据快照,所以RDB非常适合用于灾难恢复。例如设置每小时备份一次,或每天备份一次总的,从而方便数据的追溯和还原到不同版本。RDB的缺点:(1)特定时间下才进行一次持久化,所以易丢失数据;例如你设置30分钟备份一次数据,但是如果Redis服务器发生故障,那么就可能丢失好几分钟的数据没能备份。(2)庞大数据时,保存时会出现性能问题。2、AOF持久化AOF:先把命令追加到操作日志的尾部,保存所有历史操作。AOF的工作原理是,每一个写命令都通过write函数追加到 appendonly.aof 中,当Redis出现故障重启时,将会读取 AOF 文件进行“重放”以恢复到 Redis 关闭前的状态。Redis.conf 对AOF持久化的设置:Redis.conf appendonly yes #开启全程持久化appendfsync always #每次有数据修改发生时都会写入AOF文件。appendfsync everysec #每秒钟同步一次,该策略为AOF的缺省策略。AOF的优点:(1)数据非常完整,故障恢复丢失数据少;(2)可对历史操作进行处理。AOF的缺点:(1)在备份相同的数据集时,AOF的文件体积大于RDB的文件体积;(2)AOF使用fsync策略的话,AOF的速度可能会慢于RDB。3、选择哪一种Redis做持久化策略更好?因为Redis是支持同时开启RDB和AOF持久化策略的,所以数据备份安全性考虑的话两者都可以设置,当Redis重启后会优先使用AOF恢复数据,保证丢失的数据最少。如果要二选一的话,可以根据自己的业务进行选择:(1)如果对数据的丢失要求很高,可以选择AOF持久化策略;(2)AOF对Redis执行的每一条命令都会追加到磁盘中,会降低Redis的性能,如果对Redis的性能有所考虑,可以选择RDB持久化策略;(3)考虑数据灾难恢复的情况,可以选择RDB持久化策略。这里还有一个常考的Redis相关的问题:Redis如何实现缓存集群?关注公众号:“琉忆编程库”,回复:“redis”,我发给你。预告:PHP面试常考内容之Memcache和Redis(3)将于本周五(2019.2-22)更新。以上内容摘自《PHP程序员面试笔试宝典》书籍,该书已在天猫、京东、当当等电商平台销售。更多PHP相关的面试知识、考题可以关注公众号获取:琉忆编程库对本文有什么问题或建议都可以进行留言,我将不断完善追求极致,感谢你们的支持。

February 20, 2019 · 1 min · jiezi

PHP面试常考内容之Memcache和Redis(1)

你好,是我琉忆。继上周(2019.2-11至2-15)发布的“PHP面试常考内容之面向对象”专题后,发布的第二个专题,感谢你的阅读。本周(2019.2-18至2-22)的文章内容点为以下几点,更新时间为每周一三五,可以关注本栏持续关注,感谢你的支持。一、什么是Memcache?二、Memcache有什么特征?三、Memcache的内存管理机制是什么样的?四、Memcache和Memcached有什么区别?五、如何操作Memcache?六、如何使用Memcache做Session共享?七、什么是Redis?八、如何使用Redis?九、使用Redis需要注意哪些问题?十、Memcache和Redis常考的面试题本章节的内容将会被分为三篇文章进行讲解完整块内容,第一篇主要讲解一到六,第二篇主要讲解七到九,第三篇围绕第十点。以下正文的部分内容来自《PHP程序员面试笔试宝典》书籍,如果转载请保留出处:一、什么是Memcache?Memcache是一个开源、免费、高性能的分布式对象缓存系统,它基于一个存储键/值对的hashmap来存储数据到内存中。它的作用是减少对数据库的读取以提高Web应用的性能。虽然它的守护进程(daemon )是用 C语言实现的,但是客户端可以用任何语言来编写,并通过Memcache协议与守护进程通信。需要注意的是,当某个服务器停止运行或崩溃了,所有存放在该服务器上的键/值对都将丢失。Memcache的服务器端没有提供分布式功能,各个Memcache应用不会互相通信以共享信息。想要实现分布式通信,可以搭建几个Memcache应用,通过算法实现此效果。下面介绍Memcache的两个重要概念。slab:为了防止内存碎片化,Memcache服务器端会预先将数据空间划分为一系列slab;举个例子,现在有一个100m3的房间,为了合理规划这个房间放置东西,会在这个房间里放置30个1m3的盒子、20个1.25m3的盒子、15个1.5m3的盒子……这些盒子就是slab。LRU:最近最少使用算法;当同一个slab的格子满了,这时需要新加一个值时,不会考虑将这个新数据放到比当前slat更大的空闲slab,而是使用LRU移除旧数据,放入这个新数据。二、Memcache有什么特征?Memcache的特征如下:1)协议简单。2)基于libevent的事件处理。3)内置内存存储方式。4)Memcached不互相通信的分布式。Memcache的特性如下:(1)单个item 最大的数据为1MB。(2)单进程最大的使用内存为2GB,需要更多内存时可开多个端口。(3)Memcached是多线程,非阻塞io复用的网络模型,Redis是单线程。(4)键长最大为250字节。三、Memcache的内存管理机制是什么样的?Memcache将内存分割成各种尺寸的块(chunk),并把尺寸相同的块分成组(chunk的集合)。page是分配给slab的内存空间,默认是1MB,根据slab大小切分成chunk,chunk是用户缓存记录的内存空间,slab class是特定chunk的组。在存储数据时,Memcache会压缩数据的大小进行存储,一般压缩后的数据为原数据大小的30%左右,从而节省了70%的传输性能消耗。如果存储的数是小于100字节的键值对,那么压缩后可能带来膨胀,但Memcache都是按照固定大小分块存储的,最小也有88B,所以小数据带来的压缩膨胀也并不会有什么影响。具体流程如下图所示。自己整理了一篇“如何解决Memcache的缓存雪崩现象?”的文章,关注公众号:“琉忆编程库”,回复:“me”,我发给你。四、Memcache和Memcached有什么区别?其实 memcache 和 memcached 说的是 PHP 的扩展。Memcache是一个自由和开放源代码、高性能、分配的内存对象缓存系统。用于加速动态web应用程序,减轻数据库负载。它可以应对任意多个连接,使用非阻塞的网络IO。由于它的工作机制是在内存中开辟一块空间,然后建立一个Hash表,Memcached自管理这些Hash表。Memcache是该系统的项目名称,Memcached是该系统的主程序文件(字母d可以理解为daemon),以守护程序方式运行于一个或多个服务器中,随时接受客户端的连接操作,使用共享内存存取数据。Memcached处理的原子是每一个(key,value)对(以下简称kv对),key会通过一个hash算法转化成hash-key,便于查找、对比以及做到尽可能的散列。同时,memcached用的是一个二级散列,通过一张大hash表来维护。Memcached有两个核心组件组成:服务端(Server)和客户端(Client),在一个memcached的查询中,Client先通 过计算key的hash值来确定kv对所处在的Server位置。当Server确定后,客户端就会发送一个查询请求给对应的Server,让它来查找确 切的数据。因为这之间没有交互以及多播协议,所以 memcached交互带给网络的五、如何操作Memcache?Memcached的操作命令可以分为存储命令、查找命令、统计命令等三大类。第一类,Memcached的存储命令:第二类,Memcached的查找命令:第三类,Memcached的统计命令:使用示例代码参考:<?php $m = new Memcached(); $m->addServer(“127.0.0.1”,11211); //连接Memcache服务器 $m->set(“mkey”,“123”,600);//设置一个键名为mkey,值为123,600s过期,0为永久有效 echo $m->get(“mkey”);//输出123,get可以获取键名为mkey的值 $m->delete(“mkey”);//删除键名为mkey的值?>具体全部的使用方法不在此一一罗列,可根据上面的方法表和参考示例进行模仿使用。六、如何使用Memcache做Session共享?默认状态下,PHP使用文件方式做Session存储,磁盘的I/O性能肯定没有内存中存取快,因此改用memcache来存储Session在读写速度上会快很多,而且在多台服务器集群时,使用memcahced能够有效地解决Session共享的问题。我们配置好memcached服务器后,修改php.ini配置文件的代码:session.save_handler = memcachesession.save_path = “tcp://127.0.0.1:11211”也可以使用在网站目录下放置Apache的.htaccess文件:php_value session.save_handler “memcache”php_value session.save_path “tcp://127.0.0.1:11211”执行PHP脚本时写入以下两行:ini_set(“session.save_handler”,”memcache”);ini_set(“session.save_path”,”tcp://127.0.0.1:11211”);可以在使用多个memcached服务器时用都好隔开,还可以额外带参数:persistent、weight、timeout、retry_interval等。例如:$session_save_path = “tcp://<memcache_server1>:11211?persistent=1&weight=1&timeout=1&retry_interval=15,udp://<memcache_server2>:11211”;如果想使用udp支持,需要确保你的memcached服务器启用,也确保Web服务器连接到memcache服务器端口正常。重新启动Apache后,将开始使用的memcache存储PHP的Session。测试案例:<?php Session_start(); $_SESSION[‘test’] = time(); echo $_SESSION[‘test’].”<br>”; echo session_id();?>测试memcache是否已存储成功,通过sessionid去取对应的数据:$m = memcache_connect(‘localhost’,11211);echo $m->get(“13765595df9dsa8f9dsa8fa9sf8saf865”);得到结果:17559898989如果使用memcached作为Session存储,要确保memcached的服务正常工作,否则Session相关功能将不起作用,这样PHP的处理就多了一层外面的依赖。因为memcached是使用内存的,这样当用户量比较大时,就可能由于内存方面原因导致Session时长上的问题,Session的实际失效时长达不到设定的失效时长(由memcached在内存不够时的处理机制决定)。Memcache可扩展考察的内容有很多,由于整理的篇幅内容很多,在此只是罗列了普遍遇到的Memcache相关的知识考点。额外的考点还有:(1)Memcache的工作流程是什么样的?(2)Memcache如何实现分布式?(3)Memcache的分布式算法有哪些?(4)使用Memcache有哪些技术限制?(5)Memcache和Redis有什么相同和区别的地方?更多相关面试知识点可以阅读《PHP程序员面试笔试宝典》。预告:PHP面试常考内容之Memcache和Redis(2)将于本周三(2019.2-20)更新。以上内容摘自《PHP程序员面试笔试宝典》书籍,该书已在天猫、京东、当当等电商平台销售。更多PHP相关的面试知识、考题可以关注公众号获取:琉忆编程库对本文有什么问题或建议都可以进行留言,我将不断完善追求极致,感谢你们的支持。

February 18, 2019 · 1 min · jiezi

dubbo源码解析(二十八)远程调用——memcached协议

远程调用——memcached协议目标:介绍memcached协议的设计和实现,介绍dubbo-rpc-memcached的源码。前言dubbo实现memcached协议是基于Memcached,Memcached 是一个高效的 KV 缓存服务器,在dubbo中没有涉及到关于memcached协议的服务暴露,只有服务引用,因为在访问Memcached服务器时,Memcached客户端可以在服务器上存储也可以获取。源码分析(一)MemcachedProtocol该类继承AbstractProtocol,是memcached协议实现的核心。1.属性/** * 默认端口号 */public static final int DEFAULT_PORT = 11211;2.export@Overridepublic <T> Exporter<T> export(final Invoker<T> invoker) throws RpcException { // 不支持memcached服务暴露 throw new UnsupportedOperationException(“Unsupported export memcached service. url: " + invoker.getUrl());}可以看到,服务暴露方法直接抛出异常。3.refer@Overridepublic <T> Invoker<T> refer(final Class<T> type, final URL url) throws RpcException { try { // 获得地址 String address = url.getAddress(); // 获得备用地址 String backup = url.getParameter(Constants.BACKUP_KEY); // 把备用地址拼接上 if (backup != null && backup.length() > 0) { address += “,” + backup; } // 创建Memcached客户端构造器 MemcachedClientBuilder builder = new XMemcachedClientBuilder(AddrUtil.getAddresses(address)); // 创建客户端 final MemcachedClient memcachedClient = builder.build(); // 到期时间参数配置 final int expiry = url.getParameter(“expiry”, 0); // 获得值命令 final String get = url.getParameter(“get”, “get”); // 添加值命令根据类型来取决是put还是set final String set = url.getParameter(“set”, Map.class.equals(type) ? “put” : “set”); // 删除值命令 final String delete = url.getParameter(“delete”, Map.class.equals(type) ? “remove” : “delete”); return new AbstractInvoker<T>(type, url) { @Override protected Result doInvoke(Invocation invocation) throws Throwable { try { // 如果是获取方法名的值 if (get.equals(invocation.getMethodName())) { // 如果参数长度不等于1,则抛出异常 if (invocation.getArguments().length != 1) { throw new IllegalArgumentException(“The memcached get method arguments mismatch, must only one arguments. interface: " + type.getName() + “, method: " + invocation.getMethodName() + “, url: " + url); } // 否则调用get方法来获取 return new RpcResult(memcachedClient.get(String.valueOf(invocation.getArguments()[0]))); } else if (set.equals(invocation.getMethodName())) { // 如果参数长度不为2,则抛出异常 if (invocation.getArguments().length != 2) { throw new IllegalArgumentException(“The memcached set method arguments mismatch, must be two arguments. interface: " + type.getName() + “, method: " + invocation.getMethodName() + “, url: " + url); } // 无论任何现有值如何,都在缓存中设置一个对象 memcachedClient.set(String.valueOf(invocation.getArguments()[0]), expiry, invocation.getArguments()[1]); return new RpcResult(); } else if (delete.equals(invocation.getMethodName())) { // 删除操作只有一个参数,如果参数长度不等于1,则抛出异常 if (invocation.getArguments().length != 1) { throw new IllegalArgumentException(“The memcached delete method arguments mismatch, must only one arguments. interface: " + type.getName() + “, method: " + invocation.getMethodName() + “, url: " + url); } // 删除某个值 memcachedClient.delete(String.valueOf(invocation.getArguments()[0])); return new RpcResult(); } else { // 不支持的操作 throw new UnsupportedOperationException(“Unsupported method " + invocation.getMethodName() + " in memcached service.”); } } catch (Throwable t) { RpcException re = new RpcException(“Failed to invoke memcached service method. interface: " + type.getName() + “, method: " + invocation.getMethodName() + “, url: " + url + “, cause: " + t.getMessage(), t); if (t instanceof TimeoutException || t instanceof SocketTimeoutException) { re.setCode(RpcException.TIMEOUT_EXCEPTION); } else if (t instanceof MemcachedException || t instanceof IOException) { re.setCode(RpcException.NETWORK_EXCEPTION); } throw re; } } @Override public void destroy() { super.destroy(); try { // 关闭客户端 memcachedClient.shutdown(); } catch (Throwable e) { logger.warn(e.getMessage(), e); } } }; } catch (Throwable t) { throw new RpcException(“Failed to refer memcached service. interface: " + type.getName() + “, url: " + url + “, cause: " + t.getMessage(), t); }}该方法是服务引用方法,基于MemcachedClient的get、set、delete方法来对应Memcached的get、set、delete命令进行对值的操作。后记该部分相关的源码解析地址:https://github.com/CrazyHZM/i…该文章讲解了远程调用中关于memcached协议实现的部分,逻辑比较简单。接下来我将开始对rpc模块关于redis协议部分进行讲解。 ...

January 27, 2019 · 2 min · jiezi

放大倍数超5万倍的Memcached DDoS反射攻击,怎么破?

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦本文由腾讯游戏云发表于云+社区专栏背景:Memcached攻击创造DDoS攻击流量纪录近日,利用Memcached服务器实施反射DDoS攻击的事件呈大幅上升趋势。DDoS攻击流量首次过T,引发业界热烈回应。现腾讯游戏云回溯整个事件如下:追溯2 月 27 日消息,Cloudflare 和 Arbor Networks 公司于周二发出警告称,恶意攻击者正在滥用 Memcached 协议发起分布式拒绝服务(DDoS)放大攻击,全球范围内许多服务器(包括 Arbor Networks 公司)受到影响。下图为监测到Memcached攻击态势。仅仅过了一天,就出现了1.35Tbps攻击流量刷新DDoS攻击历史纪录。美国东部时间周三下午,GitHub透露其可能遭受了有史最强的DDoS攻击,专家称攻击者采用了放大攻击的新方法Memcached反射攻击,可能会在未来发生更大规模的分布式拒绝服务(DDoS)攻击。对GitHub平台的第一次峰值流量攻击达到了1.35Tbps,随后又出现了另外一次400Gbps的峰值,这可能也将成为目前记录在案的最强DDoS攻击,此前这一数据为1.1Tbps。据CNCERT3月3日消息,监测发现Memcached反射攻击在北京时间3月1日凌晨2点30分左右峰值流量高达1.94Tbps。腾讯云捕获多起Memcached反射型DDoS攻击截止3月6日,腾讯云已捕获到多起利用Memcached发起的反射型DDoS攻击。主要攻击目标包括游戏、门户网站等业务。腾讯云数据监测显示,黑产针对腾讯云业务发起的Memcached反射型攻击从2月21日起进入活跃期,在3月1日达到活跃高峰,随后攻击次数明显减少,到3月5日再次出现攻击高峰。攻击态势如下图所示:下图为腾讯云捕获到的Memcached反射型DDoS攻击的抓包样本:腾讯云捕获到的Memcached反射源为22511个。Memcached反射源来源分布情况如下图所示:在腾讯云宙斯盾安全系统防护下,腾讯云业务在Memcached反射型DDoS攻击中不受影响。那么,什么是Memcached反射攻击?一般而言,我们会根据针对的协议类型和攻击方式的不同,把 DDoS 分成 SYN Flood、ACK Flood、UDP Flood、NTP Flood、SSDP Flood、DNS Flood、HTTP Flood、ICMP Flood、CC 等各类攻击类型。DDoS攻击的历史可以追溯到上世纪90年代,反射型DDoS 攻击则是DDoS攻击中较巧妙的一种。攻击者并不直接攻击目标服务 IP,而是通过伪造被攻击者的 IP向开放某些某些特殊服务的服务器发请求报文,该服务器会将数倍于请求报文的回复数据发送到那个伪造的IP(即目标服务IP),从而实现隔山打牛,四两拨千金的效果。而Memcached反射型攻击因为其高达数万倍的放大倍数,更加受到攻击者的青睐。Memcached反射攻击,就是发起攻击者伪造成受害者的IP对互联网上可以被利用的Memcached的服务发起大量请求,Memcached对请求回应。大量的回应报文汇聚到被伪造的IP地址源,形成反射型分布式拒绝服务攻击。为何会造成如此大威胁?据腾讯云宙斯盾安全团队成员介绍,以往我们面临的DDoS威胁,例如NTP和SSDP反射攻击的放大倍数一般都是3050之间,而Memcached的放大倍数是万为单位,一般放大倍数接近5万倍,且并不能排除这个倍数被继续放大的可能性。利用这个特点,攻击者可以用非常少的带宽即可发起流量巨大的DDoS攻击。安全建设需要未雨绸缪早在Memcached反射型DDoS攻击手法试探鹅厂业务之时,腾讯云已感知到风险并提前做好部署,这轮黑客基于Memcached反射发起的DDoS攻击都被成功防护。与此同时,腾讯云在捕获到Memcached攻击后,及时协助业务客户自查,提供监测和修复建议以确保用户的服务器不被用于发起DDoS攻击。应对超大流量DDoS攻击的安全建议DDoS攻击愈演愈烈,不断刷新攻击流量纪录,面临超越Tbps级的超大流量攻击,腾讯云宙斯盾安全产品团队建议用户做以下应对:1.需要加强对反射型UDP攻击的重点关注,并提高风险感知能力反射型UDP攻击占据DDoS攻击半壁江山。根据2017年腾讯云游戏行业DDoS攻击态势报告显示,反射型UDP攻击占了2017年全年DDoS攻击的55%,需要重点关注此种类型攻击。此次Memcached反射型攻击作为一种较新型的反射型UDP攻击形式出现,带来巨大安全隐患,需要业界持续关注互联网安全动态,并提高风险感知能力,做好策略应对。在行业内出现威胁爆发时进行必要的演练。2.应对超大流量攻击威胁,建议接入腾讯云超大容量高防产品应对逐步升级的DDoS攻击风险。建议配置腾讯云超大容量高防产品,隐藏源站IP。用高防IP充足的带宽资源应对可能的大流量攻击行为,并根据业务特点制定个性化的防护策略,被DDoS攻击时才能保证业务可用性,从容处理。在面对高等级DDoS威胁时,及时升级防护配置,必要时请求DDoS防护厂商的专家服务。 了解腾讯云新一代高防产品:https://cloud.tencent.com/pro… 3.易受大流量攻击行业需加强防范门户、金融、游戏等往年易受黑产死盯的行业需加强防范,政府等DDoS防护能力较弱的业务需提高大流量攻击的警惕。风险往往曾经出现过苗头,一旦被黑产的春风点起,在毫无防护的情形之下,就会燃起燎原大火。参考链接:https://blog.cloudflare.com/m…http://mp.weixin.qq.com/s/b0T…问答如何防范DDos攻击?相关阅读游戏出海,如何避开DDoS这座暗礁?3行代码,为QQ轻游戏加上语音互动能力《堡垒之夜》畅爽体验的秘诀了解一下! 【每日课程推荐】机器学习实战!快速入门在线广告业务及CTR相应知识

September 30, 2018 · 1 min · jiezi