Redis и Spring Data с самого начала. Часть 3
2026-03-10 22:35 Diff

Теги: nosql, spring data, разработчик на spring framework, redis, redisoperations, key-value nosql, templates, .opsforvalue(), redistemplate, @transactional

В первой части мы рассмотрели NoSQL базы данных, в частности Key-Value NoSQL БД, и обсудили одну из самых популярных NoSQL БД — Redis. Во второй части мы узнали, что такое Spring Data и Spring Data Redis Repositories. В этой части посмотрим на альтернативный вариант подключения к Redis с помощью различных *Operations-классов (ну, точнее, интерфейсов, реализации будут – *Templates).

Spring Data Redis Operations

Корневым интерфейсом является RedisOperations и из него можно получить все остальные, которые предоставляются на большинство типов данных Redis. С помощью таких классов можно более специфично реализовывать mapping сущностей, а также более эффективно утилизировать место в Redis.

Итак, напишем свой собственный репозиторий на их основе. Сама сущность:

public class SimplePerson { private String id; private String name; public SimplePerson(String name) { this.id = UUID.randomUUID().toString(); this.name = name; } public SimplePerson(String id, String name) { this.id = id; this.name = name; } // геттеры и сеттеры }

Допустим, мы хотим хранить эту сущность не в виде хэша, а компактно в виде строк (name) по ключу. Соответственно наш репозиторий:

@Repository @Transactional public class SimplePersonRepository { private final RedisOperations<String, String> ops; public SimplePersonRepository(RedisOperations<String, String> ops) { this.ops = ops; } public SimplePerson findById(String id) { String name = ops.opsForValue().get(id); return new SimplePerson(id, name); } public String save(SimplePerson person) { ops.opsForValue().set(person.getId(), person.getName()); return person.getId(); } }

Обратите внимание, что мы из корневого класса RedisOperations получаем операции для работы со значениями .opsForValue(). В действительности, таких возможностей – почти под каждый тип данных.

Ну и наконец, код программы с бином RedisTemplate:

@SpringBootApplication public class Main { @Bean public RedisOperations redisOperations(LettuceConnectionFactory connectionFactory) { RedisTemplate<String, String> redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(connectionFactory); redisTemplate.setEnableTransactionSupport(true); return redisTemplate; } public static void main(String[] args) { ApplicationContext context = SpringApplication.run(Main.class, args); SimplePersonRepository repository = context.getBean(SimplePersonRepository.class); String id = repository.save(new SimplePerson("Cidre")); SimplePerson person = repository.findById(id); System.out.println(person.getName()); } }

Оставлю вам удовольствие самостоятельно разобраться, например, нужна или нет аннотация @Transactional на этом репозитории. Несложно догадаться, что после работы в базе останутся следующие данные:

127.0.0.1:6379> keys * 1) "87c5a482-11e9-4ef4-8bb4-c77f5873aaa9" 127.0.0.1:6379> type 87c5a482-11e9-4ef4-8bb4-c77f5873aaa9 string 127.0.0.1:6379> get 87c5a482-11e9-4ef4-8bb4-c77f5873aaa9 "Cidre"

На этом всё. Успешного использования Redis!