Spring学习之旅(十三)--使用NoSQL数据库
除了关系型数据库之外,现在还有一种 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,Sentinel 和 RedisCluster 三种模式的环境配置类和一个统一的 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 的时候, key 和 value 都会使用 Redis 的序列器(serializer) 进行序列化。Spring Data Redis 提供了多个序列化器:
- GenericToStringSerializer:使用 Spring 转换服务进行序列化
- JacksonJsonRedisSerializer:使用 Jackson1 将对象序列化为 JSON
- Jackson2JsonRedisSerializer:使用 Jackson2 将对象序列化为 JSON
- JdkSerializationRedisSerializer:使用 Java 序列化
- OxmSerializer:使用 **Spring O/X ** 映射的编排器和解排器实现序列化,用于 XML 序列化
- StringRedisSerializer:序列化 String 类型的 key 和 value
这些序列化器都实现了 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数据库的更多相关文章
- Spring学习之旅(八)Spring 基于AspectJ注解配置的AOP编程工作原理初探
由小编的上篇博文可以一窥基于AspectJ注解配置的AOP编程实现. 本文一下未贴出的相关代码示例请关注小编的上篇博文<Spring学习之旅(七)基于XML配置与基于AspectJ注解配置的AO ...
- Spring学习之旅(十)--MockMvc
在之前的 Spring学习之旅(八)--SpringMVC请求参数 我们是通过在控制台输出来验证参数是否正确,但是这样做实在是太耗时间了,我们今天来学习下 MockMvc,它可以让我们不需要启动项目就 ...
- 大数据学习资料之SQL与NOSQL数据库
这几年的大数据热潮带动了一激活了一大批hadoop学习爱好者.有自学hadoop的,有报名培训班学习的.所有接触过hadoop的人都知道,单独搭建hadoop里每个组建都需要运行环境.修改配置文件测试 ...
- Spring学习之旅(一)--初始Spring
之前从博客.视频断断续续的学到了 Spring 的相关知识,但是都是一个个碎片化的知识.刚好最近在读 <Sprign实战(第四版)>,所以借此机会重新整理下Spring 系列的内容. Sp ...
- Dubbo学习系列之十三(Mycat数据库代理)
软件界有只猫,不用我说,各位看官肯定知道是哪只,那就是大名鼎鼎的Tomcat,现在又来了一只猫,据说是位东方萌妹子,暂且认作Tom猫的表妹,本来叫OpencloudDB,后又改名为Mycat,或许Ca ...
- Spring学习之旅(十五)--SpringBoot
在使用 Spring 的过程中,有时候会出现一些 ClassNotFoundException 异常,这是因为 JAR 依赖之间的版本不匹配所导致的.而 Spring Boot 就能避免绝大多数依赖版 ...
- Spring学习之旅(十四)--缓存
数据库的读写并发一直都是应用性能的瓶颈所在之一,针对改动频率很小的数据我们应该将他存放到缓存中,减少与数据库的交互. 启用对缓存的支持 Spring 对缓存的支持有两种方式: 注解驱动的缓存 XML ...
- Spring学习之旅(十二)--持久化框架
对于本职工作来说 JDBC 就可以很好的完成,但是当我们对持久化的需求变得更复杂时,如: 延迟加载 预先抓取 级联 JDBC 就不能满足了,我们需要使用 ORM框架 来实现这些需求. Spring 对 ...
- Spring学习之旅(十一)--JDBC
JDBC 是数据持久化的一种比较常见的方案,Spring 也对它进行了支持. 在开始 JDBC 的使用之前,我们要先做下一些准备工作. 配置数据源 在 Spring 上下文中可以数据源 Bean 有如 ...
随机推荐
- 关于tomcat-startup.bat启动失败或者一闪而过问题解决记录
一.前言 Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选.对于一个初学者来说 ...
- 推荐:经典SQL语句大全
一.基础 .说明:备份sql server--- 创建 备份数据的 device USE master EXEC sp_addumpdevice 'disk', 'testBack', 'c:/mss ...
- 【原创】这一次,Chrome表现和IE11一样令人失望,围观群众有:Edge,Firefox
前言 俗话说,常在河边走哪能不湿鞋,天天和浏览器打交道,发现浏览器竟然也隐藏BUG也不是新鲜事了.可以看下我之前的文章: [原创]分享IE7一个神奇的BUG(不是封闭标签的问题,的确是IE7的BUG) ...
- JAVA-1.连接数据库
import java.sql.*; import com.mysql.jdbc.Driver; /* * <JDBC基础篇> * 连接数据库一般来说分为6个步骤: *1-加载驱动 *2- ...
- jQuery中事件与动画
jQuery中的事件与动画 一. jQuery中的事件 jQuery事件是对javaScript事件的封装. 1.基础事件 在javaScript中,常用的基础事件有鼠标事件.键盘事件.windo ...
- Java多线程笔记总结
1.线程的三种创建方式 对比三种方式: 通过继承Thread类实现 通过实现Runnable接口 实现Callable接口 第1种方式无法继承其他类,第2,3种可以继承其他类: 第2,3种方式多线程可 ...
- Skier 游戏
# Listing_10-1.py # Copyright Warren Sande, 2009 # Released under MIT license http://www.opensource. ...
- ubuntu清理系统垃圾与备份
虽然linux下不会有windows下的那么多垃圾和磁盘碎片!但还是会留下一些用不着的临时文件或是多次升级后的N个旧的内核! 1,非常有用的清理命令: sudo apt-get autoclean s ...
- 释放你的硬盘空间!——Windows 磁盘清理技巧
引言 用了Windows系统的各位都知道,作为系统盘的C盘的空间总是一天比一天少.就拿本人的例子来说,自从安装了Win10,就发现,C盘从一开始的10几G占用,到现在慢慢变成了20G.30G….占用只 ...
- Linux 常用命令及详解
1. type :查询命令 是否属于shell解释器2. help : 帮助命令3. man : 为所有用户提供在线帮助4. ls : 列表显示目录内的文件及目录-l 以长格式显 ...