在Spring中使用Redis

随着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

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

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

相关文章

C# 中winform的一些属性设置

1 窗体的大小固定住&#xff0c;不能调整其大小 窗体FormBorderStyle 属性设置为 FixedSingle; MaximizeBox 属性设置为false; MinimizeBox 属性设置为 false; 2. 在状态栏中无图标显示 设置为fase即可。 3. 设置窗体的启动位置 方法1&#xff0c; 用代码控制 this.Location …

LiveBos---按钮成下拉

转载于:https://www.cnblogs.com/luhanzhen/p/6802779.html

Solr:创建拼写检查器

在上一篇文章中&#xff0c;我谈到了Solr Spellchecker的工作原理&#xff0c;然后向您展示了其性能的一些测试结果。 现在&#xff0c;我们将看到另一种拼写检查方法。 与其他方法一样&#xff0c;此方法使用两步过程。 相当快速的“候选单词”选择&#xff0c;然后对这些单词…

linux修改机器名称

1 使用hostname命令&#xff1a;hostname 新机器名称 2 修改vi /etc/sysconfig/network # cat /etc/sysconfig/network NETWORKINGyes HOSTNAMElocalhost.localdomain 注意&#xff1a;左侧都必须大写&#xff0c;等号附件没有空格。 查看机器名称使用hostname命令 转载于:h…

java property_property在Java中的用法

展开全部在项目中经常用到各种配置文件62616964757a686964616fe78988e69d8331333337623561&#xff0c;有.properties的&#xff0c;也有.xml格式的都可以通过java.utils.Property类进行处理。1. 读取.properties文件File pFile new File("test.properties");FileIn…

Django 和 html

下面是对应的形式&#xff0c;自定义的forms 转载于:https://www.cnblogs.com/kilen/p/6804047.html

Grails动态下拉菜单

最近&#xff0c;我有一个UI要求&#xff0c;客户希望从两个单独的下拉列表中选择值。 第一个下拉列表的值实质上过滤了第二个下拉列表的值。 鉴于我们支持的财务项目对UI的要求并不严格&#xff0c;因此我不得不进行一些初步的学习和实验&#xff0c;以实现良好的实施。 这篇博…

【Java大系】Java快速教程

感谢原作者&#xff1a;Vamei 出处&#xff1a;http://www.cnblogs.com/vamei Java是面向对象语言。这门语言其实相当年轻&#xff0c;于1995年才出现&#xff0c;由Sun公司出品。James Gosling领导了Java的项目小组。该项目的最初只想为家电设计一门容易移植的语言。然而&am…

[转]前端构建工具gulpjs的使用介绍及技巧

本文转自&#xff1a;http://www.cnblogs.com/2050/p/4198792.html gulpjs是一个前端构建工具&#xff0c;与gruntjs相比&#xff0c;gulpjs无需写一大堆繁杂的配置参数&#xff0c;API也非常简单&#xff0c;学习起来很容易&#xff0c;而且gulpjs使用的是nodejs中stream来读取…

Eclipse侧边栏Outline设置字体

Eclipse的Outline&#xff0c;Project Explorer&#xff0c;Call Hierarchy等小窗口是很方便的功能&#xff0c;但是遇到函数名或文件名很长的情况&#xff0c;就只能显示前半段。尽管Eclipse的自定义程度很高&#xff0c;但是却找不到这些窗口的字体设置。 经过一番摸索后&…

AOP的简单介绍

为什么使用AOP&#xff0c;一个简单的回答这个问题的方法是显示一个横切关注点的实现而不使用AOP。 考虑一个简单的服务及其实现&#xff1a; public interface InventoryService {public Inventory create(Inventory inventory);public List<inventory> list();public I…

java实现表达式求值_如何编写一个高效的Java表达式求值程序

虽然&#xff0c;这个题目是有一点夺人眼球&#xff0c;但我真实这么做了(关是以否信任基准测试效果&#xff0c;这是其他一个话题)。所以&#xff0c;上周我一贯在找一个小型、适用的竞赛争辩数学表达式的类库。有功夫我在stackoverflow上看到了一个帖子&#xff0c;里面举荐的…

两张表的笛卡尔积用sql语句

第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小SELECT * FROM table1 CROSS JOIN table2转载于:https://www.cnblogs.com/henuyuxiang/p/6811717.html

[dpdk] 读官方文档(3)

续前节&#xff0c; 测试小程序 1. 想编译测试程序首先需要设置两个环境变量&#xff0c;为什么呢&#xff0c;因为测试程序的Makefile里用了。。。 rpm装了打包好的devel包&#xff0c;这个rpm也会自带这两个环境变量。就是说写第三方程序的时候&#xff0c;习惯上&#xff0c…

比较OpenDDR和WURFL

量身定制的Web内容通常受益于定制&#xff0c;以考虑多种因素&#xff0c;例如屏幕大小&#xff0c;标记语言支持和图像格式支持。 此类信息存储在“设备描述存储库”&#xff08;DDR&#xff09;中。 WURFL和OpenDDR项目都提供了访问DDR的API&#xff0c;以简化并促进适应其交…

逻辑表达式——黑纸白纸

一、问题描述 有A、B、C、D、E五个人&#xff0c;每人额头上都贴了一张黑色或白色的纸条。五人对坐&#xff0c;每人都可以看到其他人额头上的纸的颜色&#xff0c;但都不知道自己额头上的纸的颜色。五人互相观察后&#xff0c; A说&#xff1a;“我看见有三个人额头上贴的是白…

java 1.6u29 下载_jdk1.6 64位下载|JDK 6(Java SE Development Kit)下载6u43 64位官方版_java运行环境 IT猫扑网...

jdk1.6 64位适用于x64的系统安装的java运行环境&#xff0c;Java SE Development Kit6是java开发人员必备的产品&#xff0c;也叫做jdk6&#xff0c;欢迎下载使用。官方介绍适用于您的计算机(windows)的 Java 软件&#xff0c;即 Java Runtime Environment&#xff0c;也称为 J…

ZK 6中的MVVM初探

MVVM与MVC 在上一篇文章中&#xff0c;我们已经看到Ajax框架ZK如何采用CSS选择器启发的Controller来在View中连接UI组件并监听它们的事件。 在此ZK MVC模式下&#xff0c; View中的UI组件无需绑定到任何Controller方法或数据对象。 使用选择器模式作为将View状态和事件映射到Co…

消失循环的2023?你都做了什么? | 2023 年度总结

2023年度总结 -- 今年都做了什么事&#xff1f; 前言心态关键词感悟 记录申请软著独立游戏技术成长 共勉 前言 又到了一年一次年度总结的时候了。我们常常感叹时间飞逝&#xff0c;却又没办法让它放慢的脚步。那就将2023写下来&#xff0c;让它在时间的长河中留下一丝记忆。 心…

由于SSH配置文件的不匹配,导致的Permission denied (publickey)及其解决方法

读者如要转载&#xff0c;请标明出处和作者名&#xff0c;谢谢。 地址01&#xff1a;http://space.itpub.net/25851087 地址02&#xff1a;http://www.cnblogs.com/zjrodger/ 作者名&#xff1a;zjrodger 【问题发生环境和相关参数】(1)OS&#xff1a;Win7 32Bit. (2)Git&#…