除了关系型数据库之外,现在还有一种 NoSQL 数据库非常流行,而 Spring 自然也没有放过对它的支持。

NoSQL 数据库有很多种,如:

  • MongoDBGenericJackson2JsonRedisSerializer
  • Redis
  • Membase

我们这里就重点讲解 Redis

注:这里前置认为各位对 Redis 已经有所了解并且安装好环境,如果对 Redis 还不了解的同学可以先移步到 Redis学习总结系列

导入依赖

<!-- Redis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency> <dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>2.1.3.RELEASE</version>
</dependency> <dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.4.2</version>
</dependency>

连接到 Redis

Redis 客户端有很多种 **Spring Data Redis ** 也对这些客户端实现分别提供了连接工厂:

  • JedisConnectionFactory
  • JredisConnectionFactory
  • LettuceConnectionFactory
  • SrpConnectionFactory

具体选择哪个连接工厂取决于项目需求,我们这里以 JedisConnectionFactory 为例。

Spring Data Redis 2.0 开始已经不推荐直接显式配置连接信息了,一方面为了使配置信息与建立连接工厂解耦,另一方面抽象出 Standalone,SentinelRedisCluster 三种模式的环境配置类和一个统一的 jedis 客户端连接配置类(用于配置连接池和SSL连接),使得我们可以更加灵活方便根据实际业务场景需要来配置连接信息。

不使用连接池

@Configuration
public class RedisConfiguration { @Bean
public RedisStandaloneConfiguration redisStandaloneConfiguration() {
RedisStandaloneConfiguration redisStandaloneConfiguration =
new RedisStandaloneConfiguration();
// 设置主机地址
redisStandaloneConfiguration.setHostName("localhost");
// 设置默认数据库
redisStandaloneConfiguration.setDatabase(0);
// 设置密码
// redisStandaloneConfiguration.setPassword(RedisPassword.of("123456"));
// 设置端口
redisStandaloneConfiguration.setPort(6379);
return redisStandaloneConfiguration;
} @Bean
public RedisConnectionFactory redisConnectionFactory(RedisStandaloneConfiguration redisStandaloneConfiguration) {
return new JedisConnectionFactory(redisStandaloneConfiguration);
} }

使用连接池单机版

@Configuration
public class RedisConfiguration { /**
* 连接池配置信息
*
* @return
*/
@Bean
public JedisPoolConfig jedisPoolConfig() {
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
//最大连接数
jedisPoolConfig.setMaxTotal(100);
//最小空闲连接数
jedisPoolConfig.setMinIdle(20);
//当池内没有可用的连接时,最大等待时间
jedisPoolConfig.setMaxWaitMillis(10000);
return jedisPoolConfig;
} @Bean
public JedisClientConfiguration jedisClientConfiguration(JedisPoolConfig jedisPoolConfig){
// 获得默认的连接池构造器
JedisClientConfiguration.JedisPoolingClientConfigurationBuilder jpcb =
(JedisClientConfiguration.JedisPoolingClientConfigurationBuilder) JedisClientConfiguration.builder();
// 指定 jedisPoolConifig 来修改默认的连接池构造器
jpcb.poolConfig(jedisPoolConfig);
// 通过构造器来构造 jedis 客户端配置
JedisClientConfiguration jedisClientConfiguration = jpcb.build();
return jedisClientConfiguration;
} @Bean
public RedisStandaloneConfiguration redisStandaloneConfiguration() {
RedisStandaloneConfiguration redisStandaloneConfiguration =
new RedisStandaloneConfiguration();
// 设置主机地址
redisStandaloneConfiguration.setHostName("localhost");
// 设置默认数据库
redisStandaloneConfiguration.setDatabase(0);
// 设置密码
// redisStandaloneConfiguration.setPassword(RedisPassword.of("123456"));
// 设置端口
redisStandaloneConfiguration.setPort(6379);
return redisStandaloneConfiguration;
} @Bean
public RedisConnectionFactory redisConnectionFactory(RedisStandaloneConfiguration redisStandaloneConfiguration,
JedisClientConfiguration jedisClientConfiguration) {
return new JedisConnectionFactory(redisStandaloneConfiguration, jedisClientConfiguration); } }

使用 RedisTemplate

Spring Data 类似, Spring Data Redis 以模板的形式提供了数据访问方案,模板如下:

  • RedisTemplate
  • StringRedisTemplate

RedisTemplate 能够让我们持久化各种类型的 kye 和 value ,而 StringRedisTemplate 扩展了 RedisTemplate 只关注 String 类型。

