redis实战spring-boot-starter-data-redis

news2025/1/12 5:56:06

SpringBoot集成Redis环境搭建及配置详解_springboot redis 配置-CSDN博客

如何使用Spring Boot框架整合Redis:超详细案例教程_spring-boot-starter-data-redis-CSDN博客

https://blog.csdn.net/weixin_44411039/article/details/133578724

连接池选择及Jedis连接池参数配置建议_分布式缓存服务 DCS

官网 Drivers :: Spring Data Redis

1 总结

1:默认整合了两种连接池,lettuce 和 jedis ,默认使用 lettuce连接池(因为支持的功能多)

2:如果配置了自定义的RedisConnectionFactory ,Spring Boot就不会自动配置 RedisConnectionFactory

2:不配置序列化器,我们是无法看懂的

2 pom

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        <!--    <version>2.5.1</version>-->
        </dependency>
         <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
          <!--  <version>2.9.0</version>-->
        </dependency>

 配置jedis连接池时用

      <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
        </dependency>

3 简单使用(单机版)

配置文件

spring:
  application:
    name: redis
  redis:
    port: 6379
    database: 0
    # host: 192.168.135.10
    host: 127.0.0.1
    jedis:
      pool:
        max-active: 300
        max-idle: 300
        min-idle: 100
        max-wait: 5s
    lettuce:
      pool:
        max-active: 300
        max-idle: 300
        min-idle: 100
        max-wait: 5s
      shutdown-timeout: 100ms

 直接使用,设置值

    @Autowired
    RedisTemplate redisTemplate;
    @Test
    void contextLoads1() {
        //設置字符串 新值
        redisTemplate.opsForValue().set("ok","测试ok1");
        String ok = (String)redisTemplate.opsForValue().get("ok");
        System.out.println(ok);
    }

 因为未配置序列化器

默认加载哪个连接池

结论:不自定义连接池情况下,默认只会加载lettuce连接池

1:当我们配置文件配置了lettuce时,会加在配置单连接池中。

配置文件不会因为你配置 jedis 默认使用jedis连接池。

序列化器


import com.alibaba.fastjson.parser.ParserConfig;
import org.springframework.beans.factory.annotation.Autowired;
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.HashOperations;
import org.springframework.data.redis.core.ListOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.data.redis.serializer.StringRedisSerializer;


@Configuration
public class RedisTemplateConfig {
    /**
     * 可以注入方式设置连接
     */
/*    @Autowired
    private RedisConnectionFactory factory;*/

    /**
     * RedisTemplate配置 改成json序列化模式用keys方法可取到值 否则取不到
     *
     */
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(factory);
        FastJsonRedisSerializer<Object> fastJsonRedisSerializer = new FastJsonRedisSerializer<>(Object.class);
        // 全局开启AutoType,不建议使用
        // ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
        // 建议使用这种方式,小范围指定白名单
        ParserConfig.getGlobalInstance().addAccept("com.demo.");
        // 设置值(value)的序列化采用FastJsonRedisSerializer。
        template.setValueSerializer(fastJsonRedisSerializer);
        template.setHashValueSerializer(fastJsonRedisSerializer);
        template.setDefaultSerializer(fastJsonRedisSerializer);
        // 设置键(key)的序列化采用StringRedisSerializer。
        template.setKeySerializer(new StringRedisSerializer());
        template.setHashKeySerializer(new StringRedisSerializer());
        template.afterPropertiesSet();
        return template;
    }
    /**
     * 可以删除
     */
    @Bean
    public ValueOperations valueOperations(RedisTemplate redisTemplate){
        return redisTemplate.opsForValue();
    }
    /**
     * 可以删除
     */
    @Bean
    public ListOperations listOperations(RedisTemplate redisTemplate){
        return redisTemplate.opsForList();
    }
    /**
     * 可以删除
     */
    @Bean
    public HashOperations hashOperations(RedisTemplate redisTemplate){
        return redisTemplate.opsForHash();
    }
}

 方式二

测试成功

4 自定义LettuceConnectionFactory

1:场景:配置文件中用户,密码是加密的,需要解密后 设置到连接池中。

2: 可以发现自定义配置参数会 覆盖配置文件的配置参数

import com.alibaba.fastjson.parser.ParserConfig;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettucePoolingClientConfiguration;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;



