javascript
Spring Boot Redis简介
1.概述
在本文中,我們將通過Spring Data Redis庫回顧如何將Redis與Spring Boot結合使用的基礎知識。
我們將構建一個應用程序,演示如何通過Web界面執行CRUD操作Redis 。 Github上提供了該項目的完整源代碼。
2.什么是Redis?
Redis是一個開源的內存中鍵值數據存儲 ,用作數據庫,緩存和消息代理。 在實現方面,鍵值存儲代表NoSQL空間中最大和最舊的成員之一。 Redis支持帶范圍查詢的數據結構,例如字符串,哈希,列表,集合和排序集合。
通過為數據存儲提供抽象, Spring Data Redis框架使編寫使用Redis鍵值存儲的Spring應用程序變得容易。
3.設置Redis服務器
該服務器可從http://redis.io/download免費獲得。
如果您使用的是Mac,則可以通過自制軟件安裝它:
brew install redis然后啟動服務器:
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 connections4. Maven依賴
讓我們在pom.xml中聲明我們要構建的示例應用程序所必需的依賴項:
<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>5. Redis配置
我們需要將我們的應用程序與Redis服務器連接。 為了建立這種連接,我們使用Redis客戶端實現Jedis 。
5.1配置
讓我們從配置bean定義開始:
@BeanJedisConnectionFactory jedisConnectionFactory() {return new JedisConnectionFactory();}@Beanpublic 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被制成一個bean,因此我們可以創建一個RedisTemplate來查詢數據。
5.2消息發布者
遵循SOLID的原理 ,我們創建一個MessagePublisher接口:
public interface MessagePublisher {void publish(final String message); }我們實現了MessagePublisher接口,以使用高級RedisTemplate發布消息,因為RedisTemplate允許將任意對象作為消息傳遞:
@Service public class MessagePublisherImpl implements MessagePublisher {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;@Autowiredprivate 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);}}我們還將其定義為RedisConfig中的bean:
@BeanMessagePublisher redisPublisher() {return new MessagePublisherImpl(redisTemplate(), topic());}訊息偵聽器
為了訂閱消息,我們需要實現MessageListener接口:每次收到新消息時,都會調用回調,并通過名為onMessage的方法執行用戶代碼。 該接口可訪問消息,已通過其接收消息的通道以及訂閱使用的與該通道匹配的任何模式。
因此,我們創建一個服務類來實現MessageSubscriber :
@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()));}}我們向RedisConfig添加一個bean定義:
@BeanMessageListenerAdapter messageListener() {return new MessageListenerAdapter(new MessageSubscriber());}6. Redis存儲庫
現在我們已經配置了應用程序以與Redis服務器交互,我們將準備應用程序以獲取示例數據。
6.1模型
在此示例中,我們定義了具有兩個字段的Movie模型:
private String id; private String name; //standard getters and setters6.2儲存庫界面
與其他Spring Data項目不同, Spring Data Redis確實提供了在其他Spring Data接口之上構建的任何功能 。 對于擁有其他Spring Data項目經驗的我們來說這很奇怪。
通常,不需要使用Spring Data項目編寫存儲庫接口的實現。 我們只需要與界面進行交互即可。 Spring Data JPA提供了許多存儲庫接口,可以擴展它們以獲得諸如CRUD操作,派生查詢和分頁之類的功能。
因此,不幸的是, 我們需要編寫我們自己的接口 ,然后定義方法:
public interface RedisRepository {Map<Object, Object> findAllMovies();void add(Movie movie);void delete(String id);Movie findMovie(String id);}6.3資料庫的實施
我們的實現類使用我們的配置類RedisConfig定義的redisTemplate。
我們使用Spring Data Redis提供的HashOperations模板:
@Repository public class RedisRepositoryImpl implements RedisRepository {private static final String KEY = "Movie";private RedisTemplate<String, Object> redisTemplate;private HashOperations hashOperations;@Autowiredpublic RedisRepositoryImpl(RedisTemplate<String, Object> redisTemplate){this.redisTemplate = redisTemplate;}@PostConstructprivate 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);}}讓我們記下init()方法。 在此方法中,我們使用名為opsForHash()的函數,該函數返回對綁定到給定鍵的哈希值執行的操作。 然后,我們將init()中定義的hashOps用于所有CRUD操作。
7. Web界面
在本節中,我們將回顧向Web界面添加Redis CRUD操作功能。
7.1添加電影
我們希望能夠在我們的網頁中添加電影。 關鍵是電影ID ,值是實際對象。 但是,我們稍后將解決此問題,因此僅將電影名稱顯示為值。
因此,讓我們將表單添加到HTML文檔中,并分配適當的名稱和ID:
<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>現在,我們使用JavaScript來保存表單提交中的值:
$(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(); });我們為POST請求分配@RequestMapping值,請求鍵和值,創建一個Movie對象,并將其保存到存儲庫中:
@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);}7.2查看內容
添加Movie對象后,我們刷新表以顯示更新的表。 在7.1節JavaScript代碼塊中,我們調用了一個稱為refreshTable()JavaScript函數。 此函數執行GET請求以檢索存儲庫中的當前數據:
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]));}}}); }GET請求由名為findAll()的方法處理,該方法檢索存儲在存儲庫中的所有Movie對象,然后將數據類型從Map <Object,Object>轉換為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;}7.3刪除電影
我們編寫Javascript來執行POST請求 ? / delete ,刷新表,并將鍵盤焦點設置為按鍵輸入:
function deleteKey(key) {$.post('/delete', {key: key}, function() {refreshTable();$('#keyInput').focus();}); }我們請求密鑰,并根據此密鑰刪除redisRepository中的對象:
@RequestMapping(value = "/delete", method = RequestMethod.POST)public ResponseEntity<String> delete(@RequestParam String key) {redisRepository.delete(key);return new ResponseEntity<>(HttpStatus.OK);}8.演示
在這里,我們添加了兩部電影:
在這里,我們刪除了一部電影:
9.結論
在本教程中,我們介紹了Spring Data Redis,以及將其連接到Web應用程序以執行CRUD操作的一種方法。
示例應用程序的源代碼在Github上 。
翻譯自: https://www.javacodegeeks.com/2017/11/intro-redis-spring-boot.html
總結
以上是生活随笔為你收集整理的Spring Boot Redis简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ddos 白名单(ddos防御白名单)
- 下一篇: Java 9:JShell