关键词:
前言
上一篇博文,我们重点介绍了SpringBoot如何整合Mybatis,JPA等技术,访问我们的关系型数据库,这篇博文我们介绍SpringBoot如何整合Redis来访问非关系型数据库,带你深入了解Redis的自动原理,并结合具体案例进行实操,分享所有的源码。
为什么选择Spring Data Redis
Spring Data Redis是Spring Data家族中最重要的一分子,它提供了从Spring应用程序轻松配置并访问Redis的功能。它提供了用于与存储交互的低级和高级抽象,使用户摆脱了对基础设施的担忧。
Spring Framework 是领先的全栈 Java/JEE 应用程序框架。它通过使用依赖注入、AOP 和可移植服务抽象提供了一个轻量级容器和一个非侵入式编程模型。
Spring Data Redis (SDR) 框架通过 Spring 出色的基础架构支持消除了与存储交互所需的冗余任务和样板代码,从而可以轻松编写使用 Redis 键值存储的 Spring 应用程序。
Spring Boot整合Redis
导入依赖项
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
自动引入的依赖,如图所示:
自动配置原理
自动配置类RedisAutoConfiguration
- RedisProperties属性类,用于对Redis的基本属性配置
- LettuceConnectionConfiguration、JedisConnectionConfiguration,Redis的客户端类型,其中配置了连接工厂,连接池等,默认为Lettuce,底层引入了Lettuce客户端jar包
- 自动注入了RedisTemplate**<Object, **Object> : xxxTemplate;自动注入了StringRedisTemplate;k:v都是String
底层只要我们使用StringRedisTemplate、RedisTemplate就可以操作redis
默认整合Lettuce
添加配置
server:
port: 8083
spring:
application:
name: springboot-redis
redis:
# Redis服务器地址
host: localhost
# Redis服务器连接端口
port: 6379
# Redis服务器连接密码(默认为空)
password:
# Redis数据库索引(默认为0)
database: 0
# 连接超时时间(毫秒)
timeout : 300
client-type: lettuce #切换jedis客户端,改成jedis
lettuce: #切换jedis客户端,改成jedis
pool:
# 连接池最大连接数(使用负值表示没有限制)
max-active: 8
# 连接池最大阻塞等待时间(使用负值表示没有限制)
max-wait: -1
# 连接池中的最大空闲连接
max-idle: 8
# 连接池中的最小空闲连接
min-idle: 0
切换至Jedis
导入jar
<!--导入jedis-->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
注意:配置基本同上,只需要将lettuce换成jedis即可。
配置序列化方式
RedisTemplate默认的序列化方式为JdkSerializationRedisSerializer,会把对象序列化存储到Redis中(二进制形式),StringRedisTemplate的默认序列化方式为StringRedisSerializer。绝大多数情况下,不推荐使用 JdkSerializationRedisSerializer 进行序列化,主要是不方便人工排查数据。所以我们需要切换序列化方式。
Spring Data底层为我们实现了七种不同的序列化方式,大家可以根据需要进行选择,如下图所示:
我们以Jackson2JsonRedisSerializer为例,展示如何切换序列化方式。
@Configuration
public class RedisConfig
/**
* 默认是JDK的序列化策略,这里配置redisTemplate采用的是Jackson2JsonRedisSerializer的序列化策略
* @param redisConnectionFactory
* @return
*/
@Bean
public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory)
//使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式)
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
// 配置连接工厂
redisTemplate.setConnectionFactory(redisConnectionFactory);
//使用StringRedisSerializer来序列化和反序列化redis的key值
//redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setKeySerializer(jackson2JsonRedisSerializer);
// 值采用json序列化
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.setHashKeySerializer(jackson2JsonRedisSerializer);
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.afterPropertiesSet();
return redisTemplate;
/***
* stringRedisTemplate默认采用的是String的序列化策略
* @param redisConnectionFactory
* @return
*/
@Bean
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory)
StringRedisTemplate stringRedisTemplate = new StringRedisTemplate();
stringRedisTemplate.setConnectionFactory(redisConnectionFactory);
return stringRedisTemplate;
代码示例
我为广大粉丝朋友提供了详细使用案例,以便更好的学习Redis。只展示其中一部分的代码,更加详细的代码,大家可以通过源码地址来查看。
@SpringBootTest
public class RedisApplicationTests
@Autowired
private RedisTemplate redisTemplate;
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Test
void testRedis()
ValueOperations<String, String> operations = redisTemplate.opsForValue();
operations.set("hello","world");
String hello = operations.get("hello");
System.out.println(hello);
/**
* 操作字符串
*/
@Test
public void testString()
//设置值
stringRedisTemplate.opsForValue().set("String", "Mao");
//获取值
String string = stringRedisTemplate.opsForValue().get("String");
System.out.println(string);
//设置值且设置超时时间
stringRedisTemplate.opsForValue().set("Middle", "Yu", 3, TimeUnit.MINUTES);
String middle = stringRedisTemplate.opsForValue().get("Middle");
System.out.println(middle);
//删除数据
Boolean isDelete = stringRedisTemplate.delete("String");
Assert.isTrue(isDelete, "删除失败");
/**
* 操作列表
*/
@Test
public void testList()
ListOperations listOp = redisTemplate.opsForList();
//往 List 左侧插入一个元素
listOp.leftPush("nameList", "mike");
listOp.leftPush("nameList", "kim");
//往 List 右侧插入一个元素
listOp.rightPush("nameList", "jimmy");
listOp.rightPush("nameList", "chuck");
//List 大小
Long size = listOp.size("nameList");
//遍历整个List
List nameList1 = listOp.range("nameList", 0, size);
System.out.println(JSON.toJSONString(nameList1));
//遍历整个List,-1表示倒数第一个即最后一个
List nameList = listOp.range("nameList", 0, -1);
System.out.println(JSON.toJSONString(nameList));
//从 List 左侧取出第一个元素,并移除
Object name1 = listOp.leftPop("nameList", 200, TimeUnit.MILLISECONDS);
System.out.println("is kim:" + name1.equals("kim"));
//从 List 右侧取出第一个元素,并移除
Object name2 = listOp.rightPop("nameList");
System.out.println("is chuck:" + name2.equals("chuck"));
。。。。。。开源项目中还有内容哦。。。。。。
本文示例读者可以通过查看下面仓库中的项目,如下所示:
<module>springboot-redis</module>
- CodeChina: https://codechina.csdn.net/jiuqiyuliang/springboot-learning
如果您对这些感兴趣,欢迎star、follow、收藏、转发给予支持!
作者:程序猿小亮
博主写作不易,加个关注呗
求关注、求点赞,加个关注不迷路,感谢
点赞是对我最大的鼓励
↓↓↓↓↓↓
springboot整合redis,一篇解决缓存的所有问题(代码片段)
前言上一篇博文,我们重点介绍了SpringBoot如何整合Mybatis,JPA等技术,访问我们的关系型数据库,这篇博文我们介绍SpringBoot如何整合Redis来访问非关系型数据库,带你深入了解Redis的自动原理,并结合具体... 查看详情
springboot整合redis,一篇解决缓存的所有问题(代码片段)
前言上一篇博文,我们重点介绍了SpringBoot如何整合Mybatis,JPA等技术,访问我们的关系型数据库,这篇博文我们介绍SpringBoot如何整合Redis来访问非关系型数据库,带你深入了解Redis的自动原理,并结合具体... 查看详情
springboot整合redis,一篇解决缓存的所有问题(代码片段)
前言上一篇博文,我们重点介绍了SpringBoot如何整合Mybatis,JPA等技术,访问我们的关系型数据库,这篇博文我们介绍SpringBoot如何整合Redis来访问非关系型数据库,带你深入了解Redis的自动原理,并结合具体... 查看详情
微服务springboot整合redis实战开发解决高并发数据缓存
一、什么是缓存?缓存(Cache),就是数据交换的缓冲区,俗称的缓存就是缓冲区内的数据,一般从数据库中获取,存储于本地代码,例如:例1:StaticfinalConcurrentHashMap<K,V>map=newConcurrentHashMap<>();本地用于高并发例2:staticfinalCache<K,... 查看详情
springboot整合redis缓存
...非常流行的NoSQL数据库(Redis)来实现我们的缓存需求。SpringBoot整合Redis是非常方便快捷的,我用的是Mybatis,这里就不说Springboot整合Mybatis了网上有很多,同样非常简单。下面进入正题: 查看详情
springboot整合redis
背景----为什么要使用Redis?当我们目前的系统日益复杂,个别模块的热点数据人们频繁的查询,这个时间就会对对数据库造成很大的访问压力,甚至是瘫痪。那如何解决呢?我们通常的做法有两种:一种是数据缓存、一种是网页... 查看详情
springboot整合redis实现缓存
...纲一、缓存的应用场景二、更新缓存的策略三、运行 springboot-mybatis-redis 工程案例四、springboot-mybatis-redis 工程代码配置详解 运行环境:MacOS10.12.xJDK8+Redis3.2.8SpringBoot1.5.1.RELEASE 一、缓存的应用场景什么是缓存?... 查看详情
springboot整合springseesion实现redis缓存
参考技术A使用SpringBoot开发项目时我们经常需要存储Session,因为Session中会存一些用户信息或者登录信息。传统的web服务是将session存储在内存中的,一旦服务挂了,session也就消失了,这时候我们就需要将session存储起来,而Redis就... 查看详情
精通springboot--整合redis实现缓存
今天我们来讲讲怎么在springboot中整合redis实现对数据库查询结果的缓存。首先第一步要做的就是在pom.xml文件添加spring-boot-starter-data-redis。要整合缓存,必不可少的就是我们要继承一个父类CachingConfigurerSupport。我们先看看这个类... 查看详情
shiro整合springboot缓存之redis实现(代码片段)
Shiro整合Springboot缓存之Redis实现Redis下载安装引入redis依赖配置redis连接启动redis服务自定义redis缓存的实现自定义shiro缓存管理器自定义salt实现实现序列化接口自定义Realm改造开启redis缓存Redis下载安装Windows系统中Redis下载安装其它... 查看详情
springboot----数据层技术的选择+各种整合(缓存,消息队列)+定时任务+发邮件(代码片段)
...NoSQL解决方案Redis安装和启动服务和可能出现的一个小BUGspringboot整合redis切换springboot操作redis客户端的实现技术(jedis或lettuce)MongoDB安装和初始化安装mongodb的可视化工具Robo3T整合整合第三方技术缓存手动实现一个简单的缓存机制spri... 查看详情
springboot整合redis以及缓存穿透缓存雪崩缓存击穿的理解如何添加锁解决缓存击穿问题?分布式情况下如何添加分布式锁(代码片段)
文章目录1、步骤2、具体过程1、引入pom依赖2、修改配置文件3、单元测试4、测试结果3、redis运行情况4、项目中实际应用5、加锁解决缓存击穿问题代码一(存在问题)代码二(问题解决)6、新问题7、分布式锁1、... 查看详情
springboot(二十四)整合redis
...介绍了Redis的安装和Redis的常用操作。今天主要介绍介绍springboot整合Redis。v应用场景现 查看详情
springboot中使用redistemplate实现redis数据缓存
SpringBoot整合Redis数据库实现数据缓存的本质是整合Redis数据库,通过对需要“缓存”的数据存入Redis数据库中,下次使用时先从Redis中获取,Redis中没有再从数据库中获取,这样就实现了Redis做数据缓存。??按照惯例,下面一步一步... 查看详情
springboot整合redis初实践
Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。 有时,为了提升整个网站的性能,在开发时会将经常访问的数据进行缓存,这样在调用这个数据接口时,可以提高数据加载... 查看详情
springboot2.x(十四):整合redis,看这一篇就够了
Redis简介Redis是一个开源的使用ANSIC语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API的非关系型数据库(NoSQL)。Redis的特性Redis的所有操作都是原子性的,意思就是要么成... 查看详情
springboot整合redis缓存
使用springBoot添加redis缓存需要在POM文件里引入<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId></dependency><dependency 查看详情
springboot整合mybatis,redis,代码
redis注解开发过程中包含许多注解 [email protected]可以标记在方法上,也可以标记在类上。当标记在方法上时表示该方法是支持缓存的,当标记在类上时则表示该类所有的方法都是支持缓存的。应用到读取数据的方法上... 查看详情