RedisTemplate 常用方法

方法名 作用
opsForValue() 操作具有简单值的条目
opsForList() 操作具有 List 值的条目
opsForSet() 操作具有 set 值的条目
opsForHash() 操作具有 hash 值的条目
boundValueOps(K) 以绑定指定 key 的方式,操作具有简单值的条目
boundListOps(K) 以绑定指定 key 的方式,操作具有 list 值的条目
boundSetOps(K) 以绑定指定 key 的方式,操作具有 set 值的条目
boundHashOps(K) 以绑定指定 key 的方式,操作具有 hash 值的条目

配置模板 Bean

@Bean
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory){
return new StringRedisTemplate(redisConnectionFactory);
}

单元测试

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = RootConfig.class)
public class RedisTest { @Autowired
private RedisTemplate redisTemplate; /**
* 操作简单数据
*/
@Test
public void testSimpleValue() {
String kye = "name";
String value = "MarkLogZhu";
redisTemplate.opsForValue().set(kye, value);
String getValue = (String) redisTemplate.opsForValue().get(kye);
Assert.assertEquals(value,getValue);
} /**
* 操作 List 数据
*/
@Test
public void testListValue(){
String key = "nameList";
List<String> nameList = new ArrayList<>();
nameList.add("张三");
nameList.add("李四");
nameList.add("王五");
redisTemplate.opsForList().rightPush(key,nameList);
List<String> getNameList =(List<String>) redisTemplate.opsForList().rightPop(key);
Assert.assertEquals(nameList,getNameList);
} /**
* 操作 Set 数据
*/
@Test
public void testSetValue(){
String key = "nameSet";
Set nameSet = new HashSet();
nameSet.add("张三");
nameSet.add("李四");
nameSet.add("王五");
redisTemplate.opsForSet().add(key,nameSet);
Set getNameSet =(Set) redisTemplate.opsForSet().pop(key);
Assert.assertEquals(nameSet,getNameSet);
} }

序列化器

当某个数据需要保存到 Redis 的时候, keyvalue 都会使用 Redis 的序列器(serializer) 进行序列化。Spring Data Redis 提供了多个序列化器:

  • GenericToStringSerializer:使用 Spring 转换服务进行序列化
  • JacksonJsonRedisSerializer:使用 Jackson1 将对象序列化为 JSON
  • Jackson2JsonRedisSerializer:使用 Jackson2 将对象序列化为 JSON
  • JdkSerializationRedisSerializer:使用 Java 序列化
  • OxmSerializer:使用 **Spring O/X ** 映射的编排器和解排器实现序列化,用于 XML 序列化
  • StringRedisSerializer:序列化 String 类型的 keyvalue

这些序列化器都实现了 RedisSerializer 接口,如果上述序列化器还不能满足,可以自己实现这个接口。

RedisTemplate 默认使用 JdkSerializationRedisSerializer , 而 StringRedisTemplate 默认使用 StringRedisSerializer

配置序列化器

@Bean
public RedisTemplate<String ,?> redisTemplate(RedisConnectionFactory redisConnectionFactory){
RedisTemplate redisTemplate = new RedisTemplate();
redisTemplate.setConnectionFactory(redisConnectionFactory);
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new StringRedisSerializer());
return redisTemplate;
}

