Berkeley DB使用SecondKey数据排序的 实现方法是本文我们主要要介绍的内容,在做项目的时候用到了nosql数据库BDB,借此机会研究了一下它的用法。它的官方示例和文档比较丰富,感觉比较 容易学习。在开发过程中出现了一个需求,要把数据根据插入时间遍历,个人认为通过第二主键(SecondKey)比较容易实现。

以下是我的基本实现过程:

1.在ValueBean中加入insertTime属性

  1. public class ValueBean{
  2. private String insertTime;
  3. private String hostName;
  4. private byte[] value;
  5. public String getHostName() {
  6. return hostName;
  7. }
  8. public void setHostName(String hostName) {
  9. this.hostName = hostName;
  10. }
  11. public String getInsertTime() {
  12. return insertTime;
  13. }
  14. public void setInsertTime(String insertTime) {
  15. this.insertTime = insertTime;
  16. }
  17. public byte[] getValue() {
  18. return value;
  19. }
  20. public void setValue(byte[] value) {
  21. this.value = value;
  22. }
  23. }

其中的hostName属性在主从同步和生成插入时间时用到,value属性就是key-value中的值

2.TupleBinding类

  1. public class ValueBeanBinding extends TupleBinding<ValueBean> {
  2. @Override
  3. public ValueBean entryToObject(TupleInput input) {
  4. String time = input.readString();
  5. String name = input.readString();
  6. byte[] value = new byte[input.getBufferLength()-input.getBufferOffset()];//获得value长度
  7. input.read(value);
  8. ValueBean data = new ValueBean();
  9. data.setInsertTime(time);
  10. data.setHostName(name);
  11. data.setValue(value);
  12. return data;
  13. }
  14. @Override
  15. public void objectToEntry(ValueBean object, TupleOutput output) {
  16. ValueBean value = object;
  17. output.writeString(value.getInsertTime());
  18. output.writeString(value.getHostName());
  19. output.write(value.getValue());
  20. }
  21. }

此类用于将ValueBean和DatabaseEntry进行转换,两个方法中的属性读写顺序要统一。

3.SecondaryKeyCreator,第二主键生成器

  1. public class SecondKeyCreator implements SecondaryKeyCreator{
  2. private TupleBinding<ValueBean> theBinding;
  3. SecondKeyCreator(TupleBinding<ValueBean> theBinding) {
  4. this.theBinding = theBinding;
  5. }
  6. @Override
  7. public boolean createSecondaryKey(SecondaryDatabase secondary,
  8. DatabaseEntry key, DatabaseEntry data, DatabaseEntry result) {
  9. ValueBean v =
  10. (ValueBean) theBinding.entryToObject(data);
  11. String time=v.getInsertTime();
  12. result.setData(time.getBytes());
  13. return true;
  14. }
  15. }

指定insertTime属性作为第二主键。

在插入一个新数据时生成insertTime十分关键,尤其在高并发和互为主从同步时极易出现“第二主键重复”的错误,造成数据无法插入,我了使用 当前时间毫秒数+AtomicInteger自增+hostName的asc码之和,保证insertTime的前后大小顺序。

System.currentTimeMillis()*1000000+(add_num.getAndIncrement()%1000)*1000 + host_key

4.创建第二数据库,用于存储secondkey

  1. SecondaryConfig mySecConfig = new SecondaryConfig();
  2. mySecConfig.setAllowCreate(true);
  3. mySecConfig.setSortedDuplicates(false);
  4. TupleBinding<ValueBean> tb =new ValueBeanBinding();
  5. SecondKeyCreator  keyCreator = new  SecondKeyCreator(tb);
  6. mySecConfig.setKeyCreator(keyCreator);
  7. mySecConfig.setTransactional(envConfig.getTransactional());
  8. String secDbName = "mySecondaryDatabase";
  9. mySecDb = myEnv.openSecondaryDatabase(null, secDbName,  storeDb, mySecConfig);

到此,便可以使用SecondaryCursor的getNext()和getPrev()前后遍历了,getSearchKey()可以找到你想要的位置。

关于Berkeley DB使用SecondKey给数据排序的实现方法的相关知识就介绍到这里了,希望本次的介绍能够对您有所收获!

