springboot实战(八)之整合redis

news2024/12/23 17:31:39

目录

序言: 

环境:

依赖:

配置:

测试:

redis序列化配置:

连接池:


序言: 

Redis是我们Java开发中,使用频次非常高的一个nosql数据库,数据以key-value键值对的形式存储在内存中。它的使用场景多样可以做缓存,分布式锁,自增序列等,且数据类型丰富,支持5中数据类型的存储,分别是String、has、list、set、zset,还有单线程作业速度超快。

使用redis的方式也和我们使用关系型数据库的方式一样,首先我们要在自己的本机电脑或者服务器上安装一个redis的服务器,然后在我们的项目中通过java进行其客户端集成,最后通过java集成的客户端完成对redis的增删改查操作。

Redis的Java客户端类型常见的有jedis, redission,lettuce等,所以我们在集成的时候,可以选择直接集成这些原生客户端。但是在springBoot中更常见的方式是集成spring-data-redis,这是spring提供的一个专门用来操作redis的项目,封装了对redis的常用操作,里边主要封装了jedis和lettuce两个客户端,但是默认使用的是lettuce客户端。

环境:

版本:spring boot:2.7.15

jdk:1.8

redis:安装最新的redis服务端就OK了

依赖:

由于springboot项目已经集成了各种中间件的starter,所以这里我们直接引用redis的starter依赖就行了。

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

配置:

依赖添加完后,我们需要在yml文件中进行redis链接配置。

spring:
  redis:
    host: localhost
    #有密码就写,没有就注释掉
    #password:
    port: 6379
    database: 1

完整的配置信息:

server:
  port: 8081
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/test?characterEncoding=utf-8&autoReconnect=true&failOverReadOnly=false&useSSL=false&serverTimezone=Asia/Shanghai
    username: root
    password: root
  redis:
    host: localhost
    #有密码就写,没有就注释掉
    #password:
    port: 6379
    database: 1

#这里配置日志生效文件,用于多环境部署时切换(通常部署会有三个环境:线上、测试、开发)
logging:
  config: classpath:log4j2/log4j2-dev.yml

测试:

配置完以上信息后,我们可以创建一个测试类进行测试。

package com.iterge.iterge_pre.redis;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;

/**
 * @author liuph
 * @date 2023/9/26 14:36:45
 */
@SpringBootTest
public class RedisTest {
    @Autowired
    private RedisTemplate redisTemplate;

    @Test
    public void stringTest(){
        redisTemplate.opsForValue().set("name","hi redis!");
    }

    @Test
    public void getStringTest(){
        Object name = redisTemplate.opsForValue().get("name");
        System.out.println(name);
    }
}

 

图上我们可以看到获取的value的时候,返回值类型是object,控制台打印的时候信息也是正确的。

但是我们通过终端连接redis后进行信息查看,发现get name是没有数据的,是不是很奇怪,我们明明插入进去了并且在程序中查了出来怎么就没有呢?然后我们用keys *name*,命令模糊查找下我们的key,发现有个"\xac\xed\x00\x05t\x00\x04name",然后get "\xac\xed\x00\x05t\x00\x04name"发现,好像是我们我们设置的“hi redis”,图如下。但是为什么key和value都有个前缀?上述涉及到一切问题这就涉及到redis的序列化操作了,接着往下看序列化配置和描述。

命令:

#连接redis的客户端命令
redis-cli
#选择使用的数据库,因为我们用的是1,所以是select 1
select 1

redis序列化配置:

Redis的序列化是我们在使用RedisTemplate的过程中非常需要注意的事情。上面的案例中,其实我们并没有特殊设置redis的序列化方式,那么它其实使用的是默认的序列化方式。RedisTemplate这个类的泛型是<String,Object>,也就是为什么刚刚提到返回值类型是Object了,它写入的其实是个对象。

什么是redis的序列化呢?这个对象采取什么方式序列化存入内存中就是它的序列化方式。

就是我们把对象存入到redis中到底以什么方式存储的,可以是二进制数据,可以是xml也可以是json。比如说我们经常会将POJO对象存储到 Redis 中,一般情况下会使用 JSON 方式序列化成字符串,存储到 Redis 中 。

Redis本身提供了一下一种序列化的方式:

  • GenericToStringSerializer: 可以将任何对象泛化为字符串并序列化
  • JacksonJsonRedisSerializer: 序列化object对象为json字符串
  • Jackson2JsonRedisSerializer: 跟JacksonJsonRedisSerializer实际上是一样的
  • JdkSerializationRedisSerializer: 序列化java对象,默认序列化方式
  • StringRedisSerializer: 简单的字符串序列化

如果我们存储的是String类型,默认使用的是StringRedisSerializer 这种序列化方式。如果我们存储的是对象,默认使用的是 JdkSerializationRedisSerializer,也就是Jdk的序列化方式(通过ObjectOutputStream和ObjectInputStream实现,缺点是我们无法直观看到存储的对象内容)。

