随着NoSQL解决方案在许多问题上越来越受欢迎,现代项目越来越多地考虑使用一些(或几种)NoSQL代替(或并排)传统RDBMS。 我已经在本 , 本和本文章中介绍了我在MongoDB上的经验。 在本文中,我想对Redis (高级键值存储)进行一些调整。
除了非常丰富的键值语义外, Redis还支持发布订阅消息和事务。 在本文中,我将仅介绍一下表面,并演示将Redis集成到Spring应用程序中有多么简单。 与往常一样,我们将从我们项目的Maven POM文件开始:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelversion>4.0.0</modelversion><groupid>com.example.spring</groupid><artifactid>redis</artifactid><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><properties><project.build.sourceencoding>UTF-8</project.build.sourceencoding><spring.version>3.1.0.RELEASE</spring.version></properties><dependencies><dependency><groupid>org.springframework.data</groupid><artifactid>spring-data-redis</artifactid><version>1.0.0.RELEASE</version></dependency><dependency><groupid>cglib</groupid><artifactid>cglib-nodep</artifactid><version>2.2</version></dependency><dependency><groupid>log4j</groupid><artifactid>log4j</artifactid><version>1.2.16</version></dependency><dependency><groupid>redis.clients</groupid><artifactid>jedis</artifactid><version>2.0.0</version><type>jar</type></dependency><dependency><groupid>org.springframework</groupid><artifactid>spring-core</artifactid><version>${spring.version}</version></dependency><dependency><groupid>org.springframework</groupid><artifactid>spring-context</artifactid><version>${spring.version}</version></dependency></dependencies>
</project>
Spring Data Redis是Spring Data框架下的另一个项目,可将Redis无缝注入到您的应用程序中。 有多个Java的Redis客户端,我选择Jedis是因为它稳定并且在撰写本文时由Redis团队推荐。
我们将从简单的配置开始,并首先介绍必要的组件。 然后,随着我们的前进,将对配置进行一些扩展以展示pub-sub功能。 得益于Java config的支持,我们将创建配置类,并对所有依赖项进行强类型化,不再使用XML:
package com.example.redis.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericToStringSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;@Configuration
public class AppConfig {@BeanJedisConnectionFactory jedisConnectionFactory() {return new JedisConnectionFactory();}@BeanRedisTemplate< String, Object > redisTemplate() {final RedisTemplate< String, Object > template =  new RedisTemplate< String, Object >();template.setConnectionFactory( jedisConnectionFactory() );template.setKeySerializer( new StringRedisSerializer() );template.setHashValueSerializer( new GenericToStringSerializer< Object >( Object.class ) );template.setValueSerializer( new GenericToStringSerializer< Object >( Object.class ) );return template;}
}
基本上,这是我们需要的所有假设,前提是我们拥有单个Redis服务器并以默认配置在localhost上运行。 让我们考虑几种常见的用例:将键设置为某个值,存储对象以及最终实现pub-sub。 存储和检索键/值对非常简单:
@Autowired private RedisTemplate< String, Object > template;public Object getValue( final String key ) {return template.opsForValue().get( key );
}public void setValue( final String key, final String value ) {template.opsForValue().set( key, value );
}

(可选)可以将密钥设置为过期( Redis的另一个有用功能),即让我们的密钥在1秒钟后过期:

public void setValue( final String key, final String value ) {template.opsForValue().set( key, value );template.expire( key, 1, TimeUnit.SECONDS );
}

可以将任意对象作为哈希(映射)保存到Redis中 ,以便保存某些类User的实例

public class User {private final Long id;private String name;private String email;// Setters and getters are omitted for simplicity
}

使用密钥模式“ user:<id>”进入Redis :

public void setUser( final User user ) {final String key = String.format( "user:%s", user.getId() );final Map< String, Object > properties = new HashMap< String, Object >();properties.put( "id", user.getId() );properties.put( "name", user.getName() );properties.put( "email", user.getEmail() );template.opsForHash().putAll( key, properties);
}

分别使用id可以轻松地检查和检索对象。

public User getUser( final Long id ) {final String key = String.format( "user:%s", id );final String name = ( String )template.opsForHash().get( key, "name" );final String email = ( String )template.opsForHash().get( key, "email" );return new User( id, name, email );
}
使用Redis可以完成很多工作,我强烈建议您看一下。 它当然不是灵丹妙药,但可以非常轻松地解决许多具有挑战性的问题。 最后,让我展示如何在Redis中使用发布订阅消息。 让我们在这里添加更多配置(作为AppConfig类的一部分):
@Bean
MessageListenerAdapter messageListener() {return new MessageListenerAdapter( new RedisMessageListener() );
}@Bean
RedisMessageListenerContainer redisContainer() {final RedisMessageListenerContainer container = new RedisMessageListenerContainer();container.setConnectionFactory( jedisConnectionFactory() );container.addMessageListener( messageListener(), new ChannelTopic( "my-queue" ) );return container;
}
消息侦听器定义的样式对于Spring用户应该非常熟悉:通常,与我们定义JMS消息侦听器所采用的方法相同。 缺少的部分是我们的RedisMessageListener类定义:
package com.example.redis.impl;import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.connection.MessageListener;public class RedisMessageListener implements MessageListener {@Overridepublic void onMessage(Message message, byte[] paramArrayOfByte) {System.out.println( "Received by RedisMessageListener: " + message.toString() );}
}
现在,当我们有了消息监听器时,让我们看看如何使用Redis将一些消息推送到队列中。 和往常一样,这很简单:
@Autowired private RedisTemplate< String, Object > template;public void publish( final String message ) {template.execute(new RedisCallback< Long >() {@SuppressWarnings( "unchecked" )@Overridepublic Long doInRedis( RedisConnection connection ) throws DataAccessException {return connection.publish(( ( RedisSerializer< String > )template.getKeySerializer() ).serialize( "queue" ),( ( RedisSerializer< Object > )template.getValueSerializer() ).serialize( message ) );}});
}

