From 0a02e49a3db2b14fd3fe2fb113b6f115937cc6c8 Mon Sep 17 00:00:00 2001 From: DanKoDi Date: Wed, 15 Oct 2025 23:12:35 +0300 Subject: [PATCH 1/2] working version --- src/main/java/org/redis/Main.java | 21 ++- src/main/java/org/redis/map/RedisMap.java | 133 ++++++++++++++++++ src/test/java/org/redis/map/RedisMapTest.java | 120 ++++++++++++++++ 3 files changed, 273 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/redis/map/RedisMap.java create mode 100644 src/test/java/org/redis/map/RedisMapTest.java diff --git a/src/main/java/org/redis/Main.java b/src/main/java/org/redis/Main.java index 68b3db6..6b7f459 100644 --- a/src/main/java/org/redis/Main.java +++ b/src/main/java/org/redis/Main.java @@ -1,7 +1,26 @@ package org.redis; +import org.redis.map.RedisMap; +import redis.clients.jedis.Jedis; + public class Main { public static void main(String[] args) { - System.out.println("Hello world!"); + + Jedis jedis = new Jedis("localhost", 6379); + + jedis.set("first", "Hello Rediss!"); + + String value = jedis.get("first"); + System.out.println("Value from Redis: " + value); + + RedisMap redisMap = new RedisMap(jedis); + + redisMap.put("first", "Hello Rediss!"); + + redisMap.put("second", "Hello Rediss!"); + + System.out.println("redisMap.get(\"first\") = " + redisMap.get("first")); + + } } \ No newline at end of file diff --git a/src/main/java/org/redis/map/RedisMap.java b/src/main/java/org/redis/map/RedisMap.java new file mode 100644 index 0000000..9af892f --- /dev/null +++ b/src/main/java/org/redis/map/RedisMap.java @@ -0,0 +1,133 @@ +package org.redis.map; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import redis.clients.jedis.Jedis; +import redis.clients.jedis.resps.ScanResult; + +import java.util.*; + +public class RedisMap implements Map { + + private static final Logger log = LoggerFactory.getLogger(RedisMap.class); + private final Jedis jedis; + + public RedisMap(Jedis jedis) { + this.jedis = jedis; + } + + @Override + public int size() { + return (int) jedis.dbSize(); + } + + @Override + public boolean isEmpty() { + return jedis.dbSize() == 0; + } + + @Override + public boolean containsKey(Object key) { + return jedis.exists(key.toString()); + } + + @Override + public boolean containsValue(Object value) { + + String cursor = "0"; + + do { + ScanResult scanResult = jedis.scan(cursor); + for (String key : scanResult.getResult()) { + String foundValue = jedis.get(key); + if (Objects.equals(foundValue, value)) { + log.info("Нашёл ключ: {}", key); + return true; + } + } + cursor = scanResult.getCursor(); + } while (!"0".equals(cursor)); + + return false; + } + + @Override + public String get(Object key) { + return jedis.get(key.toString()); + } + + @Override + public String put(String key, String value) { + + String oldValue = jedis.get(key); + jedis.set(key, value); + return oldValue; + + } + + @Override + public String remove(Object key) { + + String value = jedis.get(key.toString()); + jedis.del(key.toString()); + return value; + + } + + @Override + public void putAll(Map m) { + m.forEach(jedis::set); + } + + @Override + public void clear() { + jedis.flushDB(); + } + + @Override + public Set keySet() { + return jedis.keys("*"); + } + + @Override + public Collection values() { + + String cursor = "0"; + List values = new ArrayList<>(); + + do { + ScanResult scanResult = jedis.scan(cursor); + List keys = scanResult.getResult(); + + for (String key : keys) { + String value = jedis.get(key); + values.add(value); + } + + cursor = scanResult.getCursor(); + } while (!"0".equals(cursor)); + + return values; + } + + @Override + public Set> entrySet() { + + String cursor = "0"; + Set> values = new HashSet<>(); + + do { + ScanResult scanResult = jedis.scan(cursor); + List keys = scanResult.getResult(); + + for (String key : keys) { + String value = jedis.get(key); + values.add(Map.entry(key, value)); + } + + cursor = scanResult.getCursor(); + } while (!"0".equals(cursor)); + + return values; + } +} diff --git a/src/test/java/org/redis/map/RedisMapTest.java b/src/test/java/org/redis/map/RedisMapTest.java new file mode 100644 index 0000000..e0cf9d2 --- /dev/null +++ b/src/test/java/org/redis/map/RedisMapTest.java @@ -0,0 +1,120 @@ +package org.redis.map; + +import org.junit.jupiter.api.*; +import redis.clients.jedis.Jedis; + +import java.util.*; + +import static org.junit.jupiter.api.Assertions.*; + +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +class RedisMapTest { + + private Jedis jedis; + private RedisMap redisMap; + + @BeforeAll + void setUpAll() { + jedis = new Jedis("localhost", 6379); + } + + /** + * for clearing db + */ + @BeforeEach + void setUp() { + jedis.flushDB(); + redisMap = new RedisMap(jedis); + } + + @AfterAll + void tearDownAll() { + jedis.close(); + } + + @Test + void testPutAndGet() { + redisMap.put("k1", "v1"); + assertEquals("v1", redisMap.get("k1")); + } + + @Test + void testPutReturnsOldValue() { + redisMap.put("k1", "v1"); + String old = redisMap.put("k1", "v2"); + assertEquals("v1", old); + assertEquals("v2", redisMap.get("k1")); + } + + @Test + void testContainsKey() { + redisMap.put("name", "name1"); + assertTrue(redisMap.containsKey("name")); + assertFalse(redisMap.containsKey("noname")); + } + + @Test + void testContainsValue() { + redisMap.put("first", "firstValue"); + assertTrue(redisMap.containsValue("firstValue")); + assertFalse(redisMap.containsValue("secondValue")); + } + + @Test + void testRemove() { + redisMap.put("temp", "123"); + String oldValue = redisMap.remove("temp"); + assertEquals("123", oldValue); + assertFalse(redisMap.containsKey("temp")); + } + + @Test + void testPutAll() { + Map bulk = Map.of("a", "1", "b", "2"); + redisMap.putAll(bulk); + assertEquals(2, redisMap.size()); + assertEquals("1", redisMap.get("a")); + } + + @Test + void testClear() { + redisMap.put("x", "1"); + redisMap.put("y", "2"); + redisMap.clear(); + assertEquals(0, redisMap.size()); + } + + @Test + void testKeySet() { + redisMap.put("k1", "v1"); + redisMap.put("k2", "v2"); + Set keys = redisMap.keySet(); + assertTrue(keys.containsAll(List.of("k1", "k2"))); + } + + @Test + void testValues() { + redisMap.put("k1", "v1"); + redisMap.put("k2", "v2"); + Collection values = redisMap.values(); + assertTrue(values.containsAll(List.of("v1", "v2"))); + } + + @Test + void testEntrySet() { + redisMap.put("k1", "v1"); + redisMap.put("k2", "v2"); + Set> entries = redisMap.entrySet(); + assertTrue(entries.contains(Map.entry("k1", "v1"))); + assertTrue(entries.contains(Map.entry("k2", "v2"))); + } + + @Test + void testIsEmptyAndSize() { + assertTrue(redisMap.isEmpty()); + redisMap.put("key", "val"); + assertEquals(1, redisMap.size()); + assertFalse(redisMap.isEmpty()); + } +} + From 721b7db4a5b2c296151cf4c6a830d0d211ddd139 Mon Sep 17 00:00:00 2001 From: DanKoDi Date: Wed, 15 Oct 2025 23:19:35 +0300 Subject: [PATCH 2/2] finished version --- src/main/java/org/redis/map/RedisMap.java | 2 ++ src/test/java/org/redis/map/RedisMapTest.java | 27 +++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/src/main/java/org/redis/map/RedisMap.java b/src/main/java/org/redis/map/RedisMap.java index 9af892f..bcc6c19 100644 --- a/src/main/java/org/redis/map/RedisMap.java +++ b/src/main/java/org/redis/map/RedisMap.java @@ -130,4 +130,6 @@ public Set> entrySet() { return values; } + + } diff --git a/src/test/java/org/redis/map/RedisMapTest.java b/src/test/java/org/redis/map/RedisMapTest.java index e0cf9d2..ce20013 100644 --- a/src/test/java/org/redis/map/RedisMapTest.java +++ b/src/test/java/org/redis/map/RedisMapTest.java @@ -116,5 +116,32 @@ void testIsEmptyAndSize() { assertEquals(1, redisMap.size()); assertFalse(redisMap.isEmpty()); } + + @Test + void testBasicOperations() { + RedisMap map = new RedisMap(jedis); + + // Put and Get + map.put("key1", "value1"); + assertEquals("value1", map.get("key1")); + + // Remove + map.remove("key1"); + assertNull(map.get("key1")); + + // Size + map.put("key1", "value1"); + map.put("key2", "value2"); + assertEquals(2, map.size()); + + // ContainsKey + assertTrue(map.containsKey("key1")); + assertFalse(map.containsKey("key3")); + + // Clear + map.clear(); + assertTrue(map.isEmpty()); + } + }