redis學習筆記

來源:互聯網
上載者:User

  

摘錄些nosqlfans上看的資源(http://blog.nosqlfan.com/html/3537.html),用了一年了,只會安裝、啟動和get set,真的不好意思說會redis

REmote DIctionary Server(Redis) 是一個由Salvatore Sanfilippo寫的key-value儲存系統,他為VMWare 公司工作,主要就是進行Redis的開發。 Blizzard (暴雪)使用8節點的Redis來為 WoW (魔獸爭霸)提供Avatar服務。

一、redis啟動初探

http://pauladamsmith.com/blog/2011/03/redis_get_set.html 原文 

  1. redis 啟動圖  

  2.  redisServer是main函數啟動的redis執行個體,包含屬性:
    -general server state
    -statistics
    -configuration from config file
    -replication
    -sort parameters
    -virtual memory config, state, I/O threads, & stats
    -zip structure
    -event loop helpers ,事件模型預設是epoll on Linux, kqueue on BSD, 若沒有開啟則使用select方式
    -pub/sub

     append-only file (AOF) ,(追加式的動作記錄記錄,appendonly yes 開啟日誌),作用和rdb檔案類似,用於儲存上次redis 會話資料

  3. redis請求處理模型:

    Redis starts up by initializing a global server state variable, and reading in an optional configuration file to override any defaults. It sets up a global command table that connects command names with the actual function that implements the command. It creates an event loop using the best available underlying system library for event/readiness notification, and registers a handler function for when there is a new client socket connection to accept. It also registers a periodic (i.e., time-based) event handler for dealing with cron-like tasks like key expiry that need to be addressed outside the regular client-handling path. Once a client has connected, a function is registered on the event loop for being notified when the client has data to be read (i.e., a query for a command). The client’s query is parsed and a command handler is called to execute the command and write the response back to the client (the writing of data to the client is also handled by the event-notification loop). The client object is reset and server is ready to process more queries.

二、 使用gdb分析get set command

GDB是GNU開源組織發布的一個強大的UNIX下的程式調試工具。  http://pauladamsmith.com/blog/2011/03/redis_get_set.html  介紹了使用gdb加斷點跟蹤GET和SET

redis-cli  使用 redisContext封裝相關串連狀態,hiredis.h(deps目錄)定義了 redisContext, obuf 欄位存放redis-cli輸入的原生命令

redis_client.get('users:1234')  和 命令列指令 get users:1234 一樣,會發送  *2\r\n$3\r\nget\r\n$10\r\nusers:1234\r\n   位元組串到伺服器 

伺服器端redis-server  為每個用戶端建立buffer,將位元組流擴充至buffer中,執行方法readQueryFromClient 接收資料。  然後根據請求方式 lookupCommand(c->argv[0]->ptr),

從command的定義中可找到get方法

 

struct redisCommand readonlyCommandTable[] = {
{"get",getCommand,2,0,NULL,1,1,1},

 getCommand 是getGenericCommand方法的封裝,找到對應方法後,執行,從資料庫中尋找key對應的value:

# db.c:58
robj *lookupKeyReadOrReply(redisClient *c, robj *key, robj *reply) {
robj *o = lookupKeyRead(c->db, key);
if (!o) addReply(c,reply);
return o;
}

redis使用自己的hash table在記憶體中儲存key-value對,在db對象中,dict欄位指向當前庫的hash值(redis一個執行個體可以有16個庫)

redis調用dictFind方法(dict.c)在資料庫的hashtable中尋找對應值。

 

SET流程與此類似,調用dictAdd方法設定key-value對。

三、redis源碼分析

(1)redis replication (http://www.hoterran.info/redis_replication)

 

(2)redis 持久化(http://www.hoterran.info/redis_persistence)

redis有全量(save/bgsave)和增量(aof)的持久化命令。

全量的原理就是遍曆裡所有的DB,在每個bucket,讀取鏈表的key和value並寫入dump.rdb檔案(rdb.c 405)。

save命令直接調度rdbSave函數,這會阻塞主線程的工作,通常我們使用bgsave。

sync:當master接收到slave發來的該命令的時候,會執行rdbSaveBackground

增量備份就是aof,原理有點類似redo log。每次執行命令後如出現資料變化,會調用feedAppendOnlyFile,把資料寫到server.aofbuf裡。aof最大的問題就是隨著時間append file會變的很大,所以我們需要bgrewriteaof命令重新整理檔案,只保留最新的kv資料。

(3)redis rehash(http://www.yiihsia.com/2011/04/redis源碼分析-如何rehash/)

rehash有2種工作模式
lazy rehashing:在每次對dict進行操作的時候執行一個slot的rehash
active rehashing:每100ms裡面使用1ms時間進行rehash。
什麼時候dict做擴容?
在資料插入的時候會調用dictKeyIndex,該方法裡會調用_dictExpandIfNeeded,判斷dict是否需要rehash,當dict中元素大於桶的個數時,調用dictExpand擴充hash。dictExpand的工作主要是初始化hash表,預設是擴大兩倍(並不單純是桶的兩倍),然後賦值給ht[1],然後狀態改為rehashing,此時該dict開始rehashing
四、redis基本結構

  • 實值型別:
    二進位安全的 字串 string
    二進位安全的 字串列表 list of string
    二進位安全的 字串集合 set of string,換言之:它是一組無重複未排序的element。可以把它看成Ruby中的 hash–其key等於element,value都等於’true‘。
    有序集合sorted set of string,類似於集合set,但其中每個元素都和一個浮點數score(評分)關聯。element根據score排序。可以把它看成Ruby中的 hash–其key等於element,value等於score,但元素總是按score的順序排列,無需額外的排序操作。  
  • 鍵類型:
    Redis key值是二進位安全的,這意味著可以用任何二進位序列作為key值,從形如”foo”的簡單字串到一個JPEG檔案的內容都可以。Null 字元串也是有效key值。
  • 列表:
      LPUSH 命令可向list的左邊(頭部)添加一個新元素,而RPUSH命令可向list的右邊(尾部)添加一個新元素。最後LRANGE 命令可從list中取出一定範圍的元素,
      如 lrange messages 0 2
  • 集合
    Redis集合是未排序的集合,其元素是二進位安全的字串。SADD命令可以向集合添加一個新元素。和sets相關的操作也有許多,比如檢測某個元素是否存在,以及實現交集,並集,差集等等。sadd添加 smembers擷取所有 sismember 監測是否是成員集合

    子交並補等操作
    redis 127.0.0.1:6379> SINTER birds mammals
    1) "bat"
    redis 127.0.0.1:6379> SUNION birds mammals
    1) "crow"
    2) "bat"
    3) "human"
    4) "pigeon"
    5) "dog"
    redis 127.0.0.1:6379> SDIFF birds mammals
    1) "crow"
    2) "pigeon"

  • 有序集合

    有序集合 帶有關聯的score,以及一個類似LRANGE的操作可以返回有序元素,ZRANGE  ZREVRANGE 命令 可作用於有序集合 。 有序集合從某種程度上說是SQL世界的索引在Redis中的等價物

    zadd hackers 1940 "Alan Kay"

     zrange hackers 0 -1

    zrevrange hackers 0 -1

    zrangebyscore hackers -inf 1950    #擷取所有1950年之前出生的人

    zremrangebyscore hackers 1940 1960  #刪除生日介於1940到1960年之間的駭客。

  • Hash類型

    Redis能夠儲存key對多個屬性的資料(比如user1.uname user1.passwd)
    redis 127.0.0.1:6379> HKEYS student
    1) "name"
    2) "age"
    3) "sex"
    redis 127.0.0.1:6379> HVALS student
    1) "Ganesh"
    2) "30"
    3) "Male"
    redis 127.0.0.1:6379> HGETALL student
    1) "name"
    2) "Ganesh"
    3) "age"
    4) "30"
    5) "sex"
    6) "Male"
    redis 127.0.0.1:6379> HDEL student sex
    (integer) 1
    redis 127.0.0.1:6379> HGETALL student
    1) "name"
    2) "Ganesh"
    3) "age"
    4) "30"
    Hash資料結構能夠批量修改和擷取
    redis 127.0.0.1:6379> HMSET kid name Akshi age 2 sex Female
    OK
    redis 127.0.0.1:6379> HMGET kid name age sex
    1) "Akshi"
    2) "2"
    3) "Female"

    更多可參考 redis命令 http://redis.io/commands/ 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.