本文主要研究一下dubbo的DataStore
dubbo-2.7.2/dubbo-common/src/main/java/org/apache/dubbo/common/store/DataStore.java
@SPI("simple") public interface DataStore { /** * return a snapshot value of componentName */ Map<String, Object> get(String componentName); Object get(String componentName, String key); void put(String componentName, String key, Object value); void remove(String componentName, String key); }
dubbo-2.7.2/dubbo-common/src/main/java/org/apache/dubbo/common/store/support/SimpleDataStore.java
public class SimpleDataStore implements DataStore { // <component name or id, <data-name, data-value>> private ConcurrentMap<String, ConcurrentMap<String, Object>> data = new ConcurrentHashMap<String, ConcurrentMap<String, Object>>(); @Override public Map<String, Object> get(String componentName) { ConcurrentMap<String, Object> value = data.get(componentName); if (value == null) { return new HashMap<String, Object>(); } return new HashMap<String, Object>(value); } @Override public Object get(String componentName, String key) { if (!data.containsKey(componentName)) { return null; } return data.get(componentName).get(key); } @Override public void put(String componentName, String key, Object value) { Map<String, Object> componentData = data.get(componentName); if (null == componentData) { data.putIfAbsent(componentName, new ConcurrentHashMap<String, Object>()); componentData = data.get(componentName); } componentData.put(key, value); } @Override public void remove(String componentName, String key) { if (!data.containsKey(componentName)) { return; } data.get(componentName).remove(key); } }
dubbo-2.7.2/dubbo-common/src/test/java/org/apache/dubbo/common/store/support/SimpleDataStoreTest.java
public class SimpleDataStoreTest { private SimpleDataStore dataStore = new SimpleDataStore(); @Test public void testPutGet() throws Exception { assertNull(dataStore.get("xxx", "yyy")); dataStore.put("name", "key", "1"); assertEquals("1", dataStore.get("name", "key")); assertNull(dataStore.get("xxx", "yyy")); } @Test public void testRemove() throws Exception { dataStore.remove("xxx", "yyy"); dataStore.put("name", "key", "1"); dataStore.remove("name", "key"); assertNull(dataStore.get("name", "key")); } @Test public void testGetComponent() throws Exception { Map<String, Object> map = dataStore.get("component"); assertTrue(map != null && map.isEmpty()); dataStore.put("component", "key", "value"); map = dataStore.get("component"); assertTrue(map != null && map.size() == 1); dataStore.remove("component", "key"); assertNotEquals(map, dataStore.get("component")); } }
DataStore定义了get、put、remove方法,它有一个实现类为SimpleDataStore;SimpleDataStore使用ConcurrentHashMap来存储数据,每个key存储的是ConcurrentMap