真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

redis字符串的底層源碼以及應用實例-創(chuàng)新互聯(lián)

內(nèi)部編碼

創(chuàng)新互聯(lián)建站是一家專注于網(wǎng)站設(shè)計、成都做網(wǎng)站與策劃設(shè)計,龍?zhí)毒W(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)建站做網(wǎng)站,專注于網(wǎng)站建設(shè)十余年,網(wǎng)設(shè)計領(lǐng)域的專業(yè)建站公司;建站業(yè)務涵蓋:龍?zhí)兜鹊貐^(qū)。龍?zhí)蹲鼍W(wǎng)站價格咨詢:13518219792
  • int 8個字節(jié)的長整型
  • embstr 小于等于39個字節(jié)的字符串
  • raw 大于39個字節(jié)的字符串

string底層使用的sds自定義的字符串,因為c語言中string默認為\0為結(jié)尾,而redis有可能會傳輸視頻流或者其他的數(shù)據(jù),有可能會出現(xiàn)nam\0orxxxx這種,但是如果使用c默認的字符串,只會讀取到name就會截止。

struct sdshdr {int len;    //存儲的長度
        int free;  //剩余的空閑空間
        char buf[]; //數(shù)據(jù)存儲的地方
    };

這種數(shù)據(jù)結(jié)構(gòu)的好處是:
1.對于存儲數(shù)據(jù)的準確性更高了,依靠len字段來標明準確數(shù)據(jù)的位置?!径M制安全的數(shù)據(jù)結(jié)構(gòu)】
2.采用以空間換時間的方式,每次擴容的時候可以適當分配大一點的空間,記錄剩余時間是否夠下一次的修改或者追加。(減少對象的銷毀與創(chuàng)建的步驟)【提供了內(nèi)存預分配機制,避免了頻繁的內(nèi)存分配】
3.會在數(shù)據(jù)末尾依舊采用\0作為結(jié)尾【兼容C語言的函數(shù)庫】

//redis 3.2 以前
struct sdshdr {int len;
    int free;
    char buf[];
};
//redis 3.2 后
//redis\deps\hiredis\sds.h文件
typedef char *sds;

//存在注釋:sdshdr5 is never used, we just access the flags byte directly.However is here to document the layout of type 5 SDS strings. 
//意思大概是:sdshdr5從未使用過,我們只是直接訪問標志字節(jié)。然而,這里是為了記錄類型5 SDS字符串的布局
struct __attribute__ ((__packed__)) sdshdr5 {// 對應的字符串長度小于 1<<5
    unsigned char flags; 
    char buf[];
};

//__attribute__ ((packed)) 的作用就是告訴編譯器取消結(jié)構(gòu)體在編譯過程的優(yōu)化對齊,按照實際占用字節(jié)數(shù)進行對齊

struct __attribute__ ((__packed__)) sdshdr8 {// 對應的字符串長度小于 1<<8
    uint8_t len;                              //目前字符串的長度
    uint8_t alloc;                            //分配的內(nèi)存總長度
    unsigned char flags;                      //flag用3bit來標明類型,類型后續(xù)解釋,其余5bit目前沒有使用
    char buf[];                               //柔性數(shù)組,以'\0'結(jié)尾
};
struct __attribute__ ((__packed__)) sdshdr16 {// 對應的字符串長度小于 1<<16
    uint16_t len; 
    uint16_t alloc; 
    unsigned char flags; 
    char buf[];
};
struct __attribute__ ((__packed__)) sdshdr32 {// 對應的字符串長度小于 1<<32
    uint32_t len; 
    uint32_t alloc; 
    unsigned char flags; 
    char buf[];
};
struct __attribute__ ((__packed__)) sdshdr64 {// 對應的字符串長度小于 1<<64
    uint64_t len; 
    uint64_t alloc; 
    unsigned char flags; 
    char buf[];
};

#define SDS_TYPE_5  0
#define SDS_TYPE_8  1
#define SDS_TYPE_16 2
#define SDS_TYPE_32 3
#define SDS_TYPE_64 4

static inline char sdsReqType(size_t string_size) {if (string_size< 1<<5)
        return SDS_TYPE_5;
    if (string_size< 1<<8)
        return SDS_TYPE_8;
    if (string_size< 1<<16)
        return SDS_TYPE_16;
#if (LONG_MAX == LLONG_MAX)  
    if (string_size< 1ll<<32)
        return SDS_TYPE_32;
    return SDS_TYPE_64;
#else
    return SDS_TYPE_32;
#endif
}

String限制512mb從何而來

//位于t_string.c文件中
//為什么要限制,要知道512M已經(jīng)是一個很大的值了(已經(jīng)是一個bigkey了),在redis單線程操作中已經(jīng)很容易阻塞線程
//故在追加命令appendCommand和設(shè)置命令setrangeCommand中都會進行校驗
static int checkStringLength(client *c, long long size) {if (size >512*1024*1024) {addReplyError(c,"string exceeds maximum allowed size (512MB)");
        return C_ERR;
    }
    return C_OK;
}

2.2.3典型的使用場景

  • 用戶登錄

比較典型的緩存使用場景,其中Redis作為緩存層,MySQL作為存儲層,絕大部分請求的數(shù)據(jù)都是從Redis中獲取。由于Redis具有支撐高并發(fā)的特性,所以緩存通常能起到加速讀寫和降低后端壓力的作用。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-yZlyNhVV-1669996987204)(/file/tupian/20221206/favicon.ico)]

UserInfo getUserInfo(Long id){}
//首先先從redis里面獲取用戶信息
userRedisKey ="user:info"+id;
value = jedis.get(userRedisKey);
if(value!=null){userInfo = deserialize(value);
    return userInfo;
}
//如果沒有在redis中找到用戶信息,則從mysql數(shù)據(jù)庫里查找
UserInfo getUserInfo(long id){userRedisKey = "user:info:" + id
    value = redis.get(userRedisKey);
    UserInfo userInfo;
    if (value != null) {userInfo = deserialize(value); 
    } else {userInfo = mysql.get(id);
        if (userInfo != null)
            redis.setex(userRedisKey, 3600, serialize(userInfo));
    }
    return userInfo;
}
  • 計數(shù)

許多應用都會使用Redis作為計數(shù)的基礎(chǔ)工具,它可以實現(xiàn)快速計數(shù)、查詢緩存的功能,同時數(shù)據(jù)可以異步落地到其他數(shù)據(jù)源。例如筆者所在團隊的視頻播放數(shù)系統(tǒng)就是使用Redis作為視頻播放數(shù)計數(shù)的基礎(chǔ)組件,用戶每播放一次視頻,相應的視頻播放數(shù)就會自增1:

long incrVideoCounter(long id) {key = "video:playCount:" + id;
    return redis.incr(key);
}
  • 共享session
  • 驗證碼限速 時間+次數(shù)

你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧


分享文章:redis字符串的底層源碼以及應用實例-創(chuàng)新互聯(lián)
瀏覽地址:http://weahome.cn/article/jpcoo.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部