『C++』2020年最新阿里C/C++ Linux后台开发面试题及答案( 二 )


过期淘汰 , 数据写入redis会附带1个有效时间 , 这个有效时间内该数据被认为是正确的并不关心真实情况 , 例如对支付等业务采用版本号实现 , redis中每一份数据都维持1个版本号 , DB中也维持1份 , 只有当redis的与DB中的版本一致时 , 才会认为redis为有效的 , 不过仍然每次都要访问DB , 只需要查询version版本字段即可 。
5、ZooKeeper分布式是如何做到高可用?ZooKeeper 运行期间 , 集群中至少有过半的机器保存了最新数据 。 集群超过半数的机器能够正常工作 , 集群就能够对外提供服务 。
zookeeper可以选出N台机器作主机 , 它可以实现M:N的备份;keepalive只能选出1台机器作主机 , 所以keepalive只能实现M:1的备份 。
通常有以下两种部署方案:双机房部署(一个稳定性更好、设备更可靠的机房 , 这个机房就是主要机房 , 而另外一个机房则更加廉价一些 , 例如 , 对于一个由 7 台机器组成的 ZooKeeper 集群 , 通常在主要机房中部署 4 台机器 , 剩下的 3 台机器部署到另外一个机房中);三机房部署(无论哪个机房发生了故障 , 剩下两个机房的机器数量都超过半数 。 在三个机房中都部署若干个机器来组成一个 ZooKeeper 集群 。 假设机器总数为 N , 各机房机器数:N1 = (N-1)/2, N2=1~(N-N1)/2, N3 = N - N1 - N2 ) 。
水平扩容就是向集群中添加更多机器 , Zookeeper2种方式(不完美) , 一种是集群整体重启 , 另外一种是逐台进行服务器的重启 。
6、如何将数据分布在redis第几个库?redis 本身支持16个数据库 , 通过 数据库id 设置 , 默认为0 。
例如jedis客户端设置 。 一:JedisPool(org.apache.commons.pool.impl.GenericObjectPool.Config poolConfig String host int port int timeout String password int database);
第一种通过指定构造函数database字段选择库 , 不设置则默认0库 。 二:jedis.select(index);调用jedis的select方法指定 。
7、幂等的处理方式?一、查询与删除操作是天然幂等
二、唯一索引 , 防止新增脏数据
三、token机制 , 防止页面重复提交
四、悲观锁 for update
五、乐观锁(通过版本号/时间戳实现 ,通过条件限制where avai_amount-#subAmount# >= 0)
六、分布式锁
七、状态机幂等(如果状态机已经处于下一个状态 , 这时候来了一个上一个状态的变更 , 理论上是不能够变更的 , 这样的话 , 保证了有限状态机的幂等 。 )
八、select + insert(并发不高的后台系统 , 或者一些任务JOB , 为了支持幂等 , 支持重复执行)
8、Https工作流程?a、客户端发送自己支持的加密规则给服务器 , 代表告诉服务器要进行连接了
b、服务器从中选出一套加密算法和hash算法以及自己的身份信息(地址等)以证书的形式发送给浏览器 , 证书中包含服务器信息 , 加密公钥 , 证书的办法机构
c、客户端收到网站的证书之后要做下面的事情:
c1、验证证书的合法性
c2、如果验证通过证书 , 浏览器会生成一串随机数作为密钥K , 并用证书中的公钥进行加密
c3、用约定好的hash算法计算握手消息 , 然后用生成的密钥K进行加密 , 然后一起发送给服务器
d、服务器接收到客户端传送来的信息 , 要求下面的事情:
d1、用私钥解析出密码 , 用密码解析握手消息 , 验证hash值是否和浏览器发来的一致
d2、使用密钥加密消息 , 回送
如果计算法hash值一致 , 握手成功
9、RabbitMQ消息堆积怎么处理?增加消费者的处理能力(例如优化代码) , 或减少发布频率
单纯升级硬件不是办法 , 只能起到一时的作用
考虑使用队列最大长度限制 , RabbitMQ 3.1支持
给消息设置年龄 , 超时就丢弃
默认情况下 , rabbitmq消费者为单线程串行消费 , 设置并发消费两个关键属性concurrentConsumers和prefetchCount , concurrentConsumers设置的是对每个listener在初始化的时候设置的并发消费者的个数 , prefetchCount是每次一次性从broker里面取的待消费的消息的个数


推荐阅读