@Configuration  // 配置类
public class RedisConfig  {

    /**
     *  配置 Redis 连接工厂
     *  意义: LettuceConnectionFactory 是连接 Redis 服务器的入口,它使用了 Lettuce 客户端,并且配置了连接池来提高性能和资源管理
     * @return
     */
    @Bean
    public LettuceConnectionFactory redisConnectionFactory() {
        // 配置 Redis 服务器的连接信息 可以读取配置文件获取
        RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
        redisStandaloneConfiguration.setHostName("localhost");
        redisStandaloneConfiguration.setPort(6379);
        // redisStandaloneConfiguration.setPassword("password"); // 取消注释以设置密码
        // 配置连接池
        GenericObjectPoolConfig<Object> poolConfig = new GenericObjectPoolConfig<>();
        poolConfig.setMaxTotal(10);       // 连接池中的最大连接数
        poolConfig.setMaxIdle(5);         // 连接池中的最大空闲连接数
        poolConfig.setMinIdle(1);         // 连接池中的最小空闲连接数
        poolConfig.setMaxWaitMillis(2000); // 连接池获取连接的最大等待时间
        // 创建一个带有连接池配置的 Lettuce 客户端配置
        LettucePoolingClientConfiguration lettucePoolingClientConfiguration =
            LettucePoolingClientConfiguration.builder()
                .poolConfig(poolConfig)
                .build();
        // 返回带有连接池配置的 Redis 连接工厂
        return new LettuceConnectionFactory(redisStandaloneConfiguration, lettucePoolingClientConfiguration);
    }



    @Bean
    public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory factory) {
        /*    2.设置连接工厂: 使用前面定义的 LettuceConnectionFactory。
            3.设置序列化器: 设置键和值的序列化器,这里使用 StringRedisSerializer 来将键和值序列化为字符串。
         */
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(factory);
        FastJsonRedisSerializer<Object> fastJsonRedisSerializer = new FastJsonRedisSerializer<>(Object.class);
        // 全局开启AutoType,不建议使用
        // ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
        // 建议使用这种方式,小范围指定白名单
        ParserConfig.getGlobalInstance().addAccept("com.demo.");
        // 设置值(value)的序列化采用FastJsonRedisSerializer。
        template.setValueSerializer(fastJsonRedisSerializer);
        template.setHashValueSerializer(fastJsonRedisSerializer);
        template.setDefaultSerializer(fastJsonRedisSerializer);
        // 设置键(key)的序列化采用StringRedisSerializer。
        template.setKeySerializer(new StringRedisSerializer());
        template.setHashKeySerializer(new StringRedisSerializer());
        template.afterPropertiesSet();
        return template;
    }


}

 最终加载的是代码中自定义配置的连接池参数,而不是配置文件中配置。

5 自定义JedisConnectionFactory

1:配置了Jedis连接池后,用的就是Jedis了。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import redis.clients.jedis.JedisPoolConfig;

@Configuration
public class JedisConnectionConfig {
    @Autowired
   private Environment env;
    @Bean
    public JedisConnectionFactory redisConnectionFactory() {
        Integer port = Integer.valueOf(env.getProperty("spring.redis.port"));
        String host = env.getProperty("spring.redis.host");
        String password = env.getProperty("spring.redis.password");
        Integer database = Integer.valueOf(env.getProperty("spring.redis.database"));
        Integer maxActive = Integer.valueOf(env.getProperty("spring.redis.jedis.pool.max-active"));
        Integer maxIdle = Integer.valueOf(env.getProperty("spring.redis.jedis.pool.max-idle"));
        Integer minIdle = Integer.valueOf(env.getProperty("spring.redis.jedis.pool.min-idle"));
        JedisPoolConfig poolConfig = new JedisPoolConfig();
        //最大空闲数
        poolConfig.setMaxIdle(maxIdle);
        //最大连接数
        poolConfig.setMaxTotal(maxActive);
        //最大等待毫秒数
        poolConfig.setMaxWaitMillis(20000);
        poolConfig.setMinIdle(minIdle);
        poolConfig.setTestOnBorrow(true);
        RedisStandaloneConfiguration config = new RedisStandaloneConfiguration("server", 6379);
        config.setPort(port);
        config.setDatabase(database);
        config.setHostName(host);
        if (null != password) {
            config.setPassword(password);
        }
        JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(config);
        jedisConnectionFactory.setPoolConfig(poolConfig);
        return jedisConnectionFactory;
    }
}

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

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

