SpringBoot集成Redis

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: RedisTemplate这是SpringBoot默认提供的Redis模板,在真实项目中肯定不会直接使用该模板,我们应该去自己定义该模板的一些属性。这篇文章主要总结SpringBoot与Redis的简单集成与可能碰到的问题。

前言

RedisTemplate这是SpringBoot默认提供的Redis模板,在真实项目中肯定不会直接使用该模板,我们应该去自己定义该模板的一些属性。这篇文章主要总结SpringBoot与Redis的简单集成与可能碰到的问题。


一.集成过程



下面就总结下这个过程,主要是引入依赖、修改配置文件、初次测试。


1.引入redis的依赖


这里引入的是SpringBoot提供的启动器

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>


2.修改application.properties配置文件


#redis相关配置
spring.redis.host=192.168.150.101
spring.redis.port=6379
spring.redis.database=0


3.测试redis的使用


这样我们就完成了一个简单的SpringBoot与Redis的整合,接下来就简单的测试下是否可以正常使用。创建测试接口,RedisTemplate是SpringBoot默认注入的对象。我们可以直接获取。

@Controller
public class TestRedisController {
    @Autowired
    RedisTemplate redisTemplate;
    @RequestMapping("/test")
    public void test(){
        //设置键的序列化策略
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        //设置值得序列化策略
        redisTemplate.setValueSerializer(new StringRedisSerializer());
        //获取值,这个过程自动反序列化
        redisTemplate.opsForValue().set("key","value");
        System.out.println(redisTemplate.opsForValue().get("key"));
    }
}


启动项目,执行以上代码,结果如下图:


20210331152913344.gif


请忽略以上的报错,报错是没有设置返回的原因。控制台中可以看到我们已经正常拿到了我们设置的key的值value。说明集成成功,且以上代码的写法是标准的(String,String)格式存储到redis时的标准写法。


二.可能出现的问题



上面是我们在控制器中使用的RedisTemplate模板,发现可以正常使用,不过有些场景注入RedisTemplate是注入不进去的,使用时会发现值是null。


1.获取不要RedisTemplate的场景


如下代码,我们写了个破产版的redis的工具类,使用@Bean的方式将工具类注入到Spring容器中。在这个类中我们再来获取下RedisTemplate的对象,这时候有时候会获取不到。

public class TestNull {
    @Autowired
    RedisTemplate redisTemplate;
    public void set(String key,String value){
        System.out.println("redisTemplate值:"+redisTemplate);
        redisTemplate.setValueSerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new StringRedisSerializer());
        redisTemplate.opsForValue().set(key,value);
    }
    public String get(String  key){
        redisTemplate.setValueSerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new StringRedisSerializer());
        return (String)redisTemplate.opsForValue().get(key);
    }
}


若是获取不到,改为如下实现即可正常使用:

public class TestNull {
    @Autowired
    RedisTemplate redisTemplate;
    public static RedisTemplate redisTemplateself;
    @PostConstruct
    public void getRedisTemplate(){
        redisTemplateself = this.redisTemplate;
    }
    public void set(String key,String value){
        System.out.println("redisTemplate值:"+redisTemplateself);
        redisTemplateself.setValueSerializer(new StringRedisSerializer());
        redisTemplateself.setValueSerializer(new StringRedisSerializer());
        redisTemplateself.opsForValue().set(key,value);
    }
    public String get(String  key){
        redisTemplateself.setValueSerializer(new StringRedisSerializer());
        redisTemplateself.setValueSerializer(new StringRedisSerializer());
        return (String)redisTemplateself.opsForValue().get(key);
    }
}


以上问题的解决方案主要是@PostConstruct注解,该注解可以保障在RedisTemplate使用之前将其对象注入进来。这样就可以解决注入为null的场景。


2.键值存入redis是乱码


如果我们使用第一个问题中展示的代码,去直接降值存入redis就会乱码,或者叫值存入的不是我们想要的值。比如我们这样使用:

@Controller
public class TestRedisController {
    @Autowired
    TestNull testNull;
    @RequestMapping("/test2")
    public void test(){
        testNull.set("testnull","testnull");
        System.out.println(testNull.get("testnull"));
    }
}


启动程序后访问接口,发现redis存入的是这样的键值:


image.png


