除了关系型数据库之外,现在还有一种 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. [leetcode] 17. Letter Combinations of a Phone Number (medium)

    递归DFS class Solution { Map<Character, String> mapping = new HashMap<>(); public List< ...

  2. MetInfo5.3管理员密码重置漏洞

    点击忘记密码 下一步 输入已知用户名或者邮箱点击下一步用Burp拦截 右键发送到Repeater 在第一行php后面拼接?met_host虚拟机kali的ip地址:端口号拼接完成后 用虚拟机监听拼接的 ...

  3. 关于Spring的JDBC连接mysql(与传统jdbc比较)

    Spring的jdbc与Hibernate,Mybatis相比较,功能不是特别强大,但是在小型项目中,也到还是比较灵活简单. 首先可以看看一下传统的jdbc是如何操作的呢 传统JDBC 首先呢先要创建 ...

  4. Keil uVision4 ——如何新建一个项目

    一.打开Keil4软件,点击Project,再点击New μVision Projrct. 二.新建一个文件夹,并在里面输入这个项目的名字. 三.点击Intel,根据实际情况选择,这里选择的是80/8 ...

  5. 初次见面C#排坑记录

    排一次开发C#遇到的坑,同时说一下自己对C#中文件夹构建方式的体会. 一个开发Java的人留下了痛苦的泪水,变量命名规则不一样,连括号打的都不一样,

  6. 泥瓦匠 5 年 Java 的成长感悟(下)

    继续<泥瓦匠 5 年 Java 的成长感悟(上)>,大致包括下面几点: 学技术的心态 学技术的学法 工作的心态 工作的硬技能 工作的软实力 听点雷子的民谣,我就安静地感概感概.上次说写的, ...

  7. gitee+hexo搭建个人博客

    通过gitee和hexo搭建个人博客 首先准备软件: git (提供命令git) git官网 notepad++(方便编辑)notepad++官网 nodejs(hexo依赖)nodejs官网 7z( ...

  8. 洛谷P2630 题解

    我先讲一下我的思路 将A,B,C,D四种操作用函数储存起来: 枚举所有可能出现的情况:A,B,C,D,AA,AB,AC,AD,BB,BC,BD,CC,CD,DD,ABC,ABD,ACD,BCD,ABC ...

  9. Extjs4 combobox hiddenName 后台取不到值

    当我们用 下拉框传值时,有一个问题,就是他有两个值,一个是用来显示的,一个是我们实际往后台需要传递的值,即 name 与 value 所以 combobox 才有了 hiddenName 这个属性,他 ...

  10. 【Java例题】1.2计算n的m次方

    package study; import java.util.*; import java.math.*; public class study { public static void main( ...