相关文章

全球化2.0战略 | ZStack Cloud 支持9种语言

云轴科技ZStack近日宣布&#xff0c;其最新版本的ZStack Cloud已正式发布&#xff0c;可支持9种语言功能&#xff0c;包括中文&#xff08;简体/繁体&#xff09;、英文、俄语、法语、德语、日语、韩语、印尼语和泰语。这一重大更新是ZStack全球化战略2.0的重要一步&#xff0c…

SDK 和 API

什么是 SDK&#xff1f; 软件开发工具包&#xff08;SDK&#xff09;是一组适合于开发人员的平台特定构建工具集。您需要调试器、编译器和库等组件来创建在特定平台、操作系统或编程语言上运行的代码。SDK 将开发和运行软件所需的一切都集中在一处。此外&#xff0c;它们还包含…

c++题目_斐波那契数列

题目描述 大家都知道&#xff0c;斐波那契数列是满足如下性质的一个数列&#xff1a; F11,F21,FnFn−1Fn−2(n∈N∗)F​1​​1,F​2​​1,F​n​​F​n−1​​F​n−2​​(n∈N​∗​​) 请你求出 Fn%(1097)F​n​​%(10​9​​7) 的值。 输入 一行一个正整数 nn &#xff08…

《黑神话:悟空》全网互动量超1.8亿,百万天命人重走西游

四年磨一剑&#xff0c;一剑破长空。 8月20日10点&#xff0c;《黑神话&#xff1a;悟空》正式开服&#xff0c;同时轰动了国内外游戏圈子&#xff0c;冲顶国内各大社媒平台&#xff0c;一天包揽120个热搜。上线之后&#xff0c;《黑神话&#xff1a;悟空》火速登顶Steam热销游…