Berkeley DB使用SecondKey给数据排序的实现方法的更多相关文章

  1. 送你一个Python 数据排序的好方法

    摘要:学习 Pandas排序方法是开始或练习使用 Python进行基本数据分析的好方法.最常见的数据分析是使用电子表格.SQL或pandas 完成的.使用 Pandas 的一大优点是它可以处理大量数据 ...

  2. Berkeley DB基础教程

    一.Berkeley DB的介绍 (1)Berkeley DB是一个嵌入式数据库,它适合于管理海量的.简单的数据.如Google使用其来保存账户信息,Heritrix用其来保存froniter. (2 ...

  3. Berkeley DB基础教程 分类: H3_NUTCH 2014-05-29 15:21 2212人阅读 评论(0) 收藏

    一.Berkeley DB的介绍 (1)Berkeley DB是一个嵌入式数据库,它适合于管理海量的.简单的数据.如Google使用其来保存账户信息,Heritrix用其来保存froniter. (2 ...

  4. 新浪研发中心: Berkeley DB 使用经验总结

    http://blog.sina.com.cn/s/blog_502c8cc40100yqkj.html NoSQL是现在互联网Web2.0时代备受关注的技术之一,被用来存储大量的非关系型的数据.Be ...

  5. Berkeley DB 使用经验总结

    作者:陈磊 NoSQL是现在互联网Web2.0时代备受关注的技术之一,被用来存储大量的非关系型的数据.Berkeley DB作为一款优秀的Key/Value存储引擎自然也在讨论之列.最近使用BDB来发 ...

  6. 一个简单的NoSQL内存数据库—Berkeley DB基本操作的例子

    一个简单的NoSQL内存数据库—Berkeley DB基本操作的例子 最近,由于云计算的发展,数据库技术也从结构式数据库发展到NoSQL数据库,存储模式从结构化的关系存储到现在如火如荼的key/val ...

  7. Berkeley DB的数据存储结构——哈希表(Hash Table)、B树(BTree)、队列(Queue)、记录号(Recno)

    Berkeley DB的数据存储结构 BDB支持四种数据存储结构及相应算法,官方称为访问方法(Access Method),分别是哈希表(Hash Table).B树(BTree).队列(Queue) ...

  8. Berkeley DB分布式探索

    明天回家就没有网络,今晚就将整个编写过程记录下来.顺带整理思路以解决未能解决的问题. 标题有点托大,想将Berkeley DB做成分布式存储,感觉很高端的样子,实际上就是通过ssh将Berkeley ...

  9. Berkeley DB Java Edition 简介

    一.             简介        Berkeley DB Java Edition (JE)是一个完全用JAVA写的,它适合于管理海量的,简单的数据. l         能够高效率的 ...

随机推荐

  1. PHP导出成PDF功能开发教程

    准备工作 首先查询了相关的类库,有FPDF,zendPDF,TcPDF等等.首先看了下先选择了FPDF,可以说除了中文字符以外没有什么问题,中文乱码而且看了下最新版本没有很好的解决方案,所以只能放弃. ...

  2. Ansible学习 安装

    对于运维人员来说,自动化工具是日常工作中比不可少的.Ansible是一个很好的自动化工具. Ansible默认使用SSH协议管理机器,在管理主机上安装Ansible,管理主机和被管理主机只要安装了py ...

  3. Node 操作MySql数据库

    1, 需要安装 MySQL 依赖 =>  npm i mysql -D 2, 封装一个工具类 mysql-util.js // 引入 mysql 数据库连接依赖 const mysql = re ...

  4. 15.VUE学习之-表单中使用key唯一令牌解决表单值混乱问题

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...

  5. Nearest Common Ancestors POJ - 1330 (LCA)

    Nearest Common Ancestors Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 34657   Accept ...

  6. 菜鸟学Linux - 用户与用户组基础

    /etc/passwd: 用户的信息是保存在/etc/passwd下面(早期的时候,用户的密码也是放在该文件中.后来出于安全考虑,将密码放在/etc/shadow中去): /etc/group: 用户 ...

  7. 关于spark入门报错 java.io.FileNotFoundException: File file:/home/dummy/spark_log/file1.txt does not exist

    不想看废话的可以直接拉到最底看总结 废话开始: master: master主机存在文件,却报 执行spark-shell语句:  ./spark-shell  --master spark://ma ...

  8. socketCluster 使用

    <html> <head> <title>test</title> <script src="https://cdn.bootcss.c ...

  9. virsh命令管理虚拟机

    virsh命令管理虚拟机 libvirt有两种控制方式,命令行和图形界面. 1.图形界面:通过执行名virt-manager,启动libvirt的图形界面,在图形界面下可以一步一步的创建虚拟机,管理虚 ...

  10. Leetcode 556.下一个更大元素III

    下一个更大元素III 给定一个32位正整数 n,你需要找到最小的32位整数,其与 n 中存在的位数完全相同,并且其值大于n.如果不存在这样的32位整数,则返回-1. 示例 1: 输入: 12 输出: ...