基本上可以快速入门,但是绝对足以爱上Redis 。

参考: Andriy Redko {devmind}博客上的JCG合作伙伴 Andrey Redko 结合使用Spring和Redis 。

翻译自: https://www.javacodegeeks.com/2012/06/using-redis-with-spring.html

在Spring中使用Redis相关推荐

  1. 记自己在spring中使用redis遇到的两个坑

    本人在spring中使用redis作为缓存时,遇到两个坑,现在记录如下,算是作为自己的备忘吧,文笔不好,望大家见谅: 一.配置文件 1 <!-- 加载Properties文件 --> 2 ...

  2. redis 清空缓存_「镜头回放」简直了!spring中清除redis缓存导致应用挂死

    异常场景 springWeb应用一直运行正常,同事最近反应,每次版本更新完毕,刷新缓存,就会导致应用挂死.只有重启redis应用才恢复正常. 项目概况 springWeb项目,常用配置表做了redis ...

  3. Spring 中使用redis缓存方法记录

    背景 在平时项目中,可能会有某个条件的查询,会多次进到db里面去查,这样就会重复的查询相同的数据,但是我们的数据又不是需要更改及显示的,这时候就可以用到 方法的缓存了.例如在我们调用微信小程序时,需要 ...

  4. java 调用 spring,java中使用redis和spring中调用redis

    1.需要的jar包,配置的pom.xml文件 redis.clients jedis 2.7.2 2.java调用 /** * @文件名称: JedisTest.java * @描述: TODO * ...

  5. java redis 批量删除_在Spring中使用Redis Lua脚本批量删除缓存

    背景 之前分享了一篇利用lua脚本批量删除redis的key的文章.现在项目中我打算使用spring的缓存,而Spring缓存以前我是用ehcache来做实现的.没发现什么问题..这次我换成redis ...

  6. 关于Spring Boot + Mybatis + Redis二级缓存整合详解

    二级缓存是多个SqlSession共享的,其作用域是mapper的同一个namespace,不同的sqlSession两次执行相同namespace下的sql语句且向sql中传递参数也相同即最终执行相 ...

  7. java spring redis订阅_spring中订阅redis键值过期消息通知

    1.首先启用redis通知功能(ubuntu下操作): 编辑/etc/redis/redis.conf文件,添加或启用以下内容(过期通知): notify-keyspace-events Ex 或者登 ...

  8. Spring中使用RedisTemplate操作Redis(spring-data-redis)

    Redis 数据结构简介 Redis可以存储键与5种不同数据结构类型之间的映射,这5种数据结构类型分别为String(字符串).List(列表).Set(集合).Hash(散列)和 Zset(有序集合 ...

  9. redis spring 切面缓存_今日份学习: Spring中使用AOP并实现redis缓存?

    笔记 在Spring中如何使用AOP? Spring是如何切换JDK动态代理和CGLIB的? spring.aop.proxy-target-class=true (在下方第二个链接中,原生doc中提 ...

最新文章

  1. python学习必会知识点:对文件操作详解
  2. 启明云端分享 | SSD201\SSD202D 核心板如何批量烧录,母片制作教程分享
  3. Appscan漏洞 之 加密会话(SSL)Cookie 中缺少 Secure 属性
  4. 一步一步详解高斯日记
  5. Java Stream:计数始终是计数吗?
  6. TP类库解析和使用系列[Input类]
  7. Dubbo(十二)dubbo的服务版本配置以及本地存根使用介绍
  8. html文件可以分层吗,css分层是用什么标记?
  9. azure blob_如何在Azure Blob存储中恢复意外删除
  10. Android UI系列-----ScrollView和HorizontalScrollView
  11. Momentum, RMSprob and Adam
  12. picGo图片上传到码云失败,报错404-{“message”:“Branch”}的解决方法
  13. 【华为_数通】常用命令备忘
  14. eot文件html,html – 为什么IE8没有加载我的eot文件?
  15. 文件上传插件 bootstrap-fileinput ,后台使用的C#语言
  16. Retic 功放的使用方法
  17. 【统计分析】(task5) 金融量化分析与随机模拟(通过随机模拟估计看涨期权的报酬分布)
  18. dropblock代码和介绍
  19. cucumber基础测试用例
  20. PAT A1149 Dangerous Goods Packaging ——闲云潭影日悠悠,物换星移几度秋

热门文章

  1. java泛型程序设计——泛型类型的继承原则
  2. final 实例域+final类+final方法(阻止继承)
  3. jdk8切换成jdk6_运行中的JDK语言功能预览:切换表达式
  4. jax-rs jax-ws_什么是JAX-RS注释?
  5. 需求澄清_澄清字符串的格式!
  6. lua中keyvalue_40行中的持久性KeyValue Server和一个可悲的事实
  7. openshift_在WildFly和OpenShift上的WebSocket聊天
  8. 将Quarkus应用程序部署到AWS Elastic Beanstalk
  9. Java 8 Stream中间操作(方法)示例
  10. 硒测试中所需的功能和示例