0 added
0 removed
Original
2026-01-01
Modified
2026-03-10
1
<p>Теги: nosql, spring data, разработчик на spring framework, redis, redisoperations, key-value nosql, templates, .opsforvalue(), redistemplate, @transactional</p>
1
<p>Теги: nosql, spring data, разработчик на spring framework, redis, redisoperations, key-value nosql, templates, .opsforvalue(), redistemplate, @transactional</p>
2
<p>В<a>первой части</a>мы рассмотрели NoSQL базы данных, в частности Key-Value NoSQL БД, и обсудили одну из самых популярных NoSQL БД - Redis. Во<a>второй части</a>мы узнали, что такое Spring Data и Spring Data Redis Repositories. В этой части посмотрим на альтернативный вариант подключения к Redis с помощью различных *Operations-классов (ну, точнее, интерфейсов, реализации будут - *Templates).</p>
2
<p>В<a>первой части</a>мы рассмотрели NoSQL базы данных, в частности Key-Value NoSQL БД, и обсудили одну из самых популярных NoSQL БД - Redis. Во<a>второй части</a>мы узнали, что такое Spring Data и Spring Data Redis Repositories. В этой части посмотрим на альтернативный вариант подключения к Redis с помощью различных *Operations-классов (ну, точнее, интерфейсов, реализации будут - *Templates).</p>
3
<h2>Spring Data Redis Operations</h2>
3
<h2>Spring Data Redis Operations</h2>
4
<p>Корневым интерфейсом является<strong>RedisOperations</strong>и из него можно получить все остальные, которые предоставляются на большинство типов данных<strong>Redis</strong>. С помощью таких классов можно более специфично реализовывать mapping сущностей, а также более эффективно утилизировать место в Redis.</p>
4
<p>Корневым интерфейсом является<strong>RedisOperations</strong>и из него можно получить все остальные, которые предоставляются на большинство типов данных<strong>Redis</strong>. С помощью таких классов можно более специфично реализовывать mapping сущностей, а также более эффективно утилизировать место в Redis.</p>
5
<p>Итак, напишем свой собственный репозиторий на их основе. Сама сущность:</p>
5
<p>Итак, напишем свой собственный репозиторий на их основе. Сама сущность:</p>
6
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; } // геттеры и сеттеры }<p>Допустим, мы хотим хранить эту сущность не в виде хэша, а компактно в виде строк (name) по ключу. Соответственно наш репозиторий:</p>
6
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; } // геттеры и сеттеры }<p>Допустим, мы хотим хранить эту сущность не в виде хэша, а компактно в виде строк (name) по ключу. Соответственно наш репозиторий:</p>
7
@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(); } }<p>Обратите внимание, что мы из корневого класса RedisOperations получаем операции для работы со значениями .opsForValue(). В действительности, таких возможностей - почти под каждый тип данных.</p>
7
@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(); } }<p>Обратите внимание, что мы из корневого класса RedisOperations получаем операции для работы со значениями .opsForValue(). В действительности, таких возможностей - почти под каждый тип данных.</p>
8
<p>Ну и наконец, код программы с бином<strong>RedisTemplate</strong>:</p>
8
<p>Ну и наконец, код программы с бином<strong>RedisTemplate</strong>:</p>
9
@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()); } }<p>Оставлю вам удовольствие самостоятельно разобраться, например, нужна или нет аннотация @Transactional на этом репозитории. Несложно догадаться, что после работы в базе останутся следующие данные:</p>
9
@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()); } }<p>Оставлю вам удовольствие самостоятельно разобраться, например, нужна или нет аннотация @Transactional на этом репозитории. Несложно догадаться, что после работы в базе останутся следующие данные:</p>
10
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"<p>На этом всё. Успешного использования<strong>Redis</strong>!</p>
10
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"<p>На этом всё. Успешного использования<strong>Redis</strong>!</p>
11
11