標籤:
官網
http://redis.io/
和Memcached類似,但是解決了斷電後資料完全丟失的情況,也就是資料的持久性。而且支援更多value類型,除了和string外,還支援hash、lists(鏈表)、sets(集合)和sorted sets(有序集合)幾種資料類型。
redis目前提供五種資料類型
string是最簡單的類型,你可以理解成與Memcached一樣的類型,一個key對應一個value,其上支援的操作與Memcached的操作類似。但它的功能更豐富。
樣本:
# redis-cli set key1 "aminglinux.com"
OK
# redis-cli get key1
"aminglinux.com"
list是一個鏈表結構,主要功能是push、pop、擷取一個範圍的所有值等等。操作中key理解為鏈表的名字。使用 List 結構,我們可以輕鬆地實現最新訊息排行等功能(比如新浪微博的 TimeLine )。List 的另一個應用就是訊息佇列,可以利用 List 的 *PUSH 操作,將任務存在 List 中,然後背景工作執行緒再用 POP 操作將任務取出進行執行。Redis 還提供了操作 List 中某一段元素的 API,你可以直接查詢,刪除 List 中某一段的元素。
樣本:
[[email protected] ~]# redis-cli rpush mylist "aaaa bbb." (從右插入 lpush從左插入)
(integer) 1
[[email protected] ~]# redis-cli rpush mylist "1 2 3."
(integer) 2
[[email protected] ~]# redis-cli rpush mylist "aminglinux."
(integer) 3
[[email protected] ~]# redis-cli lrange mylist 0 2
1) "aaaa bbb."
2) "1 2 3."
3) "aminglinux."
[[email protected] ~]# redis-cli lrange mylist 0 1
1) "aaaa bbb."
2) "1 2 3."
set是集合,和我們數學中的集合概念相似,對集合的操作有添加刪除元素,有對多個集合求交並差等操作。操作中key理解為集合的名字。比如在微博應用中,可以將一個使用者所有的關注人存在一個集合中,將其所有粉絲存在一個集合。因為 Redis 非常人性化的為集合提供了求交集、並集、差集等操作,那麼就可以非常方便的實現如共同關注、共同喜好、二度好友等功能,對上面的所有集合操作,你還可以使用不同的命令選擇將結果返回給用戶端還是存集到一個新的集合中。(隨機排序)
[[email protected] ~]# redis-cli sadd myset a
(integer) 1
[[email protected] ~]# redis-cli sadd myset b
(integer) 1
[[email protected] ~]# redis-cli sadd myset d
(integer) 1
[[email protected] ~]# redis-cli smembers myset
1) "b"
2) "d"
3) "a"
sorted set是有序集合,它比set多了一個權重參數score,使得集合中的元素能夠按 score 進行有序排列,比如一個儲存全班同學成績的 Sorted Sets,其集合 value 可以是同學的學號,而 score 就可以是其考試得分,這樣在資料插入集合的時候,就已經進行了天然的排序。另外還可以用 Sorted Sets 來做帶權重的隊列,比如普通訊息的 score 為1,重要訊息的 score 為2,然後背景工作執行緒可以選擇按 score 的倒序來擷取工作任務。讓重要的任務優先執行。
[[email protected] ~]# redis-cli zadd aming 12 "abc"
(integer) 1
[[email protected] ~]# redis-cli zadd aming 2 "cde 123"
(integer) 1
[[email protected] ~]# redis-cli zadd aming 24 "123-aaa"
(integer) 1
[[email protected] ~]# redis-cli zadd aming 4 "a123a"
(integer) 1
[[email protected] ~]# redis-cli zrange aming 0 -1 (正序)
1) "cde 123"
2) "a123a"
3) "abc"
4) "123-aaa"
倒序
[[email protected] ~]# redis-cli zrevrange aming 0 -1
1) "123-aaa"
2) "abc"
3) "a123a"
4) "cde 123"
Hash資料類型,在 Memcached 中,我們經常將一些結構化的資訊打包成 hashmap,在用戶端序列化後儲存為一個字串的值(一般是 JSON 格式),比如使用者的暱稱、年齡、性別、積分等。這時候在需要修改其中某一項時,通常需要將字串(JSON)取出來,然後進行還原序列化,修改某一項的值,再序列化成字串(JSON)儲存回去。簡單修改一個屬性就幹這麼多事情,消耗必定是很大的,也不適用於一些可能並行作業的場合(比如兩個並發的操作都需要修改積分)。而 Redis 的 Hash 結構可以使你像在資料庫中 Update 一個屬性一樣只修改某一項屬性值。
127.0.0.1:6379> hset aminglinux domain www.aminglinux.com
(integer) 1
127.0.0.1:6379> hget aminglinux domain
"www.aminglinux.com"
127.0.0.1:6379> hset aminglinux bbs www.lishiming.net
(integer) 1
127.0.0.1:6379> hget aminglinux bbs
"www.lishiming.net"
127.0.0.1:6379> hgetall aminglinux
1) "domain"
2) "www.aminglinux.com"
3) "bbs"
4) "www.lishiming.net"
儲存結構和儲存格式
redis使用了兩種檔案格式:全量資料和增量請求。全量資料格式是把記憶體中的資料寫入磁碟,便於下次讀取檔案進行載入;增量請求檔案則是把記憶體中的資料序列化為操作請求,用於讀取檔案進行replay得到資料,序列化的操作包括SET、RPUSH、SADD、ZADD。
redis的儲存分為記憶體儲存、磁碟儲存和log檔案三部分,設定檔中有三個參數對其進行配置。
save seconds updates,save配置,指出在多長時間內,有多少次更新操作,就將資料同步到資料檔案。這個可以多個條件配合,比如預設設定檔中的設定,就設定了三個條件。
appendonly yes/no ,appendonly配置,指出是否在每次更新操作後進行日誌記錄,如果不開啟,可能會在斷電時導致一段時間內的資料丟失。因為redis本身同步資料檔案是按上面的save條件來同步的,所以有的資料會在一段時間內只存在於記憶體中。
appendfsync no/always/everysec ,appendfsync配置,no表示等作業系統進行資料緩衝同步到磁碟,always表示每次更新操作後手動調用fsync()將資料寫到磁碟,everysec表示每秒同步一次。
Redis資料結構