显然这不是我们想要的值,我们想要的键值应该是一样的testnull,为什么呢?因为我们在使用时并没有设置键的序列化,虽然在破产版工具类中已经设置了键的序列化,但很显然并没有起作用,我们应该再次为键设置序列化,或者我们只在使用时再序列化在工具类不进行序列化也是可以的,将使用代码修改如下:


@Controller
public class TestRedisController {
    @Autowired
    TestNull testNull;
    @RequestMapping("/test2")
    public void test(){
        testNull.redisTemplateself.setKeySerializer(new StringRedisSerializer());
        testNull.redisTemplateself.setValueSerializer(new StringRedisSerializer());
        testNull.set("testnull","testnull");
        System.out.println(testNull.get("testnull"));
    }
}

这时我们再调用接口redis中的值就是正常的了,如下:

image.png


三.总结



这篇文章介绍了Springboot与Redis的基本整合,与简单使用。在真实的项目中这样是远远不够的,不过这里展示的两个问题确实是个典型,希望自己和路过的人可以引以为戒,防止再犯,下一篇将介绍下在笔者正在做的项目中是怎么应用RedisTemplate的。


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
1月前
|
存储 缓存 NoSQL
深入理解Django与Redis的集成实践
深入理解Django与Redis的集成实践
58 0
|
13天前
|
NoSQL Java API
springboot项目Redis统计在线用户
通过本文的介绍,您可以在Spring Boot项目中使用Redis实现在线用户统计。通过合理配置Redis和实现用户登录、注销及统计逻辑,您可以高效地管理在线用户。希望本文的详细解释和代码示例能帮助您在实际项目中成功应用这一技术。
24 3
|
15天前
|
消息中间件 NoSQL Java
Spring Boot整合Redis
通过Spring Boot整合Redis,可以显著提升应用的性能和响应速度。在本文中,我们详细介绍了如何配置和使用Redis,包括基本的CRUD操作和具有过期时间的值设置方法。希望本文能帮助你在实际项目中高效地整合和使用Redis。
35 1
|
1月前
|
NoSQL Java Redis
redis的基本命令,并用netty操作redis(不使用springboot或者spring框架)就单纯的用netty搞。
这篇文章介绍了Redis的基本命令,并展示了如何使用Netty框架直接与Redis服务器进行通信,包括设置Netty客户端、编写处理程序以及初始化Channel的完整示例代码。
48 1
redis的基本命令,并用netty操作redis(不使用springboot或者spring框架)就单纯的用netty搞。
|
1月前
|
缓存 NoSQL Java
springboot的缓存和redis缓存,入门级别教程
本文介绍了Spring Boot中的缓存机制,包括使用默认的JVM缓存和集成Redis缓存,以及如何配置和使用缓存来提高应用程序性能。
110 1
springboot的缓存和redis缓存,入门级别教程
|
1月前
|
缓存 NoSQL Java
Spring Boot与Redis:整合与实战
【10月更文挑战第15天】本文介绍了如何在Spring Boot项目中整合Redis,通过一个电商商品推荐系统的案例,详细展示了从添加依赖、配置连接信息到创建配置类的具体步骤。实战部分演示了如何利用Redis缓存提高系统响应速度,减少数据库访问压力,从而提升用户体验。
82 2
|
1月前
|
JSON NoSQL Java
springBoot:jwt&redis&文件操作&常见请求错误代码&参数注解 (九)
该文档涵盖JWT(JSON Web Token)的组成、依赖、工具类创建及拦截器配置,并介绍了Redis的依赖配置与文件操作相关功能,包括文件上传、下载、删除及批量删除的方法。同时,文档还列举了常见的HTTP请求错误代码及其含义,并详细解释了@RequestParam与@PathVariable等参数注解的区别与用法。
|
1月前
|
NoSQL Java Redis
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
这篇文章介绍了如何使用Spring Boot整合Apache Shiro框架进行后端开发,包括认证和授权流程,并使用Redis存储Token以及MD5加密用户密码。
31 0
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
|
21天前
|
JavaScript NoSQL Java
CC-ADMIN后台简介一个基于 Spring Boot 2.1.3 、SpringBootMybatis plus、JWT、Shiro、Redis、Vue quasar 的前后端分离的后台管理系统
CC-ADMIN后台简介一个基于 Spring Boot 2.1.3 、SpringBootMybatis plus、JWT、Shiro、Redis、Vue quasar 的前后端分离的后台管理系统
34 0
|
6月前
|
NoSQL Java Redis
SpringBoot集成Redis
SpringBoot集成Redis
496 0
下一篇
无影云桌面