1. C++实现线程安全的单例模式
懒汉模式:
class singleton
{
protected:
singleton()
{
pthread_mutex_init(&mutex);
}
private:
static singleton* p;
public:
static pthread_mutex_t mutex;
static singleton* initance();
};
pthread_mutex_t singleton::mutex;
singleton* singleton::p = NULL;
singleton* singleton::initance()
{
if (p == NULL)
{
pthread_mutex_lock(&mutex);
if (p == NULL)
p = new singleton();
pthread_mutex_unlock(&mutex);
}
return p;
}
2. 1-2n的数存储在空间为n的数组中,找出出现两次的数字,时间复杂度O(n),空间复杂度O(1)
/*
奇数零次 偶数零次 0
奇数 一次 偶数 零次 -1
奇数 两次 偶数 零次 -2
奇数 零次 偶数 一次-3
奇数 一次 偶数 一次-4
奇数 两次 偶数 一次-5
奇数 零次 偶数 两次-6
奇数一次 偶数 两次-7
奇数两次 偶数两次-8
*/
public class Main {
public static void main(String[] args) {
int[] nums = {1, 3, 5, 15, 7, 8, 5, 3, 6, 15};
findNumber(nums, nums.length);
print(nums);
}
public static void findNumber(int[] nums, int length) {
for (int i = 0; i < length; ) {
if (nums[i] <= 0){
i++;
continue;
}
int index = nums[i] / 2;
boolean isOdd = (nums[i] % 2 == 0) ? false : true;
switch (nums[index]) {
case 0:
if (isOdd == true) {
nums[index] = -1;
} else {
nums[index] = -3;
}
break;
case -1:
if (isOdd == true) {
nums[index] = -2;
} else {
nums[index] = -4;
}
break;
case -2:
nums[index] = -3;
break;
case -3:
if (isOdd == true) {
nums[index] = -4;
} else {
nums[index] = -6;
}
break;
case -4:
if (isOdd == true) {
nums[index] = -5;
} else {
nums[index] = -7;
}
break;
case -5:
nums[index] = -6;
break;
case -6:
nums[index] = -7;
break;
case -7:
nums[index] = -8;
break;
default:
swap(nums, i, index);
if (isOdd) {
nums[index] = -1;
} else {
nums[index] = -3;
}
continue;
}
nums[i++]=0;
}
}
public static void swap(int[] nums, int i, int j){
int temp =nums[i];
nums[i]=nums[j];
nums[j]=temp;
}
public static void print(int[] nums) {
for (int i = 0; i < nums.length; i++) {
if (nums[i] == -2) {
System.out.println(i * 2 + 1);
} else if (nums[i] == -6) {
System.out.println(i * 2);
} else if (nums[i] == -8) {
System.out.println(i * 2);
System.out.println(i * 2 + 1);
}
}
}
}
一线互联网大厂完整面试题及答案 关注公众号零声学院免费领取!
3. kafka中partition的工作原理?
Kafka集群partition replication默认自动分配分析
下面以Kafka集群中4个Broker举例,创建1个topic包含4个Partition,2 Replication;数据Producer流动如图所示:
当集群中新增2节点,Partition增加到6个时分布情况如下:
副本分配逻辑规则如下:
在Kafka集群中,每个Broker都有均等分配Partition的Leader机会。
上述图Broker Partition中,箭头指向为副本,以Partition-0为例:broker1中 parition-0为Leader,Broker2中Partition-0为副本。
上述图种每个Broker(按照BrokerId有序)依次分配主Partition,下一个Broker为副 本,如此循环迭代分配,多副本都遵循此规则。
副本分配算法如下:
将所有N Broker和待分配的i个Partition排序.
将第i个Partition分配到第(i mod n)个Broker上.
将第i个Partition的第j个副本分配到第((i + j) mod n)个Broker上.
4. shell脚本统计文件中单词的个数
方法一:
(1)cat file|sed ‘s/[,.:;/!?]/ /g’|awk '{for(i=1;i<=NF;i++)array[$i]++;}
END{for(i in array) print i,array[i]}’
#其中file为要操作的文件,sed中/ /间有一个空格。
(2)sed ‘s/[,.:;/!?]/ /g’ file|awk '{for(i=1;i<=NF;i++)array[$i]++;}
END{for(i in array) print i,array[i]}’
#(1)和(2)效果一致。
方法二:
(1)awk 'BEGIN{RS="[,.:;/!?]"}{for(i=1;i<=NF;i++)array[$i]++;}
END{for(i in array) print i,array[i]}’ file
5. linux下IPC有哪些
①匿名管道(PIPE)和有名管道(FIFO):最简单
②信号(SIGNAL):系统的开销最小
③共享映射区(MMAP):可以在无血缘关系的进程间通信
④本地套接字(SOCKET):最稳定(但是比较复杂)
- Redis 有哪些架构模式?
一、Redis单机模式
特点:简单,直接运行redis-server redis.conf即可(注意自己的redis-server文件和redis.conf文件的位置)。
缺点:1、内存容量有限 2、处理能力有限 3、无法高可用。
二、Redis主从复制模式
Redis 的复制(replication)功能允许用户根据一个 Redis 服务器来创建任意多个该服务器的复制品,其中被复制的服务器为主服务器(master),而通过复制创建出来的服务器复制品则为从服务器(slave)。 只要主从服务器之间的网络连接正常,主从服务器两者会具有相同的数据,主服务器就会一直将发生在自己身上的数据更新同步 给从服务器,从而一直保证主从服务器的数据相同。
特点:
1、master/slave 角色
2、master/slave 数据相同
3、降低 master 读压力在转交从库
缺点:
1、无法保证高可用
2、没有解决 master 写的压力
三、Redis哨兵(Sentinel)模式
3.1 哨兵模式概述
Redis sentinel 是一个分布式系统中监控 redis 主从服务器,并在主服务器下线时自动进行故障转移。
其中三个特性:
监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。
提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。
自动故障迁移(Automatic failover): 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作。
特点:
1、保证高可用
2、监控各个节点
3、自动故障迁移
缺点:
主从模式,切换需要时间丢数据
没有解决 master 写的压力
四、集群(proxy 型)模式
Twem proxy 是一个 Twitter 开源的一个 redis 和 memcache 快速/轻量级代理服务器; Twemproxy 是一个快速的单线程代理程>序,支持 Memcached ASCII 协议和 redis 协议。
特点:
1、多种 hash 算法:MD5、CRC16、CRC32、CRC32a、hsieh、murmur、Jenkins
2、支持失败节点自动删除
3、后端 Sharding 分片逻辑对业务透明,业务方的读写方式和操作单个 Redis 一致
缺点:
1、增加了新的 proxy,需要维护其高可用
2、failover 逻辑需要自己实现,其本身不能支持故障的自动转移可扩展性差,进行扩缩容都需要手动干预
五、集群(直连型)模式
从redis 3.0之后版本支持redis-cluster集群,Redis-Cluster采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和
其他所有节点连接。
特点:
1、无中心架构(不存在哪个节点影响性能瓶颈),少了 proxy 层。
2、数据按照 slot 存储分布在多个节点,节点间数据共享,可动态调整数据分布。
3、可扩展性,可线性扩展到 1000 个节点,节点可动态添加或删除。
4、高可用性,部分节点不可用时,集群仍可用。通过增加 Slave 做备份数据副本
5、实现故障自动 failover,节点之间通过 gossip 协议交换状态信息,用投票机制完成 Slave到 Master 的角色提升。
缺点:
1、资源隔离性较差,容易出现相互影响的情况。
2、数据通过异步复制,不保证数据的强一致性E