Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

124 changes: 124 additions & 0 deletions .idea/uiDesigner.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

90 changes: 74 additions & 16 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,22 +1,80 @@
# Практическое задание 2 # Redis Map
# RedisMap

В рамках практической задачи нужно реализовать прослойку между Redis и интерфейсом Map
Достаточно будет реализации Map<String, String>
Простая реализация интерфейса `Map<String, String>` с использованием Redis через Jedis клиент.

**Описание:**<br>
✅ Написать реализацию методов Map<String, String>, которая будет работать с Redis<br>
✅ Работать с redis можно через Jedis<br>
✅ Покрыть все методы тестами<br>
✅ Для поднятия redis, в корне проекта есть docker-compose файл <br>
## Цель проекта

Redis поднимается командой
```
Показать, как можно создать прослойку между Redis и стандартным Java интерфейсом Map.

## Быстрый старт

### Предварительные требования
- Java 17 или выше
- Maven 3.6+
- Docker Desktop

### 1. Запуск Redis
```bash
# Запуск Redis в Docker
docker-compose up -d

# Проверка статуса
docker ps

# Остановка Redis
docker-compose down
```

### 2. Сборка проекта
```bash
# Очистка и компиляция
mvn clean compile

# Сборка JAR файла
mvn clean package
```

### 3. Запуск примера
```bash
# через JAR файл
java -cp target/classes org.redis.Main
```

### 4. Запуск тестов
```bash
# Все тесты
mvn test
```

**Как выполнить:**
1. Сделать форк этого проекта
2. Сделать ветку dev в своем проекте. Выполнять работу в ней
3. После выполнения работы открыть Pull Request в master
4. Назначить ментора ревьювером
5. Отправить ссылку на PR в тг чат ментору
## Что делает проект

`RedisMap` - это класс, который реализует интерфейс `Map<String, String>` и использует Redis для хранения данных.

### Основные возможности:
- **Полная совместимость** с `Map<String, String>`
- **Namespace изоляция** - разные экземпляры не пересекаются
- **Простота использования** - работает как обычная Map
- **Автоматическое управление ресурсами** - try-with-resources

### Архитектура:
- **RedisMap**: Реализует Map<String, String>
- **Jedis**: Java клиент для Redis
- **Redis Hash**: Структура данных для хранения key-value пар
- **Namespace**: Префикс для изоляции данных

## Тестирование

Проект включает простые тесты, которые проверяют:
- **Базовые операции Map** (put, get, remove, clear)
- **Методы коллекций** (keySet, values, entrySet)
- **Обработку edge cases** (null ключи, неверные типы)
- **Изоляцию namespace** между разными экземплярами
- **Метод putAll** для массового добавления


### Описание файлов:
- **`RedisMap.java`**: Реализация интерфейса Map<String, String>
- **`Main.java`**: Демонстрация возможностей RedisMap
- **`RedisMapTest.java`**: JUnit тесты для проверки функциональности
- **`pom.xml`**: Зависимости (Jedis, JUnit) и плагины Maven
- **`docker-compose.yaml`**: Конфигурация Redis контейнера
20 changes: 20 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
<artifactId>jedis</artifactId>
<version>5.1.5</version>
</dependency>

<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
Expand All @@ -28,4 +29,23 @@
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0</version>
</plugin>

<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<mainClass>org.redis.Main</mainClass>
</configuration>
</plugin>
</plugins>
</build>

</project>
69 changes: 68 additions & 1 deletion src/main/java/org/redis/Main.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,74 @@
package org.redis;

import redis.clients.jedis.Jedis;
import java.util.Map;

/**
* Простой пример с демонстрацией основных возможностей использования RedisMap.
*/
public class Main {
public static void main(String[] args) {
System.out.println("Hello world!");

try (Jedis jedis = new Jedis("localhost", 6379)) {
System.out.println(" Redis connection: " + jedis.ping());

RedisMap redisMap = new RedisMap(jedis, "example:map");

System.out.println("Empty map size: " + redisMap.size());
System.out.println("Map is empty: " + redisMap.isEmpty());

System.out.println("\nAdding elements...");
redisMap.put("name", "John");
redisMap.put("age", "25");
redisMap.put("city", "Moscow");

System.out.println("Size after adding: " + redisMap.size());

System.out.println("\nGetting elements:");
System.out.println("name: " + redisMap.get("name"));
System.out.println("age: " + redisMap.get("age"));
System.out.println("city: " + redisMap.get("city"));

System.out.println("\nChecking existence:");
System.out.println("Contains key 'name': " + redisMap.containsKey("name"));
System.out.println("Contains key 'email': " + redisMap.containsKey("email"));

System.out.println("\nUpdating element:");
String oldAge = redisMap.put("age", "26");
System.out.println("Old age: " + oldAge);
System.out.println("New age: " + redisMap.get("age"));

System.out.println("\nAll keys: " + redisMap.keySet());
System.out.println("All values: " + redisMap.values());

System.out.println("\nRemoving element:");
String removedCity = redisMap.remove("city");
System.out.println("Removed city: " + removedCity);
System.out.println("Size after removal: " + redisMap.size());

System.out.println("\nUsing putAll:");
Map<String, String> additionalData = Map.of(
"profession", "Programmer",
"experience", "3 years"
);
redisMap.putAll(additionalData);
System.out.println("Size after putAll: " + redisMap.size());

System.out.println("\nAll entries:");
for (Map.Entry<String, String> entry : redisMap.entrySet()) {
System.out.println(" " + entry.getKey() + " = " + entry.getValue());
}

System.out.println("\nClearing map:");
redisMap.clear();
System.out.println("Size after clearing: " + redisMap.size());
System.out.println("Map is empty: " + redisMap.isEmpty());

System.out.println("\n Demonstration completed successfully!");

} catch (Exception e) {
System.err.println(" Error: " + e.getMessage());
e.printStackTrace();
}
}
}
Loading