Перейти до основного вмісту

Робота SpringBoot 3 з базою даних Redis

Redis

Redis (Remote Dictionary Server) — це in-memory база даних ключ-значення з відкритим вихідним кодом, що використовується для зберігання структурованих даних. Вона підтримує різні типи даних, такі як рядки, списки, множини, упорядковані множини з діапазонами, хеші, бітові масиви, потоки і т. д.

Redis широко використовується для кешування, управління сесіями, систем обміну повідомленнями, черг задач та інших сценаріїв, що вимагають високої продуктивності і низької затримки.

Redis з SpringBoot

Розглянемо простий проєкт на SpringBoot, що використовує Redis, як базу даних.

Створимо такий проєкт:

Створимо entity Cat:


import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.redis.core.RedisHash;

@Data
@RedisHash("cat")
public class Cat {
    @Id
    private String id;
    private String name;
    private Integer age;

    public Cat(String name, Integer age) {
        this.name = name;
        this.age = age;
    }
}

Зверніть увагу на атрибут @RedisHash

Відповідний DTO-об'єкт:


import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;

@Data
@AllArgsConstructor
@Builder
public class CatDto {
    private String name;
    private Integer age;
}

Мапер для перетворення DTO в entity:


import com.example.demo_redis.domain.Cat;
import com.example.demo_redis.dto.CatDto;
import org.springframework.stereotype.Component;

@Component
public class CatMapper {

    public Cat toCatEntity(CatDto catDto){
        return new Cat(catDto.getName(),catDto.getAge());
    }
}

Репозиторій:


import com.example.demo_redis.domain.Cat;
import org.springframework.data.repository.CrudRepository;

public interface CatRepository 
extends CrudRepository <Cat,String> {
}

Простий сервіс:


import com.example.demo_redis.domain.Cat;
import com.example.demo_redis.dto.CatDto;
import com.example.demo_redis.mapper.CatMapper;
import com.example.demo_redis.repository.CatRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.util.Optional;

@Service
@RequiredArgsConstructor
public class CatService {

    private final CatRepository catRepository;
    private final CatMapper catMapper;

    public Iterable<Cat> getAll(){
        return  catRepository.findAll();
    }

    public Optional<Cat> getById(String id){
        return catRepository.findById(id);
    }

    public Cat save(CatDto catDto){
        return catRepository.save(catMapper.toCatEntity(catDto));
    }
}

І контроллер:


import com.example.demo_redis.domain.Cat;
import com.example.demo_redis.dto.CatDto;
import com.example.demo_redis.service.CatService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.Optional;

@RestController
@RequestMapping("/apicat")
@Slf4j
@RequiredArgsConstructor
public class CatController {
    private final CatService catService;

    @GetMapping("cats")
    public ResponseEntity<Iterable<Cat>> getAllCats(){
        return new ResponseEntity<>(catService.getAll(), HttpStatus.OK);
    }

    @GetMapping("cats/{id}")
    public ResponseEntity < ? > getCatById(@PathVariable String id){
        Optional < Cat> catOptional = catService.getById(id);
        if(catOptional.isPresent()) {
            return new ResponseEntity<>(catOptional.get(),HttpStatus.OK);
        }else {
            return ResponseEntity.notFound().build();
        }
    }

    @PostMapping("cats")
    public ResponseEntity<?> addCat(@RequestBody CatDto catDto){
        return ResponseEntity.ok(catService.save(catDto));
    }

}

Запуск Redis на Docker локально

Створення і запуск контейнера:

docker run -d --name redis-stack-server -p 6379:6379 redis/redis-stack-server:latest

Вхід в контейнер:


docker exec -it 31fb8534a97a /bin/bash

де 31fb8534a97a - id, яке можна дізнатися командою:


docker ps

Використати redis-cli всередині контейнера:


redis-cli

Параметри застосунка

У файл application.properties додати наступні рядки:


spring.redis.host=localhost
spring.redis.port=6379
spring.redis.password=my-secret

Тестування

Після успішного запуску можна додати записи в базу даних за допомогою, наприклад, Postman

Після входу в Redis можна подивитися список ключів командою:


KEYS *

В результаті має бути приблизно такий рядок:


"cat:bcced506-8799-4817-bacf-0904ac6aa7c2"

Подивитися вміст запису можна командою:


HGETALL "cat:bcced506-8799-4817-bacf-0904ac6aa7c2"

Результат буде приблизно таким:


1) "_class"
2) "com.example.demo_redis.domain.Cat"
3) "age"
4) "3"
5) "id"
6) "bcced506-8799-4817-bacf-0904ac6aa7c2"
7) "name"
8) "Tom"

Коментарі

Популярні публікації

Колекції в Elixir

