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
6 changes: 2 additions & 4 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,8 @@ target/
!**/src/test/**/target/

### IntelliJ IDEA ###
.idea/modules.xml
.idea/jarRepositories.xml
.idea/compiler.xml
.idea/libraries/
.idea
.run
*.iws
*.iml
*.ipr
Expand Down
8 changes: 0 additions & 8 deletions .idea/.gitignore

This file was deleted.

6 changes: 0 additions & 6 deletions .idea/jpa-buddy.xml

This file was deleted.

34 changes: 17 additions & 17 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,22 +1,22 @@
# Практическое задание 2 # Redis Map
## Prerequisites
- JDK 17+
- Apache Maven 3.9+
- Docker

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

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

Redis поднимается командой
## Getting started
```bash
git clone https://github.com/swankygawk/RedisMap.git
cd RedisMap
```

## Launching demo
```bash
docker-compose up -d
mvn compile exec:java -Dexec.mainClass="org.redis.Application"
```

**Как выполнить:**
1. Сделать форк этого проекта
2. Сделать ветку dev в своем проекте. Выполнять работу в ней
3. После выполнения работы открыть Pull Request в master
4. Назначить ментора ревьювером
5. Отправить ссылку на PR в тг чат ментору
## Launching tests
```bash
mvn test
```
Tests use testcontainers, so make sure to have a running Docker environment
22 changes: 22 additions & 0 deletions TASKREADME.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# Практическое задание 2 # Redis Map

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

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

Redis поднимается командой
```
docker-compose up -d
```

**Как выполнить:**
1. Сделать форк этого проекта
2. Сделать ветку dev в своем проекте. Выполнять работу в ней
3. После выполнения работы открыть Pull Request в master
4. Назначить ментора ревьювером
5. Отправить ссылку на PR в тг чат ментору
4 changes: 1 addition & 3 deletions docker-compose.yaml
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
version: '3.3'

services:
redis:
container_name: redis
image: redis:latest
image: redis:8.2.1
restart: always
ports:
- "6379:6379"
57 changes: 55 additions & 2 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,68 @@
</properties>

<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.42</version>
<scope>provided</scope>
</dependency>

<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>33.5.0-jre</version>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>5.1.5</version>
<version>6.2.0</version>
</dependency>

<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.36</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.8.1</version>
<version>5.13.4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<version>3.27.6</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-junit-jupiter</artifactId>
<version>5.20.0</version>
<scope>test</scope>
</dependency>
<!--suppress VulnerableLibrariesLocal -->
<!-- probably doesn't matter for testing purposes -->
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>testcontainers</artifactId>
<version>1.21.3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>junit-jupiter</artifactId>
<version>1.21.3</version>
<scope>test</scope>
</dependency>
<!--suppress VulnerableLibrariesLocal -->
<!-- probably doesn't matter for testing purposes -->
<dependency>
<groupId>com.redis.testcontainers</groupId>
<artifactId>testcontainers-redis</artifactId>
<version>1.6.4</version>
<scope>test</scope>
</dependency>
</dependencies>
Expand Down
80 changes: 80 additions & 0 deletions src/main/java/org/redis/Application.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
package org.redis;

import redis.clients.jedis.Jedis;

import java.util.Map;

@SuppressWarnings({"CallToPrintStackTrace", "ConstantValue"})
public final class Application {
public static void main(String[] args) {
try (Jedis jedis = new Jedis("localhost", 6379)) {
Map<String, String> userCache = new RedisMap(jedis, "users-cache");
userCache.clear();

System.out.println("\n--- Демонстрация RedisMap ---");
System.out.println("\nНачальное состояние: isEmpty: " + userCache.isEmpty() + ", Размер: " + userCache.size());

// --------------------------------------------------------------------------

System.out.println("\n1. Добавление пользователей");

userCache.put("user:1", "Alice");
userCache.put("user:2", "Bob");
String previousValue = userCache.put("user:3", "Charlie");

System.out.println("put(\"user:3\", \"Charlie\") вернул: " + previousValue);
System.out.println("Текущий размер: " + userCache.size());

// --------------------------------------------------------------------------

System.out.println("\n2. Получение данных");

String user1 = userCache.get("user:1");

System.out.println("Значение для \"user:1\": " + user1);
System.out.println("Есть ли ключ \"user:2\"? " + userCache.containsKey("user:2"));
System.out.println("Есть ли значение \"Diana\"? " + userCache.containsValue("Diana"));

// --------------------------------------------------------------------------

System.out.println("\n3. Обновление пользователя \"user:3\"");

previousValue = userCache.put("user:3", "Charles");

System.out.println("put(\"user:3\", \"Charles\") вернул старое значение: " + previousValue);
System.out.println("Новое значение для \"user:3\": " + userCache.get("user:3"));

// --------------------------------------------------------------------------

System.out.println("\n4. Все пользователи:");

for (Map.Entry<String, String> entry : userCache.entrySet()) {
System.out.printf(" - Ключ: %s, Значение: %s%n", entry.getKey(), entry.getValue());
}

// --------------------------------------------------------------------------

System.out.println("\n5. Удаление пользователя \"user:2\"");

String removedUser = userCache.remove("user:2");

System.out.println("Удаленное значение: " + removedUser);
System.out.println("Размер после удаления: " + userCache.size());

// --------------------------------------------------------------------------

System.out.println("\n6. Очистка");

userCache.clear();

System.out.println("Финальное состояние: isEmpty: " + userCache.isEmpty() + ", Размер: " + userCache.size());

// --------------------------------------------------------------------------

System.out.println("\n--- Окончание демонстрации ---");
} catch (Exception e) {
System.err.println("Ошибка при работе с Redis: " + e.getMessage());
e.printStackTrace();
}
}
}
7 changes: 0 additions & 7 deletions src/main/java/org/redis/Main.java

This file was deleted.

Loading