package engine

import (
    "bytes"
    "encoding/binary"
    "encoding/gob"
    "github.com/huichen/wukong/types"
    "sync/atomic"
)

type persistentStorageIndexDocumentRequest struct {
    docId uint64
    data  types.DocumentIndexData
}

func (engine *Engine) persistentStorageIndexDocumentWorker(shard int) {
    for {
        request := <-engine.persistentStorageIndexDocumentChannels[shard]

        // 得到key
        b := make([]byte, 10)
        length := binary.PutUvarint(b, request.docId)

        // 得到value
        var buf bytes.Buffer
        enc := gob.NewEncoder(&buf)
        err := enc.Encode(request.data)
        if err != nil {
            atomic.AddUint64(&engine.numDocumentsStored, 1)
            continue
        }

        // 将key-value写入数据库
        engine.dbs[shard].Set(b[0:length], buf.Bytes())
        atomic.AddUint64(&engine.numDocumentsStored, 1)
    }
}

func (engine *Engine) persistentStorageRemoveDocumentWorker(docId uint64, shard uint32) {
    // 得到key
    b := make([]byte, 10)
    length := binary.PutUvarint(b, docId)

    // 从数据库删除该key
    engine.dbs[shard].Delete(b[0:length])
}

func (engine *Engine) persistentStorageInitWorker(shard int) {
    engine.dbs[shard].ForEach(func(k, v []byte) error {
        key, value := k, v
        // 得到docID
        docId, _ := binary.Uvarint(key)

        // 得到data
        buf := bytes.NewReader(value)
        dec := gob.NewDecoder(buf)
        var data types.DocumentIndexData
        err := dec.Decode(&data)
        if err == nil {
            // 添加索引
            engine.internalIndexDocument(docId, data, false)
        }
        return nil
    })
    engine.persistentStorageInitChannel <- true
}

persistent_storage_worker.go的更多相关文章

  1. wukong引擎源码分析之索引——part 2 持久化 直接set(key,docID数组)在kv存储里

    前面说过,接收indexerRequest的代码在index_worker.go里: func (engine *Engine) indexerAddDocumentWorker(shard int) ...

随机推荐

  1. Ubuntu18.04教程

    pre.ctl { font-family: "Liberation Mono", monospace } h1 { margin-bottom: 0.21cm } h1.west ...

  2. Spring ioc 详解

    引述:IoC(控制反转:Inverse of Control)是Spring容器的内核,AOP.声明式事务等功能在此基础上开花结果.但是IoC这个重要的概念却比较晦涩隐讳,不容易让人望文生义,这不能不 ...

  3. 关于eclipse运行TestNG出现: CreateProcess error=206, ÎļþÃû»ò)չÃû的解决办法

    最近玩物流宝的一个项目,需要测试下3个系统打通的接口. 不测不要紧,一测吓一跳.我的乖乖:几百个bean被加进来.就凭我这肉机,内存不爆才怪. 于是换一套方案,用了另一个测试接口. 但是这个测试接口, ...

  4. Android Java端的Socket.io-client

    先讲讲历史,这个方面最早的应该是nkzawa@github的项目:http://mvnrepository.com/artifact/com.github.nkzawa/socket.io-clien ...

  5. webstorm配置eslint【标记错误,修复错误】

    项目中经常用到eslint语法,结合个人经验,用webstorm配置eslint "文件"->"默认设置"->"语言&框架&quo ...

  6. Ubuntu 下命令安装 Java

    1. 使用 java -version 查看系统是否存在 jdk. 2. ubuntu使用的是openjdk,所以我们需要先找到合适的jdk版本.在命令行中输入命令:apt-cache search ...

  7. C++中遍历读取数组中的元素

    答案来源:https://zhidao.baidu.com/question/187071815.html 对于字符数组str[N],判断方法有以下三种: 第一种:用库函数strlen 1 len = ...

  8. NSURLSession 所有的都在这里(二)

    前面一篇我们说了什么? 这是这个关于NSURLSession的第二篇文章,第一篇再加上这篇文章,就大概的把NSURLSession的API以及一些简单使用我们也就说的差不多了,这篇文章总结哪些点呢?相 ...

  9. Elasticsearch 编程API入门系列---说在前面的话

    前提,是 Eclipse下Maven新建项目.自动打依赖jar包(包含普通项目和Web项目) setting.xml配置文件 如何在Maven官网下载历史版本 HBase 开发环境搭建(Eclipse ...

  10. Xapth 添加注释头

    private static void updateMybatisXml(String url, String username, String password) { DocumentBuilder ...