LevelDB.java 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. package com.yiidata.flume.cache;
  2. import com.yiidata.flume.cache.serde.Serializer;
  3. import com.yiidata.flume.cache.serde.StringSerializer;
  4. import com.yiidata.flume.support.FlumeConfig;
  5. import lombok.NonNull;
  6. import org.iq80.leveldb.DB;
  7. import org.iq80.leveldb.Options;
  8. import org.iq80.leveldb.impl.Iq80DBFactory;
  9. import java.io.Closeable;
  10. import java.io.File;
  11. import java.io.IOException;
  12. /**
  13. *
  14. * Level DB Cache 实现
  15. *
  16. * <pre>
  17. *
  18. * Created by zhenqin.
  19. * User: zhenqin
  20. * Date: 2021/7/20
  21. * Time: 14:46
  22. * Vendor: yiidata.com
  23. *
  24. * </pre>
  25. *
  26. * @author zhenqin
  27. */
  28. public class LevelDB implements ICache<String>, Closeable {
  29. /**
  30. * level db
  31. */
  32. final DB db;
  33. /**
  34. * KEY 序列化
  35. */
  36. private final Serializer<String> KEY_SERDE = new StringSerializer();
  37. public LevelDB() {
  38. this("cache");
  39. }
  40. public LevelDB(String name) {
  41. final File levelDbPath = new File(ApplicationUtils.APP_HOME_PATH, name + ".db");
  42. if(!levelDbPath.exists()) {
  43. levelDbPath.mkdirs();
  44. }
  45. try {
  46. final Options options = new Options();
  47. options.createIfMissing(true).errorIfExists(false);
  48. this.db = new Iq80DBFactory().open(levelDbPath, options);
  49. } catch (Exception e) {
  50. throw new IllegalStateException(e);
  51. }
  52. }
  53. @Override
  54. public void add(@NonNull String key, @NonNull String value) {
  55. db.put(KEY_SERDE.serialize(key), KEY_SERDE.serialize(value));
  56. }
  57. public void add(@NonNull String key, @NonNull byte[] value) {
  58. db.put(KEY_SERDE.serialize(key), value);
  59. }
  60. @Override
  61. public void add(String key, int exp, String value) {
  62. add(key, value);
  63. }
  64. @Override
  65. public String get(@NonNull String key) {
  66. return KEY_SERDE.deserialize(db.get(KEY_SERDE.serialize(key)));
  67. }
  68. public byte[] getValue(@NonNull String key) {
  69. return db.get(KEY_SERDE.serialize(key));
  70. }
  71. @Override
  72. public String remove(@NonNull String key) {
  73. db.delete(KEY_SERDE.serialize(key));
  74. return key;
  75. }
  76. public String remove(@NonNull byte[] key) {
  77. db.delete(key);
  78. return null;
  79. }
  80. @Override
  81. public int removeByPrefix(String prefix) {
  82. return 0;
  83. }
  84. @Override
  85. public void clear() {
  86. }
  87. @Override
  88. public int size() {
  89. return -1;
  90. }
  91. @Override
  92. public void shutdown() {
  93. try {
  94. close();
  95. } catch (IOException ignore) {}
  96. }
  97. @Override
  98. public void close() throws IOException {
  99. db.close();
  100. }
  101. public static void main(String[] args) {
  102. final LevelDB levelDB = new LevelDB();
  103. /*
  104. for (int i = 0; i < 100000; i++) {
  105. levelDB.add("hello" + i, "world, " + i);
  106. }*/
  107. long start = System.currentTimeMillis();
  108. for (int i = 0; i < 100; i++) {
  109. final String va = levelDB.get("hello" + i);
  110. System.out.println(va);
  111. }
  112. System.out.println(System.currentTimeMillis() - start);
  113. /*
  114. start = System.currentTimeMillis();
  115. for (int i = 0; i < 100000; i++) {
  116. levelDB.get("hello" + i);
  117. }
  118. System.out.println(System.currentTimeMillis() - start);*/
  119. levelDB.shutdown();
  120. }
  121. }