本篇文章是對使用key/value數據庫redis和TTSERVER的心得體會進行了詳細的分析介紹
需要的朋友參考下
先說redis
redis是一個類似memcached的key/value存儲系統它支持存儲的 value類型相對較多包括string(字符串) list(鏈表)set(集合)和zset(有序集合)在此基礎上redis支持各種不同方式的排序與memcached一樣為了保證效率數 據都是緩存在內存中區別的是redis會周期性的把更新的數據寫入磁盤或者把修改操作寫入追加的記錄文件(這點兒個人覺得redis比memcache 在數據保存上要安全一些)並且在此基礎上實現了master slave(主從)同步
redis的存取性能很高SET操作每秒鐘 次GET操作每秒鐘 次(速度很爽!)
Redis針對不同的存儲類型對象提供了不同的命令
redis目前提供四種數據類型stringlistset及zset(sorted set)
string是最簡單的類型你可以理解成與Memcached一模一個的類型一個key對應一個value其上支持的操作與Memcached的操 作類似但它的功能更豐富
list是一個鏈表結構主要功能是pushpop獲取一個范圍的所有值等等操作中key理解為鏈表的名字
set是集合和我們數學中的集合概念相似對集合的操作有添加刪除元素有對多個集合求交並差等操作操作中key理解為集合的名字
zset是set的一個升級版本他在set的基礎上增加了一個順序屬性這一屬性在添加修改元素的時候可以指定每次指定後zset會自動重新按新的 值調整順序可以理解了有兩列的mysql表一列存value一列存順序操作中key理解為zset的名字
下面提供redis命令
適合全體類型的命令
EXISTS key 判斷一個鍵是否存在;存在返回 ;否則返回;
DEL key 刪除某個key或是一系列key;DEL key key key key
TYPE key 返回某個key元素的數據類型 ( none:不存在string:字符listsetzsethash)
KEYS pattern 返回匹配的key列表 (KEYS foo*:查找foo開頭的keys)
RANDOMKEY 隨機獲得一個已經存在的key如果當前數據庫為空則返回空字符串
RENAME oldname newname更改key的名字新鍵如果存在將被覆蓋
RENAMENX oldname newname 更改key的名字如果名字存在則更改失敗
DBSIZE返回當前數據庫的key的總數
EXPIRE設置某個key的過期時間(秒)(EXPIRE bruce 設置bruce這個key秒後系統自動刪除)注意如果在還沒有過期的時候對值進行了改變那麼那個值會被清除
TTL查找某個key還有多長時間過期返回時間秒
SELECT index 選擇數據庫
MOVE key dbindex 將指定鍵從當前數據庫移到目標數據庫 dbindex成功返回 ;否則返回(源數據庫不存在key或目標數據庫已存在同名key);
FLUSHDB 清空當前數據庫中的所有鍵
FLUSHALL 清空所有數據庫中的所有鍵
處理字符串的命令
SET key value 給一個鍵設置字符串值SET keyname datalength data (SET bruce paitoubing:保存key為burce字符串長度為的一個字符串paitoubing到數據庫)data最大不可超過G
GET key獲取某個key 的value值如key不存在則返回字符串“nil”如key的值不為字符串類型則返回一個錯誤
GETSET key value可以理解成獲得的key的值然後SET這個值更加方便的操作 (SET bruce paitoubing這個時候需要修改bruce變成並獲取這個以前的數據paitoubingGETSET bruce )
MGET key key … keyN 一次性返回多個鍵的值
SETNX key value SETNX與SET的區別是SET可以創建與更新key的value而SETNX是如果key不存在則創建key與value數據
MSET key value key value … keyN valueN 在一次原子操作下一次性設置多個鍵和值
MSETNX key value key value … keyN valueN 在一次原子操作下一次性設置多個鍵和值(目標鍵不存在情況下如果有一個以上的key已存在則失敗)
INCR key 自增鍵值
INCRBY key integer 令鍵值自增指定數值
DECR key 自減鍵值
DECRBY key integer 令鍵值自減指定數值
處理 lists 的命令
RPUSH key value 從 List 尾部添加一個元素(如序列不存在則先創建如已存在同名Key而非序列則返回錯誤)
LPUSH key value 從 List 頭部添加一個元素
LLEN key 返回一個 List 的長度
LRANGE key start end從自定的范圍內返回序列的元素 (LRANGE testlist ;返回序列testlist前 元素)
LTRIM key start end修剪某個范圍之外的數據 (LTRIM testlist ;保留 元素其余的刪除)
LINDEX key index返回某個位置的序列值(LINDEX testlist ;返回序列testlist位置為的元素)
LSET key index value更新某個位置元素的值
LREM key count value 從 List 的頭部(count正數)或尾部(count負數)刪除一定數量(count)匹配value的元素返回刪除的元素數量
LPOP key 彈出 List 的第一個元素
RPOP key 彈出 List 的最後一個元素
RPOPLPUSH srckey dstkey 彈出 _srckey_ 中最後一個元素並將其壓入 _dstkey_頭部key不存在或序列為空則返回“nil”
處理集合(sets)的命令(有索引無序序列)
SADD key member增加元素到SETS序列如果元素(membe)不存在則添加成功 否則失敗 ;(SADD testlist /n one)
SREM key member 刪除SETS序列的某個元素如果元素不存在則失敗否則成功 (SREM testlist /N one)
SPOP key 從集合中隨機彈出一個成員
SMOVE srckey dstkey member 把一個SETS序列的某個元素 移動到 另外一個SETS序列 (SMOVE testlist test /n two;從序列testlist移動元素two到 test中testlist中將不存在two元素)
SCARD key 統計某個SETS的序列的元素數量
SISMEMBER key member 獲知指定成員是否存在於集合中
SINTER key key … keyN 返回 key key … keyN 中的交集
SINTERSTORE dstkey key key … keyN 將 key key … keyN 中的交集存入 dstkey
SUNION key key … keyN 返回 key key … keyN 的並集
SUNIONSTORE dstkey key key … keyN 將 key key … keyN 的並集存入 dstkey
SDIFF key key … keyN 依據 key … keyN 求 key 的差集官方例子
key = xabc
key = c
key = ad
SDIFF keykeykey => xb
SDIFFSTORE dstkey key key … keyN 依據 key … keyN 求 key 的差集並存入 dstkey
SMEMBERS key 返回某個序列的所有元素
SRANDMEMBER key 隨機返回某個序列的元素
處理有序集合(sorted sets)的命令 (zsets)
ZADD key score member 添加指定成員到有序集合中如果目標存在則更新score(分值排序用)
ZREM key member 從有序集合刪除指定成員
ZINCRBY key increment member 如果成員存在則將其增加_increment_否則將設置一個score為_increment_的成員
ZRANGE key start end 返回升序排序後的指定范圍的成員
ZREVRANGE key start end 返回降序排序後的指定范圍的成員
ZRANGEBYSCORE key min max 返回所有符合score >= min和score <= max的成員 ZCARD key 返回有序集合的元素數量 ZSCORE key element 返回指定成員的SCORE值 ZREMRANGEBYSCORE key min max 刪除符合 score >= min 和 score <= max 條件的所有成員
使用體會
個人在覺得 redis速度是不用說了(很快的)但是很消耗物理內存算是redis的一個弊端吧redis適合數據量比較小速度更新快的類型的網站比如社區 不適合數據比較龐大的網站比如論壇以前用redis應用的一個論壇帖子上但是因為數據量太大消耗物理內存驚人而放棄了用 redis!
再說說TTSERVER
Tokyo Cabinet 是一個DBM的實現這裡的數據庫由一系列keyvalue對的記錄構成key和value都可以是任意長度的字節序列既可以是二進制也可以是字符 串這裡沒有數據類型和數據表的概念當做為Hash表數據庫使用時每個key必須是不同的因此無法存儲兩個key相同的值提供了以下訪問方法:提 供keyvalue參數來存儲按 key刪除記錄按key來讀取記錄另外遍歷key也被支持雖然順序是任意的不能被保證這些方法跟Unix標准的DBM例如GDBMNDBM 等等是相同的但是比它們的性能要好得多(因此可以替代它們) 當按B+樹來存儲時擁用相同key的記錄也能被存儲像hash表一樣的讀取存儲刪除函數也都有提供記錄按照用戶提供的比較函數來存儲可以采用 順序或倒序的游標來讀取每一條記錄依照這個原理向前的字符串匹配搜索和整數區間搜索也實現了另外B+樹的事務也是可用的對於定長的數組記錄按 自然數來標記存儲不能存儲key相同的兩條或更多記錄另外每條記錄的長度受到限 制讀取方法和hash表的一樣 Tokyo Cabinet是用C寫的同時提供cperlrubyjava的APITokyo Cabinet在提供了POSIX和C的平台上都可用它以GNU Lesser Public License協議發布
tokyocabinet :一個keyvalue的DBM數據庫但是沒有提供網絡接口以下稱TC
tokyotyrant :是為TC寫的網絡接口他支持memcache協議也可以通過HTTP操作以下稱TT
性能:
Tokyo Cabinet 是日本人 平林幹雄 開發的一款 DBM 數據庫Tokyo Cabinet基於GNU Lesser General Public License協議發布采用C語言開發它可以運行在任何支持C和POSIX平台上使用相比一般的DBM數據庫有以下幾個特點空間小效率高 性能高可靠性高多種開發語言的支持(現已提供CPerlRubyJavaLua的API)支持位操作系統該數據庫讀寫非常快哈希模 式寫入萬條數據只需秒讀取萬條數據只需秒是 Berkeley DB 等 DBM 的幾倍
Tokyo Tyrant 加上 Tokyo Cabinet構成了一款支持高並發的分布式持久存儲系統對任何原有Memcached客戶端來講可以將Tokyo Tyrant看成是一個Memcached但是它的數據是可以持久存儲的這一點跟新浪的Memcachedb性質一樣
ttserver和memcache比較
ttserver 是數據庫memcached是緩存兩者都是保存<keyvalue>形式的數據通過key進行任何操作ttserver可以將數據 持久化保存memcached全部是保存在內存中memcached會自動刪除過期數據最長不超過天memcached在和一些api配合 時能自動進行數據的出入序列化讀取反序列化ttserver有主從復制的功能操作日志等這完全是數據庫才有的東西據說memcached正在 對整體架構做調整到時候支持plugin機制會把網絡事件處理內存存儲剝離開來以後要做基於磁盤的keyvalue存儲就可以寫一個存儲引擎 就成了memcached的二次開發又步入一個小高潮
From:http://tw.wingwit.com/Article/program/PHP/201311/20930.html