Spring学习之旅(十三)--使用NoSQL数据库的更多相关文章

  1. Spring学习之旅(八)Spring 基于AspectJ注解配置的AOP编程工作原理初探

    由小编的上篇博文可以一窥基于AspectJ注解配置的AOP编程实现. 本文一下未贴出的相关代码示例请关注小编的上篇博文<Spring学习之旅(七)基于XML配置与基于AspectJ注解配置的AO ...

  2. Spring学习之旅(十)--MockMvc

    在之前的 Spring学习之旅(八)--SpringMVC请求参数 我们是通过在控制台输出来验证参数是否正确,但是这样做实在是太耗时间了,我们今天来学习下 MockMvc,它可以让我们不需要启动项目就 ...

  3. 大数据学习资料之SQL与NOSQL数据库

    这几年的大数据热潮带动了一激活了一大批hadoop学习爱好者.有自学hadoop的,有报名培训班学习的.所有接触过hadoop的人都知道,单独搭建hadoop里每个组建都需要运行环境.修改配置文件测试 ...

  4. Spring学习之旅(一)--初始Spring

    之前从博客.视频断断续续的学到了 Spring 的相关知识,但是都是一个个碎片化的知识.刚好最近在读 <Sprign实战(第四版)>,所以借此机会重新整理下Spring 系列的内容. Sp ...

  5. Dubbo学习系列之十三(Mycat数据库代理)

    软件界有只猫,不用我说,各位看官肯定知道是哪只,那就是大名鼎鼎的Tomcat,现在又来了一只猫,据说是位东方萌妹子,暂且认作Tom猫的表妹,本来叫OpencloudDB,后又改名为Mycat,或许Ca ...

  6. Spring学习之旅(十五)--SpringBoot

    在使用 Spring 的过程中,有时候会出现一些 ClassNotFoundException 异常,这是因为 JAR 依赖之间的版本不匹配所导致的.而 Spring Boot 就能避免绝大多数依赖版 ...

  7. Spring学习之旅(十四)--缓存

    数据库的读写并发一直都是应用性能的瓶颈所在之一,针对改动频率很小的数据我们应该将他存放到缓存中,减少与数据库的交互. 启用对缓存的支持 Spring 对缓存的支持有两种方式: 注解驱动的缓存 XML ...

  8. Spring学习之旅(十二)--持久化框架

    对于本职工作来说 JDBC 就可以很好的完成,但是当我们对持久化的需求变得更复杂时,如: 延迟加载 预先抓取 级联 JDBC 就不能满足了,我们需要使用 ORM框架 来实现这些需求. Spring 对 ...

  9. Spring学习之旅(十一)--JDBC

    JDBC 是数据持久化的一种比较常见的方案,Spring 也对它进行了支持. 在开始 JDBC 的使用之前,我们要先做下一些准备工作. 配置数据源 在 Spring 上下文中可以数据源 Bean 有如 ...

随机推荐

  1. c语言进阶3-有参函数

    一.       有参函数的定义 有参函数的定义格式如下: 类型标识符  函数名(形式参数表列) { 语句: } 如 void fun(int a,int b) { printf(“a+b=%d”,a ...

  2. jsp定义全局变量:读取properties文件

    <%java.util.Properties prop = new java.util.Properties();java.io.InputStream in;in = getClass().g ...

  3. 浅谈linux中shell变量$#,$@,$0,$1,$2,$?的含义解释

    浅谈linux中shell变量$#,$@,$0,$1,$2,$?的含义解释 下面小编就为大家带来一篇浅谈linux中shell变量$#,$@,$0,$1,$2的含义解释.小编觉得挺不错的,现在就分享给 ...

  4. [Revit]Autodesk Revit 二次开发整理(资料、准备工作和环境搭建)

    1 前言 Revit被Autodesk收购之后,整理和开放了一大部分API,供开发者实现自己的功能和程序,总体来说API的功能比较完善,毕竟市面上已经出现了各式各样的插件. 本人也是初学者,在Revi ...

  5. 10G文件如何对里面单词出现排序

    10G文件如何对里面单词出现排序的问题(只要文件系统支持,不限大小). 其实这个问题很简单,10G文件是很大,但是出现的字符或单词是很有限的. 单字符只有那么一百多个,单词数量满打满算,以英文单词总数 ...

  6. jquery的addClass、removeClass、toggleClass方法

    1.addClass()添加类 1.1 用jquery为某一个元素添加类 $("div").addClass("active");//给div元素添加activ ...

  7. 雪花算法【分布式ID问题】【刘新宇】

    分布式ID 1 方案选择 UUID UUID是通用唯一识别码(Universally Unique Identifier)的缩写,开放软件基金会(OSF)规范定义了包括网卡MAC地址.时间戳.名字空间 ...

  8. Unity的弱联网Json数据传输

    注意事项: 关于dictionary转json的工程中遇到一点问题:要手动添加双引号. 关于json转dictionary:同样需要手动去掉双引号,否则添加到dictionary中的字符串会带有双引号 ...

  9. 算法与数据结构基础 - 排序(Sort)

    排序基础 排序方法分两大类,一类是比较排序,快速排序(Quick Sort).归并排序(Merge Sort).插入排序(Insertion Sort).选择排序(Selection Sort).希尔 ...

  10. js拖拽上传图片

    有时候,在开发中,需要遇到拖拽上传图片的需求,即从磁盘选中一张或多张图片,然后按着鼠标把图片拖动到页面上指定的区域,实现图片的上传. 1.后端上传图片的接口 我是之前用vue写一个简单的后台系统的时候 ...