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 connections

4. 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 setters

6.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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/348718.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Dijkstra-解决最短路径问题

1、从A开始&#xff08;也可以从其他点&#xff0c;此处选择从A&#xff09; 将A 加入树&#xff0c;A被圈红 列出最短路径数组&#xff1a; 2、 确定从A到其他顶点的最短距离为50&#xff0c;A-->B 将B加入树&#xff1a; 更新最短路径数组&#xff1a; 比较到C的距离&a…

jackson使用_如何在Jackson中使用PropertyNamingStrategy

jackson使用Jackson api被广泛用于将json转换为Object并将Object转换为JSON。因此&#xff0c;如果您有json字符串并想在java对象中进行转换&#xff0c;请创建与json中的字段相同的bean的字段名。 Jackson在将json字段映射到java对象字段时遵循标准的bean约定&#xff0c;但是…

简单排序--冒泡排序

冒泡排序&#xff1a; public void sort(){int out,in;//out指向已经排好序的前一个for( outnElements-1;out>1;out--){for(in0;in<out;in){if(arr[in]>arr[in1]){swap(in,in1);//相邻的两个元素比较&#xff0c;交换}}}}//实现冒泡排序相邻的元素两两比较&#xff0c…

jca使用_使用JCA的密码学–提供者中的服务

jca使用Java密码体系结构&#xff08;JCA&#xff09;是一个可扩展的框架&#xff0c;使您能够使用执行加密操作。 JCA还促进实现独立性&#xff08;程序不应该在乎谁提供加密服务&#xff09;和实现互操作性&#xff08;程序不应该与特定加密服务的特定提供者联系在一起&#…

简单排序--选择排序

选择排序&#xff1a; public void sort(){int out,in,min;for(out0;out<nElements-1;out){min out;for(inout1;in<nElements;in)if(arr[in]<arr[min])min in;swap(out,min);//将min放在out位置&#xff0c;out始终指向最小值的下一个位置&#xff0c;即下一个min要…

Java 9模块服务

接线与查找 Java长期以来都有一个ServiceLoader类。 它是在1.6中引入的&#xff0c;但是自Java 1.2以来就使用了类似的技术。 一些软件组件使用了它&#xff0c;但是使用并不广泛。 它可以用于模块化应用程序&#xff08;甚至更多&#xff09;&#xff0c;并提供一种使用应用程…

简单排序--插入排序

插入排序&#xff1a; public void sort(){int in,out,temp;for(out1;out<nElements;out){temp arr[out];in out;while(in>0&&arr[in-1]>temp){arr[in] arr[in-1];//待插入的数据比其之前的数字大的右移&#xff0c;从小到大排序--in;//依次左移}arr[in] …

ejb 2.1 jboss_JBoss AS 8中的Java EE 7和EJB 3.2支持

ejb 2.1 jboss你们中有些人可能已经知道Java EE 7规范的Public Final Draft版本已经发布 。 除此以外&#xff0c;此版本的Java EE还引入了EJB规范的EJB 3.2版本。 与EJB 3.1规范相比&#xff0c;EJB 3.2具有一些新功能。 我在这里引用EJB 3.2规范中的文本&#xff0c;总结了新…

一些工厂实例

我时不时地发现自己摸索了一些旧的代码&#xff0c;以找到示例“我在哪里做过工厂一样的事情”。 上周再次发生这种情况时&#xff0c;我决定只查找所有示例&#xff0c;并创建一个示例项目和有关它的博客文章。 所以在这篇文章中&#xff0c;我&#xff1a; 从简单的“原始…

Android Studio Problems

p1、VT-x is disabled in BIOS 一般开机按F2进入BIOS界面&#xff0c;在configuration中将 Intel Virtulization Technology设置为Enabled p2、Genymotion显示DISCONNECTED&#xff0c;在Genymotion设置页面&#xff0c;将SDK路径改为Android Studio的SDK路径

eclipse工程导入Android Studio

在eclipse中选中要导出的工程&#xff08;此工程在eclipse中最好不要有错误&#xff09;&#xff0c;右键选择Export->Generate Gradle build files 在本地工程里生成了一个build.gradle文件。 在AS中选择 导入成功后会生成一个import-summary.txt 导入成功。

idea中drl文件_得分DRL:在OptaPlanner中更快,更轻松

idea中drl文件对于OptaPlanner &#xff08; Drools Planner&#xff09;6.0.0.Beta1&#xff0c;我已经用更优雅的ConstraintMatch系统替换了ConstraintOccurrence。 结果是您的DRL评分文件为&#xff1a; 快多了 更容易读写 错误的发生率要低得多&#xff0c;因为它们使得…

超棒的Glide图片加载

GitHub开源&#xff1a;https://github.com/bumptech/glide 超棒的工具&#xff0c;竟然还可以加载.gif !!Glide完全基于Picasso&#xff0c;沿袭了其简洁风格&#xff0c;并在其基础上做了大量优化与改进。 1、Glide默认的Bitmap格式是RGB_565&#xff0c;而Picasso默认ARGB_…

JUnit 5符合AssertJ

JUnit 5在断言库中带来了很多改进&#xff0c;这主要归功于Java 8和Lambda Expression支持以及新断言&#xff08;如assertAll &#xff0c; assertTimeout或assertThrows 。 尽管我真的很喜欢JUnit 5&#xff0c;但我相信AssertJ在生产级单元测试中仍然是必须的&#xff0c;我…

开源GraphView的使用--数据统计

最近做室内定位需要绘出加速度传感器输出的三个方向的加速度曲线&#xff0c;找到了开源https://github.com/jjoe64/GraphView-Demos&#xff0c;省去了要重新学MatLab **。 在http://www.android-graphview.org/download--getting-started.html下载.jar包。 1、GraphView的使…

json绑定到实体_绑定到JSON和XML –处理集合

json绑定到实体EclipseLink JAXB&#xff08;MOXy&#xff09;的优势之一是能够使用单个元数据集将对象模型映射到JSON和XML。 一个弱点是您需要在JSON键或XML元素上折中集合属性。 我很高兴地说这个问题已经在EclipseLink 2.5&#xff08;和EclipseLink 2.4.2&#xff09;中解…

Java JDK 10会有什么期望

由于我们刚刚习惯于9月发布的Java 9&#xff0c;因此距离下一代Java的发布只有几个月的时间了。 就在本月&#xff0c;计划中的Java Development Kit 10升级已进入开发的主要减速阶段。 在第一个初始阶段&#xff0c;可以修复一个到三个错误。 JDK 10是Java Standard Edition …

jpa配置映射包_JPA – Hibernate –包级别的类型映射

jpa配置映射包当我们最终成熟到可以在JPA中使用某些自定义类型映射时&#xff0c;我们通常会停留在某些提供程序特定的解决方案上&#xff0c;因为JPA本身并未定义任何用于执行此操作的机制。 让我为您展示一个JPA提供程序Hibernate的自定义类型映射定义的示例。 假设我们在项目…