2020PHP面试-Redis篇
一、Redis 数据类型
1. string 字符型。
2.hash hash 结构化的对象。 key不可重复
3.list 队列 lpush rpop lpop rpush
4. set 集合 value不可重复
5. zset 有序集合 set的基础上加了分数(排序)。
二、Redis事务
1.multi (事务启动) 、 exec (事务执行) 、 watch(监视某几个键有没有被别的客户端进行修改,一旦有任何的键被修改过,exec的时候都会直接返回一个nil,不执行事务)、discard(立刻取消事务,清空事务队列中所有命令)。
2.redis数据库里会存在一个watched_keys字典,这个字典里 key为被监视的key,值为一个链表,链表里记录着监视该key的客户端,一旦被监视的key发生了修改,该key对应的客户端会打开REDIS_DIRTY_CAS标识,代表该客户端的事务安全性被破坏了。这就是watch命令的实现。
3.为什么redis的事务不支持回滚?
因为这种复杂的功能和redis的设计理念不符。并且redis事务中出错原因通常是编程错误,只在开发环境出现,生产环境可避免。
4.redis事务中命令执行出错的结果?
redis并不会中断事务的执行,会继续执行后续的操作命令。exec的时候,出错的命令会被标识出来,并给出原因。
5. redis的事务持久性,受到持久化方式的影响,只要采用了aof快照模式,并且appendfsync选项的值为always时,程序总会在执行命令之后调用同步(sync)函数,将命令数据真正地保存到硬盘里。
ps: 因为如果只采用了rdb方式的话,redis服务器只会在特定的保存条件下才会执行BGSAVE命令,并且异步执行的BGSAVE命令不能保证事务的数据第一时间被保存到硬盘上。
三、Redis缓存穿透和缓存雪崩
缓存穿透:
一些恶意的请求,会故意查询大量不存在的key。
如何避免:
1.对key查询结果为空的情况也进行缓存,缓存有效期设置的短一些,或者当该key插入之后,对缓存进行清理,更新。
2.提前过滤一遍一定不存在的key,将所有可能的key放到一个大的bitmap中进行过滤,或者使用布隆过滤器。
缓存雪崩:
同一时间点,大量缓存集体失效。
如何避免:
1.对大量缓存失效的db加锁或者进行入队控制,控制并发数量。
2.做二级缓存。A1为短期拷贝缓存。A2为长期原始缓存。A1失效时,访问A2.
3.不同的key尽量设置不同的有效期,让缓存的时效节点均匀一些。
四、Redis的线程模型
单线程,基于文件事件管理器(file event handler),I/O多路复用,同时监听多个socket,根据socket上的事件类型,分派给对应的事件处理器进行处理。
五、Redis过期策略
1.定期删除:
每个100ms 随机抽取key是否过期,过期则删除。(ps:如果每次都检查所有的key会卡死的。)
2.惰性删除:
获取某个key的时候,检查该key是否过期,过期则删除。
如果定期删除没有删除到,又没有请求来获取 某些key,那这些key则会一直占着内存。内存越来越高,触发内存淘汰机制。
六、Redis的内存淘汰机制
1.noeviction : 不淘汰数据,写入报错。
2.allkeys-random : 从所有数据中选择任意数据进行淘汰。
3.allkeys-lru : 从所有数据中挑选最近最少使用的key进行淘汰。
4.volatile-random :从设置有效期的数据中选择任意数据进行淘汰。
5.volatile-lru : 从设置有效期的数据中选择最近最少使用的key进行淘汰。
6.volatile-ttl : 从设置有效期的数据中挑选存活时间最短的key进行淘汰。
七、Redis 和 Memcached 区别
1.memcached 只支持存储字符串。 redis支持多样化的5种类型。
2.memcached 不支持持久化。 redis支持RDB和AOF快照。
3.总体来说redis内存使用更少一些。
八、Redis集群在什么时候下不可用
1.任意master挂掉,且当前master没有slave从库,导致哈希槽不完整。
2.超过半数的master挂掉。
九、Redis的哈希槽
没有像一致性哈希的环状概念, Redis集群共有16384个哈希槽,每个key通过CRC16校验后,对16384取模来决定放在哪个槽。集群的每个节点负责一部分槽,可以方便的添加和移除节点。
十、Redis持久化方式
1.RBD : fork子进程,使用copy-on-write写时复制技术,将内存数据记录到RDB文件中。
2.AOF : 将Redis的操作日志以追加 的方式写入文件。
ps: redis 4.0支持混合持久化。 redis实例重启时,使用RDB重建大部分内存。再使用AOF快照重放,回复到重启之前的状态。
十一、AOF如何缩减自身 文件大小
bgrewriteaof 重写aof,重写成功才会替换。
十二、Redis的主从同步
1.同步前,主节点先来一次bgsave,并同时将后续的修改操作记录到内存buffer。 后续将rdb文件完全同步到从节点,构建内存。再通知主节点将内存buffer里的修改操作同步到从节点进行重放,完成。
十三、Redis队列
pub/sub模式 如果消费者下线,生产者的数据积压,如果这时候没有实时aof,数据就会丢失。
十四、数据库、缓存双写一致性
先更新数据库,再删缓存。后续如果有对该key做查询,查缓存不存在,再去查数据库后,往缓存里再写一份。
2020PHP面试-Redis篇的更多相关文章
- 2020PHP面试-SQL篇
一.乐观锁和悲观锁 1.悲观锁是指假设并发更新会发生冲突,不管冲突是否会发生,都会使用锁机制. 优点: 完全保证数据安全. 缺点:锁机制会有额外开销,并发度降低. 可能会产生死锁. 2. 乐观锁是指假 ...
- 2020PHP面试-PHP篇
一.列举一些PHP的设计模式 单例模式:保证在整个应用程序的生命周期中,任何一个时刻,单例类的实例都只存在一个,同时这个类还必须提供一个访问该类的全局访问点. 工厂模式:定义一个创建对象的接口,但是让 ...
- 2020PHP面试-网络篇
一.网络协议分层 OSI七层: 物理层.数据链路层.网络层.传输层.会话层.表示层.应用层. TCP/IP四(五)层 : 物理层(主要是光电信号的传输). 数据链路层(MAC地址.以太网协议).网络层 ...
- 《【面试突击】— Redis篇》--Redis都有哪些数据类型?分别在哪些场景下使用比较合适?
能坚持别人不能坚持的,才能拥有别人不能拥有的.关注编程大道公众号,让我们一同坚持心中所想,一起成长!! <[面试突击]— Redis篇>--Redis都有哪些数据类型?分别在哪些场景下使用 ...
- 《【面试突击】— Redis篇》-- Redis的线程模型了解吗?为啥单线程效率还这么高?
能坚持别人不能坚持的,才能拥有别人未曾拥有的.关注编程大道公众号,让我们一同坚持心中所想,一起成长!! <[面试突击]— Redis篇>-- Redis的线程模型了解吗?为啥单线程效率还这 ...
- 《【面试突击】— Redis篇》-- Redis的主从复制?哨兵机制?
能坚持别人不能坚持的,才能拥有别人未曾拥有的.关注左上角编程大道公众号,让我们一同坚持心中所想,一起成长!! <[面试突击]— Redis篇>-- Redis的主从复制?哨兵机制? 在这个 ...
- 《【面试突击】— Redis篇》-- Redis哨兵原理及持久化机制
能坚持别人不能坚持的,才能拥有别人未曾拥有的.关注编程大道公众号,让我们一同坚持心中所想,一起成长!! <[面试突击]— Redis篇>-- Redis哨兵原理及持久化机制 在这个系列里, ...
- 《【面试突击】— Redis篇》--Redis Cluster及缓存使用和架构设计的常见问题
能坚持别人不能坚持的,才能拥有别人未曾拥有的.关注编程大道公众号,让我们一同坚持心中所想,一起成长!! <[面试突击]— Redis篇>--Redis Cluster及缓存使用和架构设计的 ...
- 分布式锁的实现之 redis 篇
为什么需要分布式锁 引入经典的秒杀情景,100件商品供客户抢.如果是单机版的话,我们使用synchronized 或者 lock 都可以实现线程安全.但是如果多个服务器的话,synchronized ...
随机推荐
- Spring boot PageHelper.startPage(pageIndex, pageSize)分页无效
H5页面在测试列表的时候发现分页好像没有起到作用 看了一下后台也没有问题哈: 1.PageHelper.startPage(pageIndex, pageSize)要放在要分页的上面,也没错 2.查询 ...
- Vue 实现分页效果
分页,是在业务中经常要用到,为了节省用户流量和提升用户体验 讲一下思路: 首先是定义页号currentPage 和 页大小pagesize,用一个数组保存总数据: 用一个计算属性page_arrs,作 ...
- PAN3501兼容AS3933-BTST
PAN3501是一颗是15–150kHz频率范围.3通道低频唤醒接收器,3通道低频唤醒接收器,且具备自动天线调谐功能.另外还比AS3933基础功能上增加了多了几个寄存器,大大增加了给使用者的空间,灵活 ...
- ThinkPhp3.2.3缓存漏洞复现以及修复建议
小编作为一个php(拍黄片)的程序员,今天早上无意间看到thinkphp的缓存漏洞,小编在实际开发过程中用thinkphp3.2.3挺多的. 我们这里来复现一下漏洞 后面我会提出修复建议 首先我们下载 ...
- GoJS实例4
此示例更改链接数据的“to”属性,使链接连接到不同的节点.复制如下内容保存到空白的.html文件中,用浏览器打开即可查看效果 <!DOCTYPE html> <html> &l ...
- ARGB 颜色取值与透明度搭配
ARGB 依次代表透明度(alpha).红色(red).绿色(green).蓝色(blue). #FF99CC00 为例,其中,FF 是透明度,99 是红色值, CC 是绿色值, 00 是蓝色值. 1 ...
- 011.Delphi插件之QPlugins,延时加载服务
这个DEMO是是把DLL插件的相关信息做成了一个配置文件,主程序加载这个配置文件,从而起到延时加载的作用 主程序代码如下 unit Frm_Main; interface uses Winapi.Wi ...
- Linux学习-预习第五六七章节关于用户权限管理以及磁盘文件系统
- HDU - 6205 card card card (尺取法)
题意:有n堆牌,ai表示每堆牌的牌数,bi表示每堆牌的penaltyvalue,操作开始前,可以重复进行将第一堆牌挪到最后一堆这一操作.然后,对于挪完后的牌,从第一堆开始,依次取.对于每一堆牌,首先将 ...
- 十七、SAP中使用SQL语句读取一条数据
一.需要说明的是SAP不同类型的结构体类型之间是不能随意赋值的,如果需要赋值,可以使用CORRESPONDING FIELDS OF关键字, 不同类型结构体中同名的成员会被赋值,代码如下: 二.输出代 ...