關於 Redis 的閒扯

剛換工做不久,這段時間主要的工做就是開發 Nodejs,用了不少 redis。隨便聊聊 Redis 一些使用經驗,若是有不妥或者錯誤之處,歡迎指正。html

Redis 自身的特點:redis

  1. 全部操做均爲原子操做,即不可分割操做。
  2. 一般爲單進程,內部爲隊列實現,可是因爲直接操做內存,因此很快。
  3. 支持多種數據結構(相對memcached)。
  4. 默認有定時寫入硬盤功能。
  5. 等等(參考http://blog.nosqlfan.com/html/3537.html

先說說第四點,若是如今忽然重啓 redis,redis 裏面還會有數據,可是這些數據是 redis 重啓前最後一次寫入硬盤的數據,也就是存在着數據過時的狀況。因此能夠了解下強制 BGSAVE 後重啓這樣。sql

參考文章:http://redis.readthedocs.org/en/latest/topic/persistence.html數據結構

前面三個就用此次的項目來聊聊,此次的業務主要是針對高併發下的抽獎。先看一段代碼:併發

redis.hmget('user_xxxx', 'draw_time', function (err, draw_time){
    if(!err && draw_time < 6){
        doSomething();
        redis.hmset('user_xxxx', 'draw_time', draw_time + 1, doSomethingElse);
        return;
    }
    ...
});

若是如今同時有 1000 個請求同時過來,頗有可能在第一個請求執行 hmset 成功前有其餘不少的請求會過來,由於此時draw_time頗有可能仍是0,那針對該用戶的 doSomething 會遠超過六次。nosql

瞭解下 Hash 結構的操做,會發現 HINCRBY 和 HINCRBYFLOAT 這樣能夠直接針對 HASH 的鍵值進行增減的操做。上面的代碼就能夠簡化成:memcached

redis.hincryb('user_xxx', 'draw_time', 1, function (err, draw_time){
    if(!err && draw_time < 7){
        doSomething();
        return;
    }
    ...
});

固然,redis 還有其餘不少很方便的操做,例如針對 String 類型的增減,以及 LIST 的 POP 這樣的類型。同時 redis 還支持 multi 這樣的事務。高併發

先說這麼多,總之用的越多越喜歡 redis。code

相關文章
相關標籤/搜索