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の配列に格納され、2回出現する数が検出されます。時間の複雑さは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でパーティションはどのように機能しますか?
Kafkaクラスターパーティションレプリケーションのデフォルトの自動割り当て分析
以下は、Kafkaクラスター内の4つのブローカーの例です。トピックの作成には、4つのパーティションと2つのレプリケーションが含まれます。データプロデューサーのフローを図に示します。
2つのノードがクラスターに追加され、パーティションが6に増加すると、分布は次のようになります。
コピー割り当ての論理ルールは次のとおりです。
Kafkaクラスターでは、各ブローカーにパーティションリーダーを割り当てる機会が均等にあります。
上の図のブローカーパーティションでは、矢印がコピーを指しています。例として、Partition-0を取り上げます。broker1のpartition-0がリーダーで、Broker2のPartition-0がコピーです。
上の図では、各ブローカー(BrokerIdに従って順序付けられている)が順番にメインパーティションを割り当て、次のブローカーがコピーです。このように、繰り返し割り当てられ、複数のコピーがこのルールに従います。
コピー割り当てアルゴリズムは次のとおりです。
割り当てるすべてのNブローカーとiパーティションを並べ替えます。
i番目のパーティションを(i mod n)番目のブローカーに割り当てます。
i番目のパーティションのj番目のコピーを((i + j)mod n)ブローカーに割り当てます。
4.シェルスクリプトはファイル内の単語数をカウントします
方法1:
(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)は同じ効果があります。
方法2:
(1)awk'BEGIN {RS = "[、。:; /!?]"} {for(i = 1; i <= NF; i ++)array [$ i] ++;}
END {for(i in array)print i、array [i]} 'ファイル
5.linuxでのIPCとは
①匿名パイプ(PIPE)と有名パイプ(FIFO):最も単純な
②信号(SIGNAL):システムのオーバーヘッドが最小
③共有マッピングエリア(MMAP):無関係なプロセス間で通信できます
④ローカルソケット(SOCKET):最も安定しています(ただし、より複雑です)
- Redisの建築パターンは何ですか?
1つは、Redisスタンドアロンモードです
機能:シンプルで、redis-server redis.confを直接実行するだけです(redis-serverファイルとredis.confファイルの場所に注意してください)。
短所:1。メモリ容量の制限2.処理能力の制限3.高可用性がありません。
2、Redisマスタースレーブレプリケーションモード
Redisのレプリケーション機能により、ユーザーはRedisサーバーに基づいてサーバーのレプリカをいくつでも作成できます。レプリケートされたサーバーはマスターサーバーであり、レプリケーションによって作成されたサーバーレプリカはスレーブサーバーです(スレーブ)。マスターサーバーとスレーブサーバー間のネットワーク接続が正常である限り、マスターサーバーとスレーブサーバーの両方に同じデータがあり、マスターサーバーは常に発生するデータ更新をスレーブサーバーに同期するため、マスターサーバーとスレーブサーバーのデータが同じになります。
特徴:
1.マスター/スレーブの役割
2.マスター/スレーブデータは同じです
3.スレーブライブラリに転送する際のマスター読み取りの圧力を軽減します
短所:
1.高い可用性は保証できません
2.マスターライティングのプレッシャーを解決しなかった
3、Redisセンチネル(センチネル)モード
3.1センチネルモードの概要
Redis sentinelは、redisマスターサーバーとスレーブサーバーを監視し、マスターサーバーがオフラインになると自動的にフェイルオーバーする分散システムです。
特徴の3つ:
監視:Sentinelは、マスターサーバーとスレーブサーバーが正常に動作しているかどうかを常にチェックします。
通知:監視対象のRedisサーバーに問題がある場合、SentinelはAPIを介して管理者または他のアプリケーションに通知を送信できます。
自動フェイルオーバー:プライマリサーバーが正常に機能しない場合、Sentinelは自動フェイルオーバー操作を開始します。
特徴:
1.高可用性を確保する
2.各ノードを監視します
3.自動障害移行
短所:
マスタースレーブモード、切り替えにはデータが失われるまで時間がかかります
マスターライティングのプレッシャーを解決しなかった
4.クラスター(プロキシタイプ)モード
Twemプロキシは、Twitterがオープンソースとするredisおよびmemcache用の高速/軽量プロキシサーバーです。Twemproxyは、MemcachedASCIIプロトコルおよびredisプロトコルをサポートする高速シングルスレッドプロキシプログラムです。
特徴:
1.複数のハッシュアルゴリズム:MD5、CRC16、CRC32、CRC32a、hsieh、murmur、Jenkins
2.失敗したノードの自動削除をサポートします
3.バックエンドのシャーディングシャーディングロジックはビジネスに対して透過的であり、ビジネス側の読み取りおよび書き込みメソッドは単一のRedisの操作と一貫性があります。
短所:
1.新しいプロキシが追加され、その高い可用性を維持する必要があります
2.フェイルオーバーロジックはそれ自体で実装する必要があり、障害の自動転送をサポートできません。スケーラビリティが低く、拡張と縮小には手動による介入が必要です。
5.クラスター(直接接続)モード
redis 3.0以降のバージョンは、redis-clusterクラスターをサポートします。Redis-Clusterは非集中構造を採用しています。各ノードはデータとクラスター状態全体を保存し、各ノードは調和しています。
他のすべてのノードは接続されています。
特徴:
1.中央アーキテクチャがなく(ノードがパフォーマンスのボトルネックに影響を与えない)、プロキシレイヤーがありません。
2.スロットに応じて複数のノードにデータを格納し、ノード間でデータを共有し、データの分散を動的に調整できます。
3.スケーラビリティ、1000ノードへの線形拡張、ノードは動的に追加または削除できます。
4.高可用性。一部のノードが使用できない場合でも、クラスターは引き続き使用できます。スレーブを追加してバックアップデータのコピーを作成します
5.障害の自動フェイルオーバーを実現し、ゴシッププロトコルを介してノード間でステータス情報を交換し、投票メカニズムを使用してスレーブからマスターへの役割のアップグレードを完了します。
短所:
1.リソースの分離が不十分であり、相互の影響が発生しやすい。
2.データは非同期で複製され、強力なデータの一貫性は保証されません。