hiredisは、分散ロックを達成します

図1に示すように、分散ロック・テスト・コードをhiredis

書式#include <stdio.hに> 
する#include <stdlib.h>に含ま
する#include < 文字列の.h> 
書式#include <unistd.h> 
の#include <TIME.H> 

書式#include <hiredis.h>
 / * 
の#define REDIS_REPLY_STRING 1 
の#define REDIS_REPLY_ARRAY 2 
の#define REDIS_REPLY_INTEGER 3 
の#define REDIS_REPLY_NIL 4 
の#define REDIS_REPLY_STATUS 5 
の#define REDIS_REPLY_ERROR 6 
* / 

int型のmain(int型 ARGC、チャー ** ARGV){ 
        符号なしのint J。
        redisContext * C; 
        redisReply* 返信。
        const  のchar *ホスト名=(のargc> 1)?ARGV [ 1 ]:" 127.0.0.1 " int型ポート=(のargc> 2)?ATOI(ARGV [ 2 ]):6379 

        構造体体timevalタイムアウト= { 1500000 }。// 1.5秒 
        C = redisConnectWithTimeout(ホスト名、ポート、タイムアウト);
        もし(C == NULL || C-> ERR){
                 場合(C){ 
                        のprintf("接続エラー:%S \ n "C-> errstrは); 
                        redisFree(C); 
                } { 
                        のprintf(" 接続エラー:Redisのコンテキストを割り当てることができない\ n " ); 
                } 
                出口(1 ); 
        } 

        // * *********************セットロック********************** 
        にsrand((符号なし)時間(NULL));
         INT randomvalue =ランド()%1000000 ;
         チャー S [ 10 ]; 
        sprintfの(S、" %のD "、randomvalue)。
        ながら、1 
        { 
                返信 = redisCommand(C、" セットロック%d個のEX%D NX "、randomvalue、20)。    // 20S 
                のprintf(" SETロック:タイプ=%dの整数=%LLD、STR =%S \ n "、reply->タイプ、reply->整数、reply-> STR)。
                もし(reply->タイプ!= REDIS_REPLY_NIL &&のstrcmp(reply-> STR、" OK ")== 0 ){ 
                        のprintf(" SETロックOK \ nは");
                        freeReplyObject(返信)。
                        休憩; 
                } 
                { 
                        printf関数は、(" セットロックが失敗した\ n " ); 
                        freeReplyObject(返信)。
                        睡眠(1 )。
                        続け; 
                } 
        } 
        // ********************************************** *******
         // **********************プロセス****************** ****
         // ロック取得 
        応答= redisCommand(C、" GETロックを");
        printf(" GETロック:整数=%LLD、STR =%S \ n "、reply->整数、reply-> STR)。
        freeReplyObject(返信)。

        // TTLロック 
        応答= redisCommand(C、" TTLロック" )。
        printf(" TTLロック:整数=%LLD、STR =%S \ n "、reply->整数、reply-> STR)。
        freeReplyObject(返信)。

        睡眠(5 );
        // ************************************************ *****
         // **********************・デル・ロック******************* ** 
        返信= redisCommand(C、"GETロック" );
         場合(のstrcmp(reply-> STR、S)== 0 ){ 
                返信 = redisCommand(C、" DELロック" ); 
                のprintf(" DELロック:整数=%LLD、STR =%S \ nは"、reply->整数、reply-> STR); 
        } 
        freeReplyObject(返信); 
        // ***************************** ************************ 

        // 切断及び解放し、コンテキスト
        redisFree(C); 

        戻り 0 ; 

}

 

2、テスト出力

(1)反復clie1

SETのロック:種類= 5、整数= 0、STR = OK 
SETのロックOK 
GETのロック:整数= 0、STR = 397618 
TTLのロック:整数= 20、STR =(NULL 
DELのロック:整数= 1、STR =(NULL

(2)反復clie2

SETのロック:種類= 4、整数= 0、STR =(ヌルセットの ロックに失敗しました
SETのロック:種類= 4、整数= 0、STR =(ヌルセットの ロックが失敗した
SETのロック:種類= 4、整数= 0、STR =(ヌルセットの ロックに失敗しました
SETのロック:種類= 4 =、整数0は、STR =(ヌルセットの ロックが失敗しました
SETロック:種類= 5、整数= 0、STR = OK 
SETのロックOK 
GETのロック:整数= 0、STR = 763395 
TTLのロック:整数= 20、STR =(NULL 
DELのロック:整数= 1、STR =(NULL

 

 

おすすめ

転載: www.cnblogs.com/mytrace/p/11988757.html