ARTS #71

Algorithm

63. 不同路徑 II

func uniquePathsWithObstacles(obstacleGrid [][]int) int {
    m := len(obstacleGrid)
    n := len(obstacleGrid[0])
    if obstacleGrid[0][0] == 1 || obstacleGrid[m-1][n-1] == 1 {
        return 0
    }
    results := make([][]int, m)
    for i := 0; i < m; i++ {
        results[i] = make([]int, n)
    }
    for i := 0; i < m; i++ {
        for j := 0; j < n; j++ {
            if i == 0 && j == 0 {
                results[i][j] = 1
                continue
            }
            if j == 0 {
                if obstacleGrid[i][j] == 0 {
                    results[i][j] = results[i-1][j]
                } else {
                    results[i][j] = 0
                }
                continue
            }
            if i == 0 {
                if obstacleGrid[i][j] == 0 {
                    results[i][j] = results[i][j-1]
                } else {
                    results[i][j] = 0
                }
                continue
            }
            if obstacleGrid[i][j] == 0 {
                results[i][j] = results[i][j-1] + results[i-1][j]
            } else {
                results[i][j] = 0
            }
        }
    }
    return results[m-1][n-1]
}

Review

Concurrency in Go: Channels and WaitGroups

TIP

限流的幾種實現(xiàn)方式

  1. 分布式限流奥此,所有機器實例通過對同一個redis key進行incres操作來達(dá)到分布式限流的目的。優(yōu)點是限流操作精準(zhǔn)雁比,不會有誤限情況稚虎。缺點是當(dāng)限流qps偏高之后,redis的讀寫將會成為瓶頸偎捎。
  2. 本地限流蠢终,設(shè)置一個整體限流值/機器實例數(shù),然后將這個平均得到的限流值分發(fā)到每個機器實例上茴她,每個機器實例上通過滑動窗口實現(xiàn)本地限流寻拂。優(yōu)點是適合大qps限流場景,操作簡單性能好丈牢。缺點是容易產(chǎn)生誤限(機器實例之間并不能保障完全負(fù)載均衡)祭钉。

Share

學(xué)習(xí)“redis設(shè)計與實現(xiàn)”

Redis 數(shù)據(jù)類型

為了讓基于類型的操作更加方便地執(zhí)行,Redis 創(chuàng)建了自己的類型系統(tǒng)己沛。

對象處理機制

  1. redis對于鍵所保存的值的類型(后簡稱“鍵的類型” )慌核,鍵能執(zhí)行的命令又各不相同Redis 必須讓每個鍵都帶有類型信息帕识,使得程序可以檢查鍵的類型,并為它選擇合適的處理方式遂铡。
  2. Redis 的每一種數(shù)據(jù)類型肮疗,比如字符串、列表扒接、有序集伪货,它們都擁有不只一種底層實現(xiàn)(Redis 內(nèi)部稱之為編碼,encoding)钾怔,所以redis需要根據(jù)數(shù)據(jù)類型的不同編碼進行多態(tài)處理碱呼。
    為了解決以上問題,Redis 構(gòu)建了自己的類型系統(tǒng)宗侦,這個系統(tǒng)的主要功能包括:
    ? redisObject 對象愚臀。
    ? 基于 redisObject 對象的類型檢查。
    ? 基于 redisObject 對象的顯式多態(tài)函數(shù)矾利。
    ? 對 redisObject 進行分配姑裂、共享和銷毀的機制。
redisObject 數(shù)據(jù)結(jié)構(gòu)男旗,以及 Redis 的數(shù)據(jù)類型
typedef struct redisObject {
  // 類型
  unsigned type:4;
  // 對齊位
  unsigned notused:2;
  // 編碼方式
  unsigned encoding:4;
  // LRU 時間(相對于 server.lruclock)
  unsigned lru:22;
  // 引用計數(shù)
  int refcount;
  // 指向?qū)ο蟮闹?  void *ptr;
} robj;
// type的枚舉
#define REDIS_STRING 0 // 字符串
#define REDIS_LIST 1 // 列表
#define REDIS_SET 2 // 集合
#define REDIS_ZSET 3 // 有序集
#define REDIS_HASH 4 // 哈希表
// encoding枚舉
#define REDIS_ENCODING_RAW 0 // 編碼為字符串
#define REDIS_ENCODING_INT 1 // 編碼為整數(shù)
#define REDIS_ENCODING_HT 2 // 編碼為哈希表
#define REDIS_ENCODING_ZIPMAP 3 // 編碼為 zipmap
#define REDIS_ENCODING_LINKEDLIST 4 // 編碼為雙端鏈表
#define REDIS_ENCODING_ZIPLIST 5 // 編碼為壓縮列表
#define REDIS_ENCODING_INTSET 6 // 編碼為整數(shù)集合
#define REDIS_ENCODING_SKIPLIST 7 // 編碼為跳躍表

redis所有的數(shù)據(jù)類型以及對應(yīng)的編碼類型


redis_type_and_encoding.png
命令的類型檢查和多態(tài)