Списки Що таке список у Elixir У Elixir список — це впорядкована колекція елементів, реалізована як однозв’язний список . Це означає, що кожен елемент (вузол) зберігає посилання на наступний, але не на попередній. Така структура дозволяє швидко додавати елементи на початок списку, але повільно доступати до довільного елементу. У Java подібну структуру представляє LinkedList — частина Java Collections Framework. Вона реалізована як двозв’язний список, що забезпечує зручне додавання/видалення елементів з початку або кінця списку. Створення списків У Elixir список створюється за допомогою квадратних дужок: list = [1, 2, 3, 4] Додавання елементів У Elixir новий елемент можна додати тільки на початок списку за допомогою оператора | : # Elixir list = [2, 3, 4] new_list = [1 | list] # [1, 2, 3, 4] Доступ до елементів У Elixir немає прямого доступу до елементів за індексом, але це можна зробити через Enum.at : Enum.at([10, 20, 30], 1) # 20 Ітерація по списку У Elixir ...

Інструменти для роботи з Node.js

Що таке npm? npm (Node Package Manager) — це офіційний пакетний менеджер для Node.js . Він дозволяє: Встановлювати сторонні бібліотеки та фреймворки Керувати залежностями проєкту Запускати скрипти (команди) через package.json Приклад ініціалізації проєкту з npm npm init -y Файл package.json (скорочений приклад) { "name": "my-project", "version": "1.0.0", "scripts": { "start": "ts-node src/index.ts", "build": "tsc" }, "dependencies": { "express": "^4.18.0" }, "devDependencies": { "typescript": "^5.0.0", "ts-node": "^10.0.0" } } Що таке tsconfig.json? tsconfig.json — це файл конфігурації для компілятора TypeScript, який визначає, як слід компілювати код. Приклад файлу tsconfig.json { "compilerOptions": { "target": "ES2020...

Атоми в мові програмування Elixir

Атоми в Elixir Атоми є фундаментальною концепцією в Elixir , що відіграє ключову роль у створенні надійних та масштабованих систем. В Elixir це специфічний тип даних, який є константою , незмінною , ідентифікованою за своїм ім'ям . Отже, атом в Elixir — це іменована константа, що представляє себе. Уявіть, що ви даєте унікальне ім'я певній речі, і це ім'я завжди посилається саме на цю річ, і ніколи на щось інше. Наприклад, атом :ok завжди буде означати саме успішне завершення операції, а не якесь інше значення. Технічно, атоми є похідними від чисел . Кожен унікальний атом зберігається у таблиці атомів, і йому присвоюється унікальний цілочисельний ідентифікатор. Це робить їх надзвичайно ефективними для порівняння: замість порівняння рядків (що є повільною операцією), Elixir порівнює цілочисельні ідентифікатори. Переваги та особливості використання атомів Переваги атомів: Ефективність. Завдяки своєму числовому представленню, порівняння атомів є дуже швидким. Це осо...

Встановлення PostgreSQL на Ubuntu-сервер

Встановлення Оновлюємо пакети та встановлюємо PostgreSQL: sudo apt update sudo apt install -y postgresql postgresql-contrib Перевіряємо статус сервісу: sudo systemctl status postgresql Якщо PostgreSQL не запущений, запустимо його: sudo systemctl start postgresql sudo systemctl enable postgresql Налаштування безпеки Зміна пароля: sudo -u postgres psql У консолі PostgreSQL: ALTER USER postgres PASSWORD 'міцний_пароль'; \q \q - вихід з консолі. Список основних команд для роботи з PostgreSQL можна переглянути за посиланням. За замовчуванням PostgreSQL слухає localhost (127.0.0.1). Щоб дозволити доступ із зовнішніх машин, редагуємо конфігурацію: sudo nano /etc/postgresql/17/main/postgresql.conf (замість 17 вкажи версію PostgreSQL, яку встановлено) Шукаємо рядок: #listen_addresses = 'localhost' та замінюємо на listen_addresses = '*' Зберігаємо (Ctrl + X, Y, Enter). Тепер редагуємо pg_hba.conf: sudo nano /etc/postgresql/17/main/pg_hba.conf...

Основи Node.js

Що таке Node.js? Node.js — це середовище виконання JavaScript поза браузером, побудоване на рушії Google V8 . Воно дозволяє запускати JavaScript на сервері, створюючи серверні застосунки з високою продуктивністю. Основні характеристики: Однопотокова модель з неблокуючим I/O Асинхронне виконання за допомогою event loop Висока продуктивність у роботі з мережевими запитами npm — найбільший реєстр пакетів Що таке event loop? Event loop — це механізм в Node.js, який дозволяє неблокуючим асинхронним операціям виконуватись у середовищі з єдиним потоком. Він постійно перевіряє наявність подій у черзі та викликає відповідні колбеки. Як працює однопоточність у Node.js? Node.js використовує один потік (main thread) для обробки JavaScript-коду. Операції, які займають час (мережеві запити, читання з файлової системи), делегуються до системних API або thread pool, і після завершення результат повертається у основний потік через event loop. Приклад: асинхронна о...