Terjemahan artikel ini disiapkan khusus untuk siswa kursus "Pengembang Kerangka Kerja Musim Semi".
Pada artikel ini, kita akan membahas dasar-dasar penggunaan Redis melalui Spring Boot menggunakan perpustakaan Spring Data Redis.

Kami akan membuat aplikasi yang menunjukkan cara melakukan operasi CRUD melalui antarmuka web. Kode sumber untuk proyek
ini tersedia di GitHub .
Apa itu Redis?
Redis adalah gudang data sumber terbuka untuk struktur data
nilai kunci yang dapat digunakan sebagai pangkalan data, cache, dan pesan. Dalam hal implementasi, kunci-nilai toko adalah di antara perwakilan terbesar dan tertua di dunia NoSQL. Redis mendukung struktur data seperti string, hash, daftar, set, dan set yang diurutkan dengan kueri rentang.
Kerangka kerja
Spring Data Redis membuatnya mudah untuk menulis aplikasi Spring yang menggunakan penyimpanan Redis, memberikan abstraksi penyimpanan data yang nyaman.
Pengaturan Server Redis
Server tersedia gratis di
sini .
Jika Anda menggunakan Mac, Anda dapat menginstalnya menggunakan
homebrew
:
brew install redis
Kemudian mulai server:
mikes-MacBook-Air:~ mike$ redis-server 10699:C 23 Nov 08:35:58.306 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo 10699:C 23 Nov 08:35:58.307 # Redis version=4.0.2, bits=64, commit=00000000, modified=0, pid=10699, just started 10699:C 23 Nov 08:35:58.307 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf 10699:M 23 Nov 08:35:58.309 * Increased maximum number of open files to 10032 (it was originally set to 256). _._ _.-``__ ''-._ _.-`` `. `_. ''-._ Redis 4.0.2 (00000000/0) 64 bit .-`` .-```. ```\/ _.,_ ''-._ ( ' , .-` | `, ) Running in standalone mode |`-._`-...-` __...-.``-._|'` _.-'| Port: 6379 | `-._ `._ / _.-' | PID: 10699 `-._ `-._ `-./ _.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | http://redis.io `-._ `-._`-.__.-'_.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | `-._ `-._`-.__.-'_.-' _.-' `-._ `-.__.-' _.-' `-._ _.-' `-.__.-' 10699:M 23 Nov 08:35:58.312 # Server initialized 10699:M 23 Nov 08:35:58.312 * Ready to accept connections
Ketergantungan maven
Mari kita mendeklarasikan dependensi yang diperlukan di
pom.xml
untuk aplikasi yang akan kita gunakan:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
Konfigurasi redis
Kita perlu menghubungkan aplikasi kita dengan server Redis. Untuk membangun koneksi, kami menggunakan
Jedis , implementasi klien Redis.
Konfigurasi
Mari kita mulai dengan definisi kacang konfigurasi:
@Bean JedisConnectionFactory jedisConnectionFactory() { return new JedisConnectionFactory(); } @Bean public RedisTemplate<String, Object> redisTemplate() { final RedisTemplate<String, Object> template = new RedisTemplate<String, Object>(); template.setConnectionFactory(jedisConnectionFactory()); template.setValueSerializer(new GenericToStringSerializer<Object>(Object.class)); return template; }
JedisConnectionFactory
disajikan sebagai kacang, sehingga kita dapat membuat
RedisTemplate
untuk meminta data.
Penerbit Posting
Mengikuti
prinsip -
prinsip SOLID , kami membuat antarmuka
MessagePublisher
:
public interface MessagePublisher { void publish(final String message); }
Kami mengimplementasikan antarmuka
MessagePublisher
menggunakan RedisTemplate tingkat tinggi untuk mempublikasikan pesan, karena
RedisTemplate
memungkinkan
RedisTemplate
mengirim objek sewenang-wenang sebagai pesan:
@Service public class MessagePublisherImpl implements MessagePublisher { @Autowired private RedisTemplate<String, Object> redisTemplate; @Autowired private ChannelTopic topic; public MessagePublisherImpl() { } public MessagePublisherImpl(final RedisTemplate<String, Object> redisTemplate, final ChannelTopic topic) { this.redisTemplate = redisTemplate; this.topic = topic; } public void publish(final String message) { redisTemplate.convertAndSend(topic.getTopic(), message); } }
Kami juga mendefinisikan ini sebagai kacang di
RedisConfig
:
@Bean MessagePublisher redisPublisher() { return new MessagePublisherImpl(redisTemplate(), topic()); }
Penerima pesan
Untuk berlangganan pesan, Anda perlu mengimplementasikan antarmuka
MessageListener
: setiap kali pesan baru tiba, kode pengguna yang terletak di metode
onMessage
. Antarmuka ini menyediakan akses ke pesan, saluran yang melaluinya diterima, dan memungkinkan Anda untuk menggunakan templat apa pun yang digunakan untuk berlangganan saluran tersebut.
@Service public class MessageSubscriber implements MessageListener { public static List<String> messageList = new ArrayList<String>(); public void onMessage(final Message message, final byte[] pattern) { messageList.add(message.toString()); System.out.println("Message received: " + new String(message.getBody())); } }
Juga, kelas ini harus didaftarkan sebagai kacang di
RedisConfig
:
@Bean MessageListenerAdapter messageListener() { return new MessageListenerAdapter(new MessageSubscriber()); }
Redisepositori
Sekarang kami telah menyiapkan aplikasi untuk berinteraksi dengan server Redis, kami akan menyiapkan aplikasi untuk menerima data uji.
Model
Untuk contoh ini, kami mendefinisikan model
Movie
dengan dua bidang:
private String id; private String name;
Antarmuka repositori
Tidak seperti proyek Spring Data lainnya, Spring Data Redis menyediakan semua yang Anda butuhkan untuk bekerja di atas antarmuka Spring Data lainnya. Ini mungkin terlihat aneh bagi orang yang berpengalaman dengan proyek Data Musim Semi lainnya.
Seringkali tidak perlu menulis implementasi antarmuka repositori dengan proyek-proyek Spring Data. Kami hanya berinteraksi dengan antarmuka. Spring Data JPA menyediakan banyak antarmuka repositori yang dapat diperluas untuk menyediakan fitur seperti operasi CRUD, kueri turunan, dan pagination.
Jadi, sayangnya, kita perlu
menulis antarmuka kita sendiri, dan kemudian mendefinisikan metode :
public interface RedisRepository { Map<Object, Object> findAllMovies(); void add(Movie movie); void delete(String id); Movie findMovie(String id); }
Implementasi Repositori
Kelas menggunakan
redisTemplate
didefinisikan dalam
RedisConfig
konfigurasi
RedisConfig
.
Kami menggunakan
HashOperations
, yang ditawarkan oleh Spring Data Redis:
@Repository public class RedisRepositoryImpl implements RedisRepository { private static final String KEY = "Movie"; private RedisTemplate<String, Object> redisTemplate; private HashOperations hashOperations; @Autowired public RedisRepositoryImpl(RedisTemplate<String, Object> redisTemplate){ this.redisTemplate = redisTemplate; } @PostConstruct private void init(){ hashOperations = redisTemplate.opsForHash(); } public void add(final Movie movie) { hashOperations.put(KEY, movie.getId(), movie.getName()); } public void delete(final String id) { hashOperations.delete(KEY, id); } public Movie findMovie(final String id){ return (Movie) hashOperations.get(KEY, id); } public Map<Object, Object> findAllMovies(){ return hashOperations.entries(KEY); } }
Mari kita perhatikan metode
init()
. Dalam metode ini, kami menggunakan fungsi yang disebut
opsForHash()
, mengembalikan operasi yang dilakukan dengan nilai hash yang
opsForHash()
dengan kunci ini. Kemudian kami menggunakan
hashOps
, yang didefinisikan dalam
init()
, untuk semua operasi CRUD kami.
Antarmuka web
Pada bagian ini, kita akan melihat menambahkan kemampuan Redis CRUD ke antarmuka web.
Menambahkan film
Kami ingin dapat menambahkan film melalui halaman web. Kuncinya adalah pengidentifikasi film, dan nilainya adalah objek yang sebenarnya. Namun, kami akan kembali ke sini nanti, jadi hanya nama film yang ditampilkan sebagai nilainya.
Mari menambahkan formulir ke dokumen HTML dan menetapkan nama dan pengidentifikasi yang sesuai:
<form id="addForm"> <div class="form-group"> <label for="keyInput">Movie ID (key)</label> <input name="keyInput" id="keyInput" class="form-control"/> </div> <div class="form-group"> <label for="valueInput">Movie Name (field of Movie object value)</label> <input name="valueInput" id="valueInput" class="form-control"/> </div> <button class="btn btn-default" id="addButton">Add</button> </form>
Sekarang kami menggunakan JavaScript untuk menyimpan nilai saat mengirimkan formulir:
$(document).ready(function() { var keyInput = $('#keyInput'), valueInput = $('#valueInput'); refreshTable(); $('#addForm').on('submit', function(event) { var data = { key: keyInput.val(), value: valueInput.val() }; $.post('/add', data, function() { refreshTable(); keyInput.val(''); valueInput.val(''); keyInput.focus(); }); event.preventDefault(); }); keyInput.focus(); });
Kami menetapkan parameter
@RequestMapping
untuk permintaan POST, meminta kunci dan nilai, membuat objek
Movie
dan menyimpannya di repositori:
@RequestMapping(value = "/add", method = RequestMethod.POST) public ResponseEntity<String> add( @RequestParam String key, @RequestParam String value) { Movie movie = new Movie(key, value); redisRepository.add(movie); return new ResponseEntity<>(HttpStatus.OK); }
Lihat Konten
Setelah objek Movie ditambahkan, kami memperbarui tabel untuk menampilkan nilai-nilai baru. Dalam blok kode JavaScript, kami memanggil fungsi
refreshTable()
. Itu melakukan permintaan GET untuk mendapatkan data saat ini di repositori:
function refreshTable() { $.get('/values', function(data) { var attr, mainTable = $('#mainTable tbody'); mainTable.empty(); for (attr in data) { if (data.hasOwnProperty(attr)) { mainTable.append(row(attr, data[attr])); } } }); }
Permintaan GET diproses oleh metode
findAll()
, yang mengambil semua objek Film yang disimpan di toko dan kemudian mengonversi tipe data dari
Map <Object, Object>
ke
Map <String, String>
:
@RequestMapping("/values") public @ResponseBody Map<String, String> findAll() { Map<Object, Object> aa = redisRepository.findAllMovies(); Map<String, String> map = new HashMap<String, String>(); for(Map.Entry<Object, Object> entry : aa.entrySet()){ String key = (String) entry.getKey(); map.put(key, aa.get(key).toString()); } return map; }
Penghapusan film
Kami akan menulis skrip untuk melakukan permintaan POST di sepanjang jalur
/delete
, perbarui tabel dan alihkan fokus keyboard untuk input yang nyaman:
function deleteKey(key) { $.post('/delete', {key: key}, function() { refreshTable(); $('#keyInput').focus(); }); }
Kami meminta kunci dan menghapus objek di
redisRepository
berdasarkan kunci ini:
@RequestMapping(value = "/delete", method = RequestMethod.POST) public ResponseEntity<String> delete(@RequestParam String key) { redisRepository.delete(key); return new ResponseEntity<>(HttpStatus.OK); }
Demo
Di sini kami menambahkan dua film:

Dan satu film telah dihapus:

Kesimpulan
Dalam panduan ini, kami melihat Spring Data Redis dan satu cara untuk menghubungkannya ke aplikasi web untuk melakukan operasi CRUD.
Kode sumber untuk aplikasi sampel ada di
GitHub .
Itu saja. Secara tradisional menunggu komentar Anda.