當(dāng)執(zhí)行一個處理數(shù)據(jù)類型的命令時舶斧,Redis 執(zhí)行以下步驟:

  1. 根據(jù)給定 key ,在數(shù)據(jù)庫字典中查找和它相對應(yīng)的 redisObject 察皇,如果沒找到茴厉,就返回NULL 。
  2. 檢查 redisObject 的 type 屬性和執(zhí)行命令所需的類型是否相符什荣,如果不相符矾缓,返回類型錯誤。
  3. 根據(jù) redisObject 的 encoding 屬性所指定的編碼稻爬,選擇合適的操作函數(shù)來處理底層的數(shù)據(jù)結(jié)構(gòu)嗜闻。
  4. 返回數(shù)據(jù)結(jié)構(gòu)的操作結(jié)果作為命令的返回值。
對象共享

有一些對象在 Redis 中非常常見因篇,比如命令的返回值 OK 泞辐、ERROR 、WRONGTYPE 等字符竞滓,另外咐吼,一些小范圍的整數(shù),比如個位商佑、十位锯茄、百位的整數(shù)都非常常見。Redis 在內(nèi)部使用了一個 Flyweight 模式 :通過預(yù)分配一些常見的值對象,并在多個數(shù)據(jù)結(jié)構(gòu)之間共享這些對象肌幽,程序避免了重復(fù)分配的麻煩晚碾,也節(jié)約了一些 CPU時間。個人理解就是一個全局不可變的常量共享喂急,并通過指針到需要的時候獲取到相對應(yīng)的值格嘁。

引用計數(shù)以及對象的銷毀

為了及時對redisObject所占用的內(nèi)存進行回收,Redis 的對象系統(tǒng)使用了引用計數(shù)技術(shù)來負(fù)責(zé)維持和銷毀對象(就是自己實現(xiàn)了一套GC)廊移,它的運作機制如下:
? 每個 redisObject 結(jié)構(gòu)都帶有一個 refcount 屬性糕簿,指示這個對象被引用了多少次。
? 當(dāng)新創(chuàng)建一個對象時狡孔,它的 refcount 屬性被設(shè)置為 1 懂诗。
? 當(dāng)對一個對象進行共享時,Redis 將這個對象的 refcount 增一苗膝。
? 當(dāng)使用完一個對象之后殃恒,或者取消對共享對象的引用之后,程序?qū)ο蟮?refcount 減一辱揭。
? 當(dāng)對象的 refcount 降至 0 時离唐,這個 redisObject 結(jié)構(gòu),以及它所引用的數(shù)據(jù)結(jié)構(gòu)的內(nèi)存界阁,都會被釋放侯繁。

字符串

字符串編碼

字符串類型分別使用 REDIS_ENCODING_INT 和 REDIS_ENCODING_RAW 兩種編碼:
? REDIS_ENCODING_INT 使用 long 類型來保存 long 類型值胖喳。
? REDIS_ENCODING_RAW 則使用 sdshdr 結(jié)構(gòu)來保存 sds (也即是 char* )泡躯、long long 、double 和 long double 類型值丽焊。

換句話來說较剃,在 Redis 中,只有能表示為 long 類型的值技健,才會以整數(shù)的形式保存写穴,其他類型的整數(shù)、小數(shù)和字符串雌贱,都是用 sdshdr 結(jié)構(gòu)來保存啊送。
新創(chuàng)建的字符串默認(rèn)使用 REDIS_ENCODING_RAW 編碼,在將字符串作為鍵或者值保存進數(shù)據(jù)庫時欣孤,程序會嘗試將字符串轉(zhuǎn)為 REDIS_ENCODING_INT 編碼馋没。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市降传,隨后出現(xiàn)的幾起案子篷朵,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件声旺,死亡現(xiàn)場離奇詭異笔链,居然都是意外死亡,警方通過查閱死者的電腦和手機腮猖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進店門鉴扫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人澈缺,你說我怎么就攤上這事幔妨。” “怎么了谍椅?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵误堡,是天一觀的道長。 經(jīng)常有香客問我雏吭,道長锁施,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任杖们,我火速辦了婚禮悉抵,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘摘完。我一直安慰自己姥饰,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布孝治。 她就那樣靜靜地躺著列粪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪谈飒。 梳的紋絲不亂的頭發(fā)上岂座,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天,我揣著相機與錄音杭措,去河邊找鬼费什。 笑死,一個胖子當(dāng)著我的面吹牛手素,可吹牛的內(nèi)容都是我干的鸳址。 我是一名探鬼主播,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼泉懦,長吁一口氣:“原來是場噩夢啊……” “哼稿黍!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起祠斧,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤闻察,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體辕漂,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡呢灶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了钉嘹。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鸯乃。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖跋涣,靈堂內(nèi)的尸體忽然破棺而出缨睡,到底是詐尸還是另有隱情,我是刑警寧澤陈辱,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布奖年,位于F島的核電站,受9級特大地震影響沛贪,放射性物質(zhì)發(fā)生泄漏陋守。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一利赋、第九天 我趴在偏房一處隱蔽的房頂上張望水评。 院中可真熱鬧,春花似錦媚送、人聲如沸中燥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽疗涉。三九已至,卻和暖如春式塌,著一層夾襖步出監(jiān)牢的瞬間博敬,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工峰尝, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人收恢。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓武学,卻偏偏與公主長得像,于是被迫代替她去往敵國和親伦意。 傳聞我的和親對象是個殘疾皇子火窒,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,630評論 2 359

推薦閱讀更多精彩內(nèi)容