基于vue框架的保定市清苑区妇幼保健院收费管理系统6vqb8(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;医生,药品信息,销售信息,销售退货,供应商,药品采购,过期退货 开题报告内容 基于Vue框架的保定市清苑区妇幼保健院收费管理系统开题报告 一、引言 随着医疗改革的深入和信息技术的飞速发展&#xff0c;医疗机构的运营效率与服务质量成…

探索鸿蒙开发:自主学习或需专业培训?

在数字化时代背景下&#xff0c;鸿蒙开发作为一种新兴技术&#xff0c;受到了广泛关注。对于初学者来说&#xff0c;他们可能会疑惑是否需要参加培训才能掌握鸿蒙开发。本文将探讨这一问题&#xff0c;并提出一些建议。 首先&#xff0c;了解鸿蒙开发的基本概念和特点是非常重要…

leetcode242. 有效的字母异位词,哈希表

leetcode242. 有效的字母异位词 给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。 注意&#xff1a;若 s 和 t 中每个字符出现的次数都相同&#xff0c;则称 s 和 t 互为字母异位词。 示例 1: 输入: s “anagram”, t “nagaram” 输出: t…

InternLM2.5-20B-Chat 正式上线 SiliconCloud 平台

经推理加速的 InternLM2.5-20B-Chat 已正式上线 SiliconCloud 平台。开发者们无需自行开发和部署&#xff0c;直接通过平台就可以轻松调用 API 服务实际应用。 API 调用代码&#xff1a; from openai import OpenAIclient OpenAI(api_key"YOUR_API_KEY", base_url&…

OV-DINO开放词检测环境安装与推理

引子 开放词检测&#xff0c;之前分享过一篇YOLO-World的文章&#xff0c;感兴趣同学请移步&#xff08;YOLO-World环境搭建&推理测试_yoloworld 检测-CSDN博客&#xff09;&#xff0c;最近&#xff0c;由中山大学和美团联合提出新的开放域检测方法OV-DINO&#xff1a;基…

Java小问答--线程池相关的一些问题

1.为什么需要线程池呢&#xff0c;它有哪些好处&#xff1f; 答&#xff1a;线程在创建并执行时会从用户态进入到内核态&#xff0c;这个过程会非常影响效率&#xff0c;有时这个过程可能甚至比执行线程内的代码还要费时费力&#xff0c;所以&#xff0c;为了解决这种问题&am…

上传文件到github仓库

REF: https://blog.csdn.net/litianxiang_kaola/article/details/74075151 已有repository&#xff0c;往仓库里更新内容 点击gitlab里的clone 在git bash中使用git clone&#xff0c;这个时候会将网上的仓库下载到本地&#xff0c;你可以把想要更新的内容直接拖到仓库里 …

Apache CloudStack Official Document 翻译节选(八)

关于 Apache CloudStack 的 最佳实践 &#xff08;二&#xff09; 防火墙的设定 Hardware Firewall 部署Apache CloudStack时&#xff0c;建议部署一套防火墙系统已保护Apache CloudStack的云管理服务。在防火墙的选用方面&#xff0c;既可以使用通用防火墙、也可以使用诸如Ju…

【算法】二叉树(满二叉树和完全二叉树)、堆(堆的向下调整)、堆排序、堆的内置模块heapq

1 二叉树 1.1 满二叉树和完全二叉树 1.2 堆的向下调整 2 堆排序 3 堆的内置模块 1 二叉树 二叉树是一种树形数据结构&#xff0c;其中每个节点最多有两个子节点&#xff0c;分别称为左子节点和右子节点。二叉树的常见类型包括&#xff1a; 1. **普通二叉树**&#xff1a;任意一…

在 uboot 中实现 UDP 协议

一、明确背景 uboot中有许多通信协议&#xff0c;像TFTP、NFS等&#xff0c;这些协议底层都是基于UDP协议来实现的&#xff0c;由于有一个板子在 uboot 段进行固件下载更新的需求&#xff0c;本来想基于TCP协议来实现自定义通信协议&#xff08;TCP有自带的拥塞控制和重传机制&…

Microsoft Visual C++ Redistributable的作用主要体现以及可以删除吗?

这些是Microsoft Visual C的不同版本的Redistributable&#xff08;可再发行组件包&#xff09;安装包&#xff0c;用于在用户的计算机上安装或更新必要的运行时库&#xff0c;以便运行使用这些版本的Visual C开发的应用程序。具体来说&#xff1a; Microsoft Visual C 2012 R…

编译linux内核时,让版本号不跟着git变化

文章目录 编译linux内核时&#xff0c;让版本号不跟着git变化现象方法一方法二 编译linux内核时&#xff0c;让版本号不跟着git变化 现象 内核每次重新编译时&#xff0c;uname -r都会跟着变。 4.1.15-00005-g482731e4-dirty 导致报错&#xff0c;modprobe: can’t change …

《深入理解Java虚拟机(第2版)》- 第1章 - 学习笔记

1.1 概述 Java不止是一门编程语言&#xff0c;它是一些列计算机软件和规范所形成的技术体系。 1.2 技术体系 Sun官方定义Java技术体系由5各部分组成&#xff0c;如下&#xff1a; Java编程语言JVMClass文件格式Java API 类库第三方Java类库&#xff08;商业或开源&#xff…

养猫家庭必备好物——宠物空气净化器,让浮毛无处可逃

前不久&#xff0c;我爸妈担心我独自一个人来到一个陌生的城市打拼&#xff0c;身边没人陪我会孤单&#xff0c;但其实我一点儿都不孤单。虽然我家里没有人陪我聊天说话一起做饭&#xff0c;但是有猫陪我。 之前来到这座城市的第二年就养了猫&#xff0c;心情确实好很多&#…

【数据分享】《中国奶业年鉴》2002-2020(缺2014)

而今天要限时免费分享的数据就是2002-2020年间出版的《中国奶业年鉴》并以多格式提供免费下载。&#xff08;无需分享朋友圈即可获取&#xff09; 数据介绍 《中国奶业年鉴》是反映我国奶业发展情况的综合性年刊&#xff0c;也是农业农村部&#xff08;原农业部&#xff0…

13、java 数组常见算法(经典案例)、Arrays类的使用(操作数组工具类)、数组常见异常(角标越界或空指针)

java 数组 Ⅰ、数组常见算法&#xff1a;1、二维数组的案例1&#xff1a;求和其一、代码为&#xff1a;其二、截图为&#xff1a; 2、二维数组的案例2&#xff1a;杨辉三角其一、描述&#xff1a;其二、代码为&#xff1a;其三、截图为&#xff1a; 3、二维数组的案例3&#xf…