把leveldb嵌入到redis.實現真正的數據持久存儲


目前最新版RedisStorage 是基於 redis 2.6.2基礎上,加上 leveldb存儲引擎。 這個項目是源於 公司項目的passport 用戶認證改造。公司一個項目運行了N年。積累了幾千萬用戶,並且每天不斷的高速增長中。原有的mysql分表模式已經不適合。所以尋找nosql的解決方案。經過測試目前流行的NOSQL。 最終選中了leveldb. Leveldb是一個google實現的非常高效的kv數據庫,目前的版本1.2能夠支持十億級別的數據量了。 在這個數量級別下還有着非常高的性能,主要歸功於它的良好的設計。特別是LSM算法。LevelDB 是單進程的服務,性能非常之高,在一台4個Q6600的CPU機器上,每秒鍾寫數據超過40w,而隨機讀的性能每秒鍾超過10w。.(leveldb也應用在淘寶上).可惜leveldb只是個存儲引擎,沒有一個好的服務端。經過幾天折騰。我把leveldb加到redis里去。 這樣既可以依托redis的高效穩定,又可以不用另起爐灶。一舉兩得。 現在redis 也有真正的持久存儲功能。


現在RedisStorage 已經應用在用戶庫的存儲,和用戶簽到功能上。

項目地址: https://github.com/qiye/redis-storage

作者: 七夜
QQ:    531020471
QQ群: 62116204(已滿)
QQ群: 154249567 (未滿)
email: lijinxing@gmail.com
blog:  www.cellphp.com 

redis new cmd

  1. ds_set name qiye
  2. ds_get name
  3. ds_del name 
  4. ds_mset key value age 20
  5. ds_mget key age
  6. ds_del key age
復制代碼

php code

  1. include "redis.php";
  2. $db = new redis("127.0.0.1", 6379);
  3. $rc = $db->connect();
  4. if(!$rc)
  5. {
  6.    echo "can not connect redis server\r\n";
  7.    exit;
  8. }  
  9. $data = $db->multi(array('DEL test', 'SET test 1', 'GET test'));
  10. print_r($data);
  11. echo $db->set("name", "qiye");
  12. echo $db->get("name");
  13. $db->ds_set("name", "qiye");
  14. $db->ds_set("age", "20");
  15. $data = $db->ds_mget( "name", "age");
  16. print_r($data);
復制代碼

 

可能很多人都不知道RedisStorage 和redis 之間的區別。

redis的存儲是存儲在內存里的,  RedisStorage可以選擇存儲在磁盤里. 
當redis崩潰的時候。redis 會從rdb或者aof文件重新讀取數據到內存里。如果數據量很大的話。這個初始化是相當的慢。(這就是 redis的假數據持久)。 
RedisStorage 是直接存儲在 磁盤里。所以不存在這個數據重加載問題。

還有redis 存儲是受物理內存限制的,比如你有幾千萬或者幾億的數據。如果存儲在redis里。那得需要多巨大的內存了。使用RedisStorage 就沒有物理內存限制這個問題。最大可以存儲十億數據。

最后說一下淘寶的Tair ldb項目。同樣基於leveldb 存儲引擎。 廣泛的用在 登錄淘寶、查看商品詳情頁面、在淘江湖和好友“搗漿糊”等。 說明leveldb 數據引擎的可靠性和海量數據存儲。 但是開源版的Tair ldb 並不好用。所以自己寫了個基於 leveldb的 server端。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM