diff --git a/.idea/misc.xml b/.idea/misc.xml
index 8dc554d..e923908 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -8,7 +8,7 @@
-
+
diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml
new file mode 100644
index 0000000..2b63946
--- /dev/null
+++ b/.idea/uiDesigner.xml
@@ -0,0 +1,124 @@
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/java/org/redis/RedisMap.java b/src/main/java/org/redis/RedisMap.java
new file mode 100644
index 0000000..c2424ba
--- /dev/null
+++ b/src/main/java/org/redis/RedisMap.java
@@ -0,0 +1,138 @@
+package org.redis;
+
+import redis.clients.jedis.JedisPool;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+public class RedisMap implements Map {
+ private final JedisPool jedisPool;
+ private final String namespace;
+
+ public RedisMap(JedisPool jedisPool, String namespace) {
+ this.jedisPool = jedisPool;
+ this.namespace = namespace;
+ }
+
+ @Override
+ public int size() {
+ try (var jedis = jedisPool.getResource()) {
+ return jedis.keys(builtRedisKey("*")).size();
+ }
+ }
+
+ @Override
+ public boolean isEmpty() {
+ return size() == 0;
+ }
+
+ @Override
+ public boolean containsKey(Object key) {
+ try (var jedis = jedisPool.getResource()) {
+ return jedis.get(builtRedisKey(key)) != null;
+ }
+ }
+
+ @Override
+ public boolean containsValue(Object value) {
+ try (var jedis = jedisPool.getResource()) {
+ for (var key : jedis.keys(builtRedisKey("*"))) {
+ if (Objects.equals(jedis.get(key), value)) {
+ return true;
+ }
+ }
+ return false;
+ }
+ }
+
+ @Override
+ public String get(Object key) {
+ try (var jedis = jedisPool.getResource()) {
+ return jedis.get(builtRedisKey(key));
+ }
+ }
+
+ @Override
+ public String put(String key, String value) {
+ try (var jedis = jedisPool.getResource()) {
+ var rKey = builtRedisKey(key);
+ var oldValue = jedis.get(rKey);
+ jedis.set(rKey, value);
+ return oldValue;
+ }
+ }
+
+ @Override
+ public String remove(Object key) {
+ try (var jedis = jedisPool.getResource()) {
+ var rKey = builtRedisKey(key);
+ var oldValue = jedis.get(rKey);
+ jedis.del(rKey);
+ return oldValue;
+ }
+ }
+
+ @Override
+ public void putAll(Map extends String, ? extends String> m) {
+ try (var jedis = jedisPool.getResource()) {
+ for (var entry : m.entrySet()) {
+ jedis.set(builtRedisKey(entry.getKey()), entry.getValue());
+ }
+ }
+ }
+
+ @Override
+ public void clear() {
+ try (var jedis = jedisPool.getResource()) {
+ var keySet = jedis.keys(builtRedisKey("*"));
+ if (keySet.isEmpty()) return;
+ String[] keys = keySet.toArray(new String[0]);
+ jedis.del(keys);
+ }
+ }
+
+ @Override
+ public Set keySet() {
+ try (var jedis = jedisPool.getResource()) {
+ var keysWithNamespace = jedis.keys(builtRedisKey("*"));
+ return keysWithNamespace.stream()
+ .map(rKey -> extractKey(rKey))
+ .collect(Collectors.toSet());
+ }
+ }
+
+ @Override
+ public Collection values() {
+ try (var jedis = jedisPool.getResource()) {
+ List valiesList = new ArrayList<>();
+ for (var key : jedis.keys(builtRedisKey("*"))) {
+ valiesList.add(jedis.get(key));
+ }
+ return valiesList;
+ }
+ }
+
+ @Override
+ public Set> entrySet() {
+ try (var jedis = jedisPool.getResource()) {
+ var entrySet = new HashSet>();
+
+ var keySet = jedis.keys(builtRedisKey("*"));
+ for (var rKey : keySet) {
+ var value = jedis.get(rKey);
+
+ var key = extractKey(rKey);
+ entrySet.add(new AbstractMap.SimpleEntry<>(key, value));
+ }
+ return entrySet;
+ }
+ }
+
+ private String builtRedisKey(Object key) {
+ return namespace + ":" + key;
+ }
+
+ private String extractKey(String rKey) {
+ return rKey.substring(namespace.length() + 1);
+ }
+}
diff --git a/src/test/java/org/redis/RedisMapTest.java b/src/test/java/org/redis/RedisMapTest.java
new file mode 100644
index 0000000..5371a20
--- /dev/null
+++ b/src/test/java/org/redis/RedisMapTest.java
@@ -0,0 +1,153 @@
+package org.redis;
+
+import org.junit.jupiter.api.*;
+import redis.clients.jedis.JedisPool;
+
+import java.util.Map;
+
+@TestInstance(TestInstance.Lifecycle.PER_CLASS)
+class RedisMapTest {
+
+ private RedisMap redisMap;
+
+ @BeforeAll
+ void setup() {
+ var jedisPool = new JedisPool("localhost", 6379);
+ redisMap = new RedisMap(jedisPool, "testnamespace");
+ redisMap.clear();
+ }
+
+ @AfterEach
+ void tearDown() {
+ redisMap.clear();
+ }
+
+ @Test
+ void sizeTest() {
+ var result = redisMap.size();
+ Assertions.assertEquals(0, result);
+ }
+
+ @Test
+ void isEmptyTest() {
+ var resultMapIsEmpty = redisMap.isEmpty();
+ redisMap.put("key", "value");
+ var resultMapNotEmpty = redisMap.isEmpty();
+ Assertions.assertTrue(resultMapIsEmpty);
+ Assertions.assertFalse(resultMapNotEmpty);
+ }
+
+ @Test
+ void getTest() {
+ var key = "key";
+ var expectedValue = "value";
+ redisMap.put(key, expectedValue);
+ var resultValue = redisMap.get(key);
+ Assertions.assertEquals(expectedValue, resultValue);
+ }
+
+ @Test
+ void putTest() {
+ var key = "key";
+ var expectedValue = "value";
+ redisMap.put(key, expectedValue);
+ var size = redisMap.size();
+ var resultValue = redisMap.get(key);
+ Assertions.assertEquals(1, size);
+ Assertions.assertEquals(expectedValue, resultValue);
+ }
+
+ @Test
+ void removeTest() {
+ var expectedValue = "value";
+ redisMap.put("key", expectedValue);
+ var removedValue = redisMap.remove("key");
+ var isEmpty = redisMap.isEmpty();
+ Assertions.assertEquals(expectedValue, removedValue);
+ Assertions.assertTrue(isEmpty);
+ }
+
+ @Test
+ void keySetTest() {
+ String key1 = "key1", key2 = "key2";
+ String value1 = "value1", value2 = "value2";
+ redisMap.put(key1, value1);
+ redisMap.put(key2, value2);
+ var result = redisMap.keySet();
+ Assertions.assertEquals(2, result.size());
+ Assertions.assertTrue(result.contains(key1));
+ Assertions.assertTrue(result.contains(key2));
+ }
+
+ @Test
+ void containsKeyTest() {
+ var key1 = "key1";
+ var value1 = "value1";
+ redisMap.put(key1, value1);
+ var containsKey = redisMap.containsKey(key1);
+ Assertions.assertTrue(containsKey);
+ }
+
+ @Test
+ void containsValueTest() {
+ var key1 = "key1";
+ var value1 = "value1";
+ var value2 = "value2";
+ redisMap.put(key1, value1);
+ var containsValue = redisMap.containsValue(value1);
+ var notContainsValue = redisMap.containsValue(value2);
+ Assertions.assertTrue(containsValue);
+ Assertions.assertFalse(notContainsValue);
+ }
+
+ @Test
+ void putAllTest() {
+ String key1 = "key1", key2 = "key2";
+ String value1 = "value1", value2 = "value2";
+ Map map = Map.of(
+ key1, value1,
+ key2, value2
+ );
+
+ redisMap.putAll(map);
+ var containsKey1 = redisMap.containsKey(key1);
+ var containsKey2 = redisMap.containsKey(key2);
+ var containsValue1 = redisMap.containsValue(value1);
+ var containsValue2 = redisMap.containsValue(value2);
+ Assertions.assertTrue(containsKey1);
+ Assertions.assertTrue(containsKey2);
+ Assertions.assertTrue(containsValue1);
+ Assertions.assertTrue(containsValue2);
+
+ }
+
+ @Test
+ void valuesTest() {
+ Map map = Map.of(
+ "key1", "value1",
+ "key2", "value1"
+ );
+ var expectedValues = map.values();
+ redisMap.putAll(map);
+
+ var resultValues = redisMap.values();
+
+ Assertions.assertEquals(expectedValues.size(), resultValues.size());
+ Assertions.assertTrue(resultValues.containsAll(expectedValues));
+ }
+
+ @Test
+ void entrySetTest() {
+ Map map = Map.of(
+ "key1", "value1",
+ "key2", "value1"
+ );
+ redisMap.putAll(map);
+
+ var expectedEntrySet = map.entrySet();
+ var resultEntrySet = redisMap.entrySet();
+
+ Assertions.assertEquals(expectedEntrySet.size(), resultEntrySet.size());
+ Assertions.assertTrue(resultEntrySet.containsAll(expectedEntrySet));
+ }
+}