这个题有点绕。考的还是 COOKIE 和 SESSION 的根本知识。做事端通过 set-cookie 命令来关照客户端保存 cookie。
只要按照 domain path 过期韶光等规则 用 header 函数就可以实现。
分布式系统 session,集中处理。按我们公司的架构,为了实现高可用和高容灾,供应一个分布式的验签做事。详细的可以看下 redis 的分布式做事架构。
2、数据库中的存放了用户 ID, 扣费很多行,redis 中存放的是用户的钱包,现在要写一个脚本,将数据库中的扣费记录同步到 redis 中,每 5 分钟实行一次。叨教要考虑哪些问题?
思路:生产者和消费者模式。这个问题也没有说其他的状态,比如数据库的数据会实时增加么?redis 中每个钱包是否有其他做事在读取或者写入啊。什么的。数据库和 REDIS 放一起,要么考数据同等性,要么考涌现锁,导致效率降落。
3、根据 access.log 文件统计最近 5 秒的 qps,并以如下格式显示,01 1000(难点在 01 序号)
tail -f access.log | awk -F '[' '{print $2}' | awk '{print $1}' | uniq -c
4.redis 是如何进行同步的,同步的办法,同步回滚怎么办,数据非常怎么办,同时会问 MYSQL 的同步办法和干系非常情形
redis 集群主从同步的大略事理
Redis 的复制功能是基于内存快照的持久化策略根本上的,也便是说无论你的持久化策略选择的是什么,只要用到了 Redis 的复制功能,就一定会有内存快照发生。
当 Slave 启动并连接到 Master 之后,它将主动发送一个 SYNC 命令 (首先 Master 会启动一个后台进程,将数据快照保存到文件中 [rdb 文件] Master 会给 Slave 发送一个
Ping 命令来判断 Slave 的存活状态 当存活时 Master 会将数据文件发送给 Slave 并将所有写命令发送到 Slave )。
Slave 首先会将数据文件保存到本地 之后再将 数据 加载到内存中。
当第一次链接 或者是 故障后 重新连接 都会先判断 Slave 的存活状态 在做全部数据的同步 , 之后只会同步 Master 的写操作 (将命令发送给 Slave)
问题:
当 Master 同步数据时 若数据量较大 而 Master 本身只会启用一个后台进程 来对多个 Slave 进行同步 , 这样 Master 就会压力过大 , 而且 Slave 规复的韶光也会很慢!
redis 主从复制的优点:
(1)在一个Redis集群中,master卖力写要求,slave卖力读要求,这么做一方面通过将读要求分散到其他机器从而大大减少了master做事器的压力,另一方面slave专注于供应
读做事从而提高了相应和读取速率。
(2) 在一个 Redis 集群中,如果 master 宕机,slave 可以参与并取代 master 的位置,因此对付全体 Redis 做事来说不至于供应不了做事,这样使得全体 Redis 做事足够安全。
(3) 水平增加 Slave 机器可以提高性能
5.两台 mysql 做事器,个中一台挂了,怎么让业务端无感切换,并担保正常情形下讲台做事器的数据是同等的
不是核心业务的话,先停写,把备机拉起来,查看两台机器的日志,进行数据补偿,开写。
如果是核心业务的话,现在所有的写操作都在正常的状态机器上。把好的这台机器的备机拉起来,当主机。
以上全是应急操作。实际上数据库的容灾设计要繁芜的多。
口试官假如问你,备机的数据不一致怎么办,你要年夜胆怼回去,你们每秒多少写入操作。按照百万级表,每秒 1000 的写入效率,正常的设计是,分布在 2 台机器上每台 500。这个级别的数据同步,涌现差异的概率 可以忽略不计的。有一台涌现问题,另一台也可以抗住。
(正常的操作,还是先停写,等数据同等,切换,开写。我们公司搞这些切换都是在凌晨 4.00 旁边,核心业务的每秒写操作,只有十几个。前后耽搁不到 20 秒)。
6.请写出自少三种截取文件名后缀的方法或函数(PHP 原生函数和自己实现函数均可)
echo substr(strrchr($file, '.'), 1);
echo substr($file, strrpos($file, '.')+1);
$arr=explode('.', $file);
echo $arr[count($arr)-1];
$arr=explode('.', $file);
echo end($arr);
echo strrev(explode('.', strrev($file))[0]);
echo pathinfo($file)['extension'];
echo pathinfo($file, PATHINFO_EXTENSION);