配置:

package com.iterge.iterge_pre.config;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

/**
 * @author liuph
 * @date 2023/9/26 15:47:09
 */
@Configuration
public class RedisConfig {
    @Bean(name = "redisTemplate")
    public RedisTemplate<String, Object> getRedisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(factory);

        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        // 方法过期,改为下面代码
        //objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance ,
                ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
        // key的序列化类型
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        // value的序列化类型
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }
}

 测试:

如下图所示可以看出是,redisTemplate中的key和value的序列化方式已经改为我们所设置的。

再通过终端查看设置结果,key:user设置成功,并且get user能正常获取到存储的value。

连接池:

在生产环境中我们往往需要配置redis连接池,目的是为了增加对于redis数据库连接的管理,提升访问的效率,也保证了对资源的合理利用。

由于我们使用的是默认的客户端lettuce,那么我们就用lettuce连接池,如果大家想使用jedis连接池,改成jedis连接池就OK,并且需要引入jedis核心jar包。

lettuce连接池配置信息如下:

首先需要添加一个连接池连接依赖,不加依赖配置不会生效,切记哦~

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
</dependency>
spring:
  redis:
    host: localhost
    #有密码就写,没有就注释掉
    #password:
    port: 6379
    database: 1
    lettuce:
      pool:
        #连接池同时能维持的最大连接数
        max-active: 16
        #最多维持多少个空闲连接
        max-idle: 16
        #最少维持多少个空闲连接
        min-idle: 4

配置好以上信息就OK,运行程序,查看连接池配置是否生效,如图,如果有以下信息说明配置已经生效,配置完成:

 注意如果不添加上面的链接池依赖,redisTemplate运行时是没有连接池信息的,如下图:


 创作不易,您的鼓励是我前进的动力,如果有用记得点点关注哈~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1043695.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux下使用yum安装的东西都去哪儿了?(新手友好)

常见的安装路径 使用yum安装的软件包通常都会遵循相似的目录结构 安装路径含义/etc配置文件/var/log日志文件/usr/sbin可执行文件(包括服务管理工具) 面对不同的软件如何看安装位置 上面给出的是一些软件包安装几乎必备的几个安装路径&#xff0c;具体用yum去安装不同的软件…

element-ui form表单,内嵌表单数据校验

在最近开发的功能的过程中,遇到一个很复杂的表单;外层一个大表单;里面有一项是动态添加的,而且内嵌一个表单。每一项还有校验规则;如下图 记录一下调试结果。 无论多少层form, 注意几个事项; form的model/ref; form_item的prop这个关系到,校验作用具体那个框框 数据…

【LeetCode热题100】--48.旋转图像

