当前位置: 首页 > 编程日记 > 正文

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、字符串类型的使用方法

clipboard.png

2、Hash类型使用方法

clipboard.png

3、List类型使用方法

clipboard.png

4、Set类型使用方法

clipboard.png

5、Sorted set类型使用方法

clipboard.png


九、使用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相关的面试知识、考题可以关注公众号获取:琉忆编程库

图片描述

对本文有什么问题或建议都可以进行留言,我将不断完善追求极致,感谢你们的支持。

相关文章:

毫米波雷达、ADAS中的应用以及毫米波雷达的检测、测距、测速和角度测量

毫米波雷达的检测、测距、测速和角度测量 毫米波(Millimeter-Wave&#xff0c;缩写&#xff1a;MMW)&#xff0c;是指长度在1~10mm的电磁波&#xff0c;对应的频率范围为30~300GHz&#xff0e;根据波的传播理论&#xff0c;频率越高&#xff0c;波长越短&#xff0c;分辨率越高…

【VMC实验室】在QCloud上创建您的SQL Cluster(1)

在国内公有云厂商上搭建一套SQL Cluster的难度相信做Windows的童鞋都会很清楚&#xff0c;并非它的搭建有多少难度&#xff0c;只是很多细节需要注意。腾讯云&#xff0c;QCloud&#xff0c;为什么选择QCloud来做这个实验&#xff0c;除了QCloud是我的东家&#xff08;啊呸&…

【Codeforces】808D Array Division(前后两部分和相等)

http://codeforces.com/contest/808/problem/D 给你一个数组&#xff0c;问&#xff1a;是否可以通过移动一个数字的位置&#xff0c;求只能移动一次&#xff0c;使得这个数组前后部分的和相等&#xff0c;前后部分不一定等长 一个a数组储存数据&#xff0c;另一个b数组b[i]表…

想要确保架构目标达成?适合度函数了解一下

Paula Paul和Rosemary Wang撰写的一篇博文中介绍了适应度函数&#xff08;fitness function&#xff09;的基本概念、入门方法&#xff0c;并给出了如何验证各种架构质量的一些实例。文中提出&#xff0c;适应度函数驱动开发的方法可用于编写测定系统符合架构目标的测试&#x…

标定(二)----------双目相机与IMU联合标定(工具箱使用方法——Kalibr)

16个相机参数&#xff1a; Overview ethz-asl/kalibr is a toolbox that solves the following calibration problems: Multiple camera calibration: intrinsic and extrinsic calibration of a camera-systems with non-globally shared overlapping fields of view Cam…

【Codeforces】659B Qualifying Contest (sort)

http://codeforces.com/problemset/problem/659/B n个人&#xff0c;m个地区&#xff0c;选出每个地区分数最高的两个人 下面有n行&#xff0c;每一行的第一个数表示姓名&#xff0c;第二个数是地区的序号&#xff0c;第三个数是分数 It is guaranteed that all surnames of…

Protractor测试环境搭建

2019独角兽企业重金招聘Python工程师标准>>> 安装node.js.然后&#xff0c;在cmd下&#xff0c;进入E盘下的&#xff0c;我们自己新建的protractor文件夹下&#xff0c; npm install -g protractor 这样就会在本地安装好两个命令行工具&#xff1a;protractor和webd…

Promise和Promise的方法

&#xff08;Promise和Promise的方法&#xff09; Promise是ES6一个伟大的发明&#xff0c;他使我们从回调地狱中能够走出来。 什么是Promise 从字面上来看&#xff0c;Promise就是一个承诺。那么&#xff0c;在ES6当中&#xff0c;Promise通常用来控制异步操作。当一个异步操作…

镜头评价指标及测试方法(三)--------测量原理及3D相机调查

1.测量原理&#xff1a; 1.1、通过红外结构光(Structured Light)来测量像素距离&#xff0c;如Kinect1、Project Tango1、Intel Realsense等&#xff1b; 通过近红外激光器&#xff0c;将具有一定结构特征的光&#xff08;比如离散光斑、条纹光、编码结构光等&#xff09;投射到…

Android--Retrofit的简单使用(一)

1&#xff0c;如果不太了解retrofit的同学可以先去官网学习一下简单使用&#xff1a;http://square.github.io/retrofit/&#xff0c;这里我们以一个简单的Get请求的例子来练习一下 2&#xff0c;https://api.douban.com/v2/movie/top250?start0&count10 目标地址&#xf…

【Codeforces】920A Water The Garden(浇花)

http://codeforces.com/problemset/problem/920/A 给你花坛的数目&#xff0c;花坛都是连续的&#xff0c;某一些花坛里有水龙头&#xff0c;给出了这些有水龙头的位置 The garden from test 1. White colour denotes a garden bed without a tap, red colour — a garden be…

Work with Alexa :Echo匹配连接到Alexa

背景&#xff1a; 通过蓝牙可以让你的智能家居设备和Echo设备连接起来&#xff0c;从而达到Echo通过语音控制智能家居设备。 什么事Alexa Gadgets&#xff1f; 我的理解Alexa Gadgets是智能家居设备的一部分&#xff0c;包含硬件和软件。硬件&#xff1a;蓝牙模块&#xff1b;软…

Maven 学习Tips

2019独角兽企业重金招聘Python工程师标准>>> 使用 deploy 应该注意的地方 在项目的pom文件中增加如下节点&#xff1a;<project><distributionManagement><repository><id>releases</id><url>http://192.168.1.99:8081/nexus/c…

【Codeforces】1015B Obtaining the String(字符串 交换)

http://codeforces.com/contest/1015/problem/B n 表示 字符串的长度 然后是两个字符串&#xff0c;每一次只能交换相邻的两个&#xff0c;如果选择第i个字符的话&#xff0c;只能交换第i个和第i1个 然后输出每一次交换选定的位置 暴力&#xff0c;模拟&#xff0c;queue&am…

07 分支管理 —— Feature分支

2019独角兽企业重金招聘Python工程师标准>>> 07 分支管理 —— Feature分支 软件开发中&#xff0c;总有无穷无尽的新的功能要不断添加进来。添加一个新功能时&#xff0c;你肯定不希望因为一些实验性质的代码&#xff0c;把主分支搞乱了&#xff0c;所以&#xff0…

适用于0基础小伙伴的HTML知识点总结 先到先得哟

HTML基础知识点分享 前段时间一直忙于私下学习消化一些PHP中的知识体系&#xff0c;导致博客开通至今一直没发表相关技能贴。最近呢~博主夏天我正在进行前半段知识体系和框架的总结阶段。借此&#xff0c;抽空给大家分享一下私下自己学习时的一些心得体会以及知识体系&#xff…

SLAM小结——求解退化问题解析(F、H、E)(面试经验总结)

总结&#xff1a; 1 Essential Matrix E t ^ R 为3*3的矩阵&#xff0c;奇异值为 [ u, u, 0] ^ T 的形式。为本质矩阵的内在性质。 性质&#xff1a;理论上综合旋转、平移共有6个自由度&#xff0c;因尺度等价&#xff0c;E有5个自由度。 求解&#xff1a;一般使用…

【Codeforces】1065B Vasya and Isolated Vertices (无向图的)

http://codeforces.com/problemset/problem/1065/B 一个图&#xff0c;给定顶点数&#xff0c;边数&#xff0c;求解最小孤立点数和最大孤立点数 最小的话&#xff0c;一个边连接两个顶点成为一个整体&#xff0c;如果最后有多余的点&#xff0c;那些就是孤立的点 最大就是找…

这些资源网站为什么能获得5万知乎大佬推荐,而我错失了什么吗?

现在很多朋友可能只要是一听到资源网站&#xff0c;想必就会好奇是什么网站&#xff0c;用用看是不是由说的那么厉害&#xff01;其实资源网站给我们的诱惑是在是太大了&#xff0c;其主要原因是可以帮助我们搜索到很多意想不到的资源&#xff01; 为了回应大家的需求&#xff…

大话Redis进阶

2019独角兽企业重金招聘Python工程师标准>>> 使用Redis过程中&#xff0c;总是会遇到各种各样问题&#xff0c;这里进行问题的总结&#xff0c;作为Redis 进阶的经验分享。 更新缓存的问题 [主动]需要操作人员去操作&#xff0c;或者定时调度[被动]由用户触发更新[预…

SLAM精度测评——EVO

1.install GitHub - MichaelGrupp/evo: Python package for the evaluation of odometry and SLAM 注意&#xff1a;安装好依赖&#xff01; sudo apt install python-pip pip install evo --upgrade --no-binary evo or pip install evo --upgrade --no-binary evo --user…

【UVA】10152 ShellSort (几只乌龟的故事)

https://vjudge.net/problem/UVA-10152 题目大意&#xff1a; 输入N&#xff0c;给你N个乌龟的名字&#xff0c;下面N行是初始状态&#xff0c;在下面N行是最终状态&#xff0c;你选中这只乌龟以后&#xff0c;只能把它移动到最上面&#xff0c;问怎么样操作步数最少&#xf…

python2与python3转换记录

为什么需要有两个版本的Python Python2和Python3不兼容是每个接触过Python的开发者都知道的事&#xff0c;虽说Python3是未来&#xff0c;但是仍然有很多项目采用Python2开发。Linux的许多发行版本(如Ubuntu)都会自带Python2.7&#xff0c;但是当我们准备开发一个Python3项目的…

oracle读书笔记之Oracle 11g R2 DBA操作指南(前三章)

Oracle 11g R2 DBA操作指南是我学习的第一本讲述oracle数据库知识的书籍&#xff0c;在此记录下自己的学习笔记&#xff0c;对于书中的知识点本人通过实际操作进行验证。1.Oracle数据库基础1.1.关系数据库1.1.1.关系数据库模型1.关系数据库模型三个核心概念&#xff1a;关系、属…

【UVA】11991 Easy Problem from Rujia Liu? (整数v第k次出现在什么位置)

https://vjudge.net/problem/UVA-11991 题目大意&#xff1a;就是给你一个序列&#xff0c;然后给出k和v&#xff0c;看整数v第k次出现在该序列的什么位置&#xff0c;没有的话就输出0 结构体&#xff08;略复杂&#xff09;&#xff1a; #include <iostream> #include…

面试题:2018最全Redis面试题整理

1、什么是Redis?Redis 是完全开源免费的&#xff0c;遵守BSD协议&#xff0c;是一个高性能的key-value数据库。 Redis 与其他 key - value 缓存产品有以下三个特点&#xff1a;Redis支持数据的持久化&#xff0c;可以将内存中的数据保存在磁盘中&#xff0c;重启的时候可以再次…

Android5.0如何正确启用isLoggable(二) 理分析

转自&#xff1a;http://www.it165.net/pro/html/201506/43374.html 概要 在上文《Android 5.0 如何正确启用isLoggable(一)__使用详解》中分析了isLoggable的使用方法&#xff0c;本文主要分析isLoggable实现原理以及user版系统root后永久enable isLoggable的原理&#xff0c;…

SLAM精度测评——rpg_trajectory_evaluatio

1. install https://github.com/ccxslam/rpg_trajectory_evaluation#install 下载catkin_simple&#xff1a;https://github.com/catkin/catkin_simple 建立工作空间 src下载&#xff0c;编译&#xff0c;然后下载rpg_trajectory_evaluatio,编译安装即可。 &#xff12;&a…

STL set multiset

STL容器大的方向分为两类&#xff0c;序列式容器和关联式容器。 这两者通过数据在容器内的排列来区分。关联容器和顺序容器的根本不同在于&#xff1a;关联容器中的元素是按关键字来保存和访问的&#xff0c;而顺序容器中的元素则是按它们在容器中的位置来顺序保存和访问的。 …

Windows 消息循环(1) - 概览

本文从消息循环是如何驱动程序的这个角度&#xff0c;对 Windows 消息循环进行概览性介绍。 使用 EN5 课件获得更好的阅读体验&#xff1a; 【希沃白板5】课件分享 : 《Windows培训 - 消息循环》https://r302.cc/q2d1jB 点击链接直接预览课件 1 程序是怎么跑起来的&#xff1f;…