HTML Diff
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&lt;String, String&gt; ops; public SimplePersonRepository(RedisOperations&lt;String, String&gt; 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&lt;String, String&gt; ops; public SimplePersonRepository(RedisOperations&lt;String, String&gt; 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&lt;String, String&gt; redisTemplate = new RedisTemplate&lt;&gt;(); 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&lt;String, String&gt; redisTemplate = new RedisTemplate&lt;&gt;(); 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&gt; keys * 1) "87c5a482-11e9-4ef4-8bb4-c77f5873aaa9" 127.0.0.1:6379&gt; type 87c5a482-11e9-4ef4-8bb4-c77f5873aaa9 string 127.0.0.1:6379&gt; get 87c5a482-11e9-4ef4-8bb4-c77f5873aaa9 "Cidre"<p>На этом всё. Успешного использования<strong>Redis</strong>!</p>
10 127.0.0.1:6379&gt; keys * 1) "87c5a482-11e9-4ef4-8bb4-c77f5873aaa9" 127.0.0.1:6379&gt; type 87c5a482-11e9-4ef4-8bb4-c77f5873aaa9 string 127.0.0.1:6379&gt; get 87c5a482-11e9-4ef4-8bb4-c77f5873aaa9 "Cidre"<p>На этом всё. Успешного использования<strong>Redis</strong>!</p>
11  
11