48.旋转图像 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在原地旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。 使用辅助数组 class Solution {public void rotate(int[][] matrix)…

2023-9-26 JZ 复杂链表的复制

题目链接&#xff1a;复杂链表的复制 import java.util.*; /* public class RandomListNode {int label;RandomListNode next null;RandomListNode random null;RandomListNode(int label) {this.label label;} } */ public class Solution {public RandomListNode Clone(Ra…

跨域问题的原理及解决方法

一.同源策略 如果没有进行特殊处理&#xff0c;我们在进行前后端联调的时候游览器会发生报错&#xff1a; 这是因为请求被同源策略被阻止&#xff0c;浏览器出于安全的考虑&#xff0c;使用XMLHttpRequest对象发起HTTP请求&#xff08;异步请求&#xff09;时必须遵守同源策略…

数据库基础知识以及MySQL简介

关于MySQL的读法 MySQL如何发音&#xff1f;在国内MySQL发音有很多种&#xff0c;Oracle官方文档说他们念作 My sequal[si:kwəl]。 数据库基本概念 数据 数据&#xff08;Data&#xff09;是指对客观事物进行描述并可以鉴别的符号&#xff0c;这些符号是可识别的、抽象的。它…

W5100S_EVB_PICO快速入门之MQTT篇(十二)

目录 1. 前言 2. MQTT介绍 2.1 什么是mqtt&#xff1f; 2.2 特点 2.3 应用场景 2.4 MQTT协议实现方式 3. 硬件及接线方式 3.1 硬件准备 3.2 硬件介绍 3.3 接线图 4. 测试 4.1 MQTT测试流程图 4.2 相关代码 4.3 测试现象 5. 相关链接&#xff1a; 1. 前言 随着物…

C++,名称空间、运算符重载、模板/泛型

目录 一、名称空间 二、重载运算符 三、模板/泛型 一、名称空间 C中名称空间可以区别同名C风格函数、同名C风格全局变量、同名类。名称空间还可以无限嵌套。 namespace ns1 { ..... namespace ns2 { ..... } } 同一个名称空间名字可以多处书写,比如&#xff0c;在demo1.h中…

腾讯云最新优惠活动有哪些?活动入口在哪里?

腾讯云作为国内知名的云计算服务提供商&#xff0c;为了吸引用户&#xff0c;经常推出各种优惠活动。以下是近期腾讯云的一些优惠活动及其入口&#xff1a; 一、腾讯云新用户优惠券【点此领取】 腾讯云新用户专属大礼包&#xff0c;无门槛领取总价值高达2860元代金券&#xff…

postmain 存储接口返回值

1、postmain 存储接口返回值 //把json字符串转化为对象 var dataJSON.parse(responseBody);//获取data对象的utoken值。 var tokendata.data;//设置成全局变量 pm.globals.set("webToken", token); 2、固定参数设置

RocketMQ —消息存储和清理机制

本文为您介绍 Apache RocketMQ 中消息的存储机制&#xff0c;包括消息的存储粒度、判断依据及后续处理策略等。 背景信息​ 参考 Apache RocketMQ 中队列的定义&#xff0c;消息按照达到服务器的先后顺序被存储到队列中&#xff0c;理论上每个队列都支持无限存储。 但是在实…

87、Redis 的 value 所支持的数据类型(String、List、Set、Zset、Hash)---->List相关命令

本次讲解要点&#xff1a; List相关命令&#xff1a;是指value中的数据类型 启动redis服务器&#xff1a; 打开小黑窗&#xff1a; C:\Users\JH>e: E:>cd E:\install\Redis6.0\Redis-x64-6.0.14\bin E:\install\Redis6.0\Redis-x64-6.0.14\bin>redis-server.exe redi…

电压信号拉线位移编码器有何突出的特点

电压信号拉线位移编码器有何突出的特点 电压信号拉线位移编码器原理简单&#xff0c;外观工艺做工精细&#xff0c;由铝合金精心打造、坚固耐磨&#xff1b;适合空间较小的环境安装。该产品重复精度达到0.01%&#xff1b;工作电压上可选择5V或5-24V供电&#xff0c;保护功能上具…

博客摘录「 MPLS/LDP原理介绍+报文分析+配置示例」2023年9月26日

//首先发送UDP Hello组播包进行发现&#xff1b;随后TCP三次握手开始建立Session&#xff0c;Active端和Passive端互相初始化和Keepalive保活确认&#xff1b;完成之后可开始进行标签交互。 //首先发送UDP Hello组播包进行发现&#xff1b;随后TCP三次握手开始建立Session&…

2023-9-26 JZ23 链表中环的入口结点

题目链接&#xff1a;链表中环的入口结点 import java.util.*; /*public class ListNode {int val;ListNode next null;ListNode(int val) {this.val val;} } */ public class Solution {public ListNode EntryNodeOfLoop(ListNode head) {if(head null || head.next null …

MTK6765/MT6765联发科4G安卓核心板安兔兔跑分

Mediatek Helio P35 MTK6765是智能手机的主流ARM SoC。它在两个集群中集成了8个ARM Cortex-A53内核(big.LITTLE)。四个性能内核的频率高达2.3 GHz。 集成显卡为PowerVR GE8320&#xff0c;频率高达680 MHz。 集成内存控制器支持1500 MHz或933 MHz LPDDR3的LPDDR4x。 MT6765处理…

澜渟:长期主义才能成就专研企业

企业的增长模式有三种&#xff1a;第一种是全局增长&#xff0c;即“水大鱼大”式的、更多依靠外界环境的增长&#xff1b;第二种是结构性增长&#xff0c;即找准赛道&#xff0c;随着产业、行业的增长而增长&#xff1b;第三种是内生性增长&#xff0c;即通过内部创新实现增长…

tp6 + swagger 配置文档接口

ThinkPHP 6.0 运行环境要求PHP7.2&#xff0c;兼容PHP8.1 安装 composer create-project topthink/think tp 6.0.*如果需要更新框架使用 composer update topthink/framework文档 完全开发手册 swagger 文档 注解文档 安装包 composer require zircote/swagger-php 引用…

迅为龙芯3A5000_7A2000运行国产Loongnix、银河麒麟、统信UOS以及实时系统翼辉SylixoS系统

iTOP-3A5000开发板采用全国产龙芯3A500处理器&#xff0c;基于龙芯自主指令系统 (LoongArch)的LA464微结构&#xff0c;并进一步提升频率&#xff0c;降低功耗&#xff0c;优化性能。在与龙芯3A4000处理器保持引脚兼容的基础上&#xff0c;频率提升至2.5GHZ&#xff0c;功耗降低…

Vue+Three.js实现三维管道可视化及流动模拟续集

继上一篇文章中实现了三维管道的可视化和流动模拟,经过反馈,对大家还是有一定帮助,因此就编写了一个续集,相当于增加了一些常见的通用共性功能,主要在前面的基础上增加了以下功能:1.新增直角拐弯的管道,工业中很多管道都是横平竖直的,相当于我们装修的水管或电线等,不…