<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    小明思考

    Just a software engineer
    posts - 124, comments - 36, trackbacks - 0, articles - 0
      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    leveldb研究5- Snapshot

    Posted on 2012-03-13 16:54 小明 閱讀(4498) 評(píng)論(0)  編輯  收藏 所屬分類: 分布式計(jì)算
    所謂snapshot就是一個(gè)快照,我們可以從快照中讀到舊的數(shù)據(jù)。

    先寫一個(gè)測(cè)試程序來看看snapshot的使用:

    #include <iostream>
    #include 
    "leveldb/db.h"

    using namespace std;
    using namespace leveldb;


    int main() {
        DB 
    *db ;
        Options op;
        op.create_if_missing 
    = true;
        Status s 
    = DB::Open(op,"/tmp/testdb",&db);

        
    if(s.ok()){
            cout 
    << "create successfully" << endl;
            s 
    = db->Put(WriteOptions(),"abcd","1234");
            
    if(s.ok()){
                cout 
    << "put successfully" << endl;
                
    string value;
                s 
    = db->Get(ReadOptions(),"abcd",&value);
                
    if(s.ok()){
                    cout 
    << "get successfully,value:" << value << endl;
                }
            }
            
    if(s.ok()){
                
    string value;
                
    const Snapshot * ss =db->GetSnapshot();
                ReadOptions rop;
                db
    ->Put(WriteOptions(),"abcd","123456");
                db
    ->Get(rop,"abcd",&value);
                
    if(s.ok()){
                        cout 
    << "get successfully,value:" << value << endl;
                }
                rop.snapshot 
    = ss;
                db
    ->Get(rop,"abcd",&value);
                
    if(s.ok()){
                        cout 
    << "get from snapshot successfully,value:" << value << endl;
                }
                db
    ->ReleaseSnapshot(ss);
            }
        }
        delete db;
        
    return 0;
    }

    程序運(yùn)行的輸出結(jié)果是:
    create successfully
    put successfully
    get successfully,value:1234
    get successfully,value:123456
    get from snapshot successfully,value:1234

    可以看出,即使在數(shù)據(jù)更新后,我們?nèi)匀豢梢詮膕napshot中讀到舊的數(shù)據(jù)。

    下面我們來分析leveldb中snapshot的實(shí)現(xiàn)。

    SequenceNumber(db/dbformat.h)
    SequenceNumber是leveldb很重要的東西,每次對(duì)數(shù)據(jù)庫進(jìn)行更新操作,都會(huì)生成一個(gè)新的SequenceNumber,64bits,其中高8位為0,可以跟key的類型(8bits)進(jìn)行合并成64bits。
    typedef uint64_t SequenceNumber;

    // We leave eight bits empty at the bottom so a type and sequence#
    // can be packed together into 64-bits.
    static const SequenceNumber kMaxSequenceNumber =
        ((0x1ull << 56) - 1);

    SnapShot(db/snapshot.h),,可以看出snapshot其實(shí)就是一個(gè)sequence number
    class SnapshotImpl : public Snapshot {
     
    public:
      
    //創(chuàng)建后保持不變
      SequenceNumber number_;  

     
    private:
      friend 
    class SnapshotList; 

      
    //雙向循環(huán)鏈表
      SnapshotImpl* prev_;
      SnapshotImpl
    * next_;

      SnapshotList
    * list_;                 // just for sanity checks
    };

    創(chuàng)建snapshot:
    const Snapshot* DBImpl::GetSnapshot() {
      MutexLock l(
    &mutex_);
      
    return snapshots_.New(versions_->LastSequence());
    }

    刪除snapshot:
    void DBImpl::ReleaseSnapshot(const Snapshot* s) {
      MutexLock l(
    &mutex_);
      snapshots_.Delete(reinterpret_cast
    <const SnapshotImpl*>(s));
    }




    主站蜘蛛池模板: 久久精品国产亚洲AV| a级成人免费毛片完整版| 亚洲乱码日产一区三区| 国产福利在线免费| 九九热久久免费视频| 国产精品久久亚洲不卡动漫| 国产AV无码专区亚洲AV漫画| 噼里啪啦电影在线观看免费高清| 中文字幕的电影免费网站| 亚洲国产精品久久久久秋霞影院| 亚洲伊人成无码综合网 | 精品免费视在线观看| 亚洲精品动漫免费二区| 亚洲成人精品久久| 亚洲另类激情专区小说图片| 亚洲中文无码永久免费| 九九精品成人免费国产片| 狠狠色伊人亚洲综合网站色| 国产亚洲人成网站在线观看不卡 | 麻豆国产精品免费视频| 三根一起会坏掉的好痛免费三级全黄的视频在线观看 | 亚欧免费一级毛片| 久久久久久免费一区二区三区| 精品一区二区三区免费视频| a在线视频免费观看在线视频三区 a毛片成人免费全部播放 | 黄色片网站在线免费观看| 亚洲精品国产高清在线观看| 国产亚洲精品成人AA片| 亚洲AV无码一区二区三区牛牛| 亚洲六月丁香六月婷婷蜜芽| 亚洲伊人色一综合网| 2020亚洲男人天堂精品| 一区二区亚洲精品精华液| 亚洲日本VA中文字幕久久道具| 2017亚洲男人天堂一| 亚洲人片在线观看天堂无码| 亚洲国产精品无码久久九九大片| 亚洲AV无码国产剧情| 最新亚洲人成无码网站| 一级做α爱过程免费视频| 久久久精品视频免费观看|