SpringBoot2.X整合Redis
发布日期:2022-03-30 18:18:28 浏览次数:51 分类:博客文章

本文共 6022 字,大约阅读时间需要 20 分钟。

前言

Redis作为一个优秀的nosql数据库,能快速读取数据,非常值得我们去学习

SpringBoot也对Redis提供非常友好的整合,那么还等什么,撸起袖子就是干

下载Redis

Redis作为一款开源的软件,下载方式也极为简单,可以从Github下载window版本直接解压

传送门

传送门

SpringBoot整合Redis过程

工程结构

  1. 通过Maven引入工程依赖

你可以在构建工程的时候分别在NoSQL下勾选Spring Data Redis,Web下勾选SpringWeb,以及Developer Tools下勾选lombok,让IDEA自动为你导入响应的依赖

org.springframework.boot
spring-boot-starter-data-redis
org.springframework.boot
spring-boot-starter-web
org.apache.commons
commons-pool2
org.projectlombok
lombok
1.18.12

当然也可以直接从我这个贴出的依赖,直接拷贝进pom.xml下,需要特别注意的是commons-pool2这个依赖必须通过手动引入,IDEA创建工程时,是不会自动导入的

  1. 编写实体类

    @Data	//lombok的注解,自动生成setter和getterpublic class User {    /**     * 姓名     */    private String name;    /**     * 编号     */    private String id;    /**     * 年龄     */    private String age;}
  2. 编写Redis配置类

    @Configuration	// Springboot配置类的注解public class RedisConfiguration {    @Bean	// IOC自动转配Bean的注解    public RedisTemplate
    redisTemplate(RedisConnectionFactory redisConnectionFactory) { RedisTemplate
    redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(redisConnectionFactory); // 使用Jackson2JsonRedisSerialize 替换默认序列化 Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper objectMapper = new ObjectMapper(); objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); // enableDefaultTyping方法已过期,在比较老的博客中,踩了坑用activateDefaultTyping替代 // objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance , ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY); jackson2JsonRedisSerializer.setObjectMapper(objectMapper); // 设置value的序列化规则和 key的序列化规则 redisTemplate.setValueSerializer(jackson2JsonRedisSerializer); redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.afterPropertiesSet(); return redisTemplate; }}
  3. 编写RedisController类

    @RestControllerpublic class RedisController {    @Autowired    private StringRedisTemplate stringRedisTemplate;    @Autowired    private RedisTemplate redisTemplate;    @GetMapping("/get/{key}")    public String getRedis(@PathVariable(name="key") String key){        return stringRedisTemplate.opsForValue().get(key);    }    @PostMapping("/set/{key}/{value}")    public String getRedis(@PathVariable(name="key")String key, @PathVariable(name="value")String value){        stringRedisTemplate.opsForValue().set(key,value);        return "SUCCESS";    }    @PostMapping("/postUser")    public String postEntity(){        User user=new User();        user.setId("1");        user.setName("codeluojay");        user.setAge("25");        redisTemplate.opsForValue().set(user.getId(),user);        return "SUCCESS";    }    @GetMapping("/getUser/{key}")    public Object getEntity(@PathVariable(name="key")String key){        return redisTemplate.opsForValue().get(key);    }}
  4. 配置连接Redis的properties

    # Redis数据库索引(默认为0)spring.redis.database=0# Redis服务器地址spring.redis.host=localhost# Redis服务器连接端口spring.redis.port=6379# Redis服务器连接密码(如果不设置默认为空,那么下面这行代码就不要写上去,否则会报错)#spring.redis.password=root# 连接池最大连接数(使用负值表示没有限制)spring.redis.jedis.pool.max-active=8# 连接池最大阻塞等待时间(使用负值表示没有限制)spring.redis.jedis.pool.max-wait=-1# 连接池中的最大空闲连接spring.redis.jedis.pool.max-idle=8# 连接池中的最小空闲连接spring.redis.jedis.pool.min-idle=0# 连接超时时间(毫秒)spring.redis.timeout=10000

SpringBoot整合Redis案例效果

  1. 使用PostMan请求RedisController的PostUser方法,会把实体类存进Redis中

  2. 使用PostMan请求RedisController的getUser方法,会把实体类从Redis中取出并返回输出

  3. 使用PostMan请求RedisController的set方法,会把类路径的key和value值存进Redis中

  4. 使用PostMan请求RedisController的get方法,会把类路径的key作为key值去获取Redis中对应的value值并返回输出

SpringBoot整合Redis案例知识点

RedisTemplate

1.RedisTemplate 是spring-data-redis针对jedis客户端进行大量封装形成一个便于操作Redis的模板

对jedis客户端中大量api进行了归类封装,将同一类型操作封装为operation接口

方法 方法说明
ValueOperations 简单K-V操作
SetOperations set类型数据操作
ZSetOperations zset类型数据操作
HashOperations 针对map类型的数据操作
ListOperations 针对list类型的数据操作
  1. 针对Java和redis中的数据“序列化/反序列化”,提供了多种可选择策略(RedisSerializer)

JdkSerializationRedisSerializer:POJO对象的存取场景,使用JDK本身序列化机制,将pojo类通过ObjectInputStream/ObjectOutputStream进行序列化操作,最终redis-server中将存储字节序列。是目前最常用的序列化策略。

StringRedisSerializer:Key或者value为字符串的场景,根据指定的charset对数据的字节序列编码成string,是“new String(bytes, charset)”和“string.getBytes(charset)”的直接封装。是最轻量级和高效的策略。

JacksonJsonRedisSerializer:jackson-json工具提供了javabean与json之间的转换能力,可以将pojo实例序列化成json格式存储在redis中,也可以将json格式的数据转换成pojo实例。因为jackson工具在序列化和反序列化时,需要明确指定Class类型,因此此策略封装起来稍微复杂。【需要jackson-mapper-asl工具支持】

OxmSerializer:提供了将javabean与xml之间的转换能力,目前可用的三方支持包括jaxb,apache-xmlbeans;redis存储的数据将是xml工具。不过使用此策略,编程将会有些难度,而且效率最低;不建议使用。【需要spring-oxm模块的支持】

本文的案例使用到的知识点:

1.使用ValueOperations来进行简单的K-V操作(主要是对String字符串类型的数据进行操作)

2.使用JacksonJsonRedisSerializer对User的JavaBean序列化为json格式存储在redis中和Redis中json格式数据直接取出并相应输出

踩坑记录

  1. redis客户端设置密码和不设密码踩坑

    如果你的redis中默认不设置密码,那么在properties中下面的话就不用写上去或者用#注释掉

    # Redis服务器连接密码(如果不设置默认为空,那么下面这行代码就不要写上去,否则会报错)# spring.redis.password=root

    否则就会报ERR Client sent AUTH, but no password is set 的错误,因为你没设置密码,又要求SpringBoot用密码连接自然会出错

    当然不改配置文件spring.redis.password=root

    还可以通过redis的客户端的命令设置密码防止出现这个错误

    # 解决:命令行进入你解压Redis的文件夹找到redis-cli.exe启动这个客户端F:\Redis-x64-3.2.100# 查看是否设置了密码:127.0.0.1:6379> auth root(error) ERR Client sent AUTH, but no password is set# 说明没有设置密码,执行设置密码命令:config set requirepass后面的root就是本次设置的密码127.0.0.1:6379> config set requirepass rootOK  # 出现OK说明设置成功
  2. JSON序列化enableDefaultTyping方法过期,过期的方法虽然能用,但作者已经在源码中指明替代的方法

    一些写的比较早的博客都是用这个方法,我在代码中注释掉这个方法并用上替代的方法方便后面的学习的人

  3. Unrecognized token 'CodeLuoJay': was expecting (JSON String, Number, Array,)

    这是一个Json序列化出错的问题,我遇到的情况是自己萌蠢用了RedisController的set方法把字符串存进redis,结果我用getUser方法取出就报这个错误,因为字符串形式存进去,而要求输出是POJO的实体类对象类型不一致,就会报这个错误

文章配套Github源码:

文章对你有帮助,别忘了start一下给给星星支持一下

转载地址:https://www.cnblogs.com/codeluojay/p/13264350.html 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:SpringBoot实现Vue-Admin-Template跨域访问资源
下一篇:SpringBoot快速入门Yaml配置文件(五)

发表评论

最新留言

感谢大佬
[***.8.128.20]2024年03月13日 15时34分25秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

编程之类的文案_如何锻炼写文案的能力? 2021-06-24
vscode 不能使用中文输入法_vscode中vim插件设置 2021-06-24
当集合a为空集时a的取值范围_1.1.2 集合间的基本关系 2021-06-24
vue 可合并表格组件_Vue实战046:详解Mixins混入使用和注意事项 2021-06-24
python包怎么做双重差分did分析_多变量相关性分析(一个因变量与多个自变量) 2021-06-24
fi sap 凭证冲销 稅_SAP中的成本要素 2021-06-24
mysql幻读是什么意思_MySQL中的幻读,你真的理解吗? 2021-06-24
mysql执行计划中性能最差的是_MySQL性能优化(七):MySQL执行计划,真的很重要,来一起学习吧... 2021-06-24
易语言执行mysql命令_易语言通过“打开”命令操作数据库 2021-06-24
mysql slave 1062_mysql主从同步slave错误1062 2021-06-24
mysql构造器_MySQL行构造器表达式优化(Row Constructor Expression) 2021-06-24
2008日志清理 server sql_SQL Server 2008 清除日志 2021-06-24
mac mysql root 权限_Mac平台重新设置MySQL的root密码 2021-06-24
mysql新增一列_MySQL-ProxySQL中间件 2021-06-24
mysql 30入门_30分钟带你快速入门MySQL教程 2021-06-24
kangle主机怎么配置MySQL_kangle web服务+easypanel主机控制面板快速搭建网站和数据库以及管理空间详细教程... 2021-06-24
mysql 翻页 存储过程_MySQl通用翻页(存储过程) 2021-06-24
2020word替换所有文本_Excel字符函数(5):REPLACE、SUBSTITUTE查找替换函数之区别... 2021-06-24
win10安装ipython_win10环境 ipython app.py 8080 这里为什么是ipython 这步无法启动 2021-06-24
假定在MYSQL_假定在名称为教学库的数据库中包含有学生、课程和选课三个表,它们的定义如下 - 问答库... 2021-06-24