springboot2.x +redis使用和源码分析一(springboot自动装配源码分析)

springboot2.0.X使用spring security oauth2 最近收到一个任务使用spring security做一个oauth2的授权服务器和资源服务器,授权方式为Client_Credentials写一个demo,官方文档对这方面的描述比较少,官方项目中只有一个demo,是个spring项目,所有东西都存在了内存中,虽然他提供了Enable注解,因为我们要求的是client-id,client-secret等存入数据库把token存入redis,当然他官... 阅读详情

序言:

个人感觉springboot的源码是web应用开源框架中写的最好的,观看它的源码可以学习它的编码风格,代码设计思想,如何做到给予使用者最好的使用体验,隐藏连接各应用组件的实现细节,极大降低类开发者实力的要求。查看springboot对各组件的自动装配实现,可以很详细的了解到spring对于组件核心类的初始化过程,以及核心类的作用以及之间的依赖关系。

springboot提供的所有的自动装配类都在spring-boot-autoconfigure(直接查看源码)

 也可以通过官网来进行查看(选取要看的版本):

https://docs.spring.io/spring-boot/docs/2.2.3.BUILD-SNAPSHOT/reference/html/appendix-auto-configuration-classes.html#auto-configuration-classes-from-autoconfigure-module


如图所示是spring-boot-autoconfigure下对于redis提供类:

1:源码分析

1.1:RedisProperties

@ConfigurationProperties(prefix = "spring.redis")
public class RedisProperties {
    //使用redis database数 默认为0
    private int database = 0;
    //连接url 可包含用户和密码 例如 redis://user:password@example.com:6379
    private String url;
    //redis 端口号
    private String host = "localhost";
    //密码
    private String password;
    //端口号
    private int port = 6379;
    //是否开启SSL
    private boolean ssl;
    //超时时间
    private Duration timeout;
    //设置客户端名
    private String clientName;
    //支持哨兵机制
    private Sentinel sentinel;
    //支持集群配置
    private Cluster cluster;
    //Jedis客户端
    private final Jedis jedis = new Jedis();
    //Lettuce客户端
    private final Lettuce lettuce = new Lettuce();
    /**
     * 连接池一些属性
     */
    public static class Pool {
        //池中维护的最大空闲数 为负值代表
        private int maxIdle = 8;
        //池中要维护的最小空闲连接数 此值必须为正值
        private int minIdle = 0;
        //最大连接数 -数代表无限制
        private int maxActive = 8;
        //最大等待时间
        private Duration maxWait = Duration.ofMillis(-1);
        //
        private Duration timeBetweenEvictionRuns;

    }
    /**
     * 集群配置
     */
    public static class Cluster {
        //集群各节点地址host:port 多个以,隔开隔开
        private List<String> nodes;
        //集群中执行命令时重定向node的最大数量
        private Integer maxRedirects;
    }
    /**
     *Redis 哨兵参数属性
     */
    public static class Sentinel {
        //集群中master名
        private String master;
        //集群各节点地址host:port 多个以,隔开隔开
        private List<String> nodes;
    }
    /**
     * jedis客户端属性
     */
    public static class Jedis {
        //连接池一些配置
        private Pool pool;
    }
    /**
     *Lettuce客户端属性
     */
    public static class Lettuce {
        //停止超时时间
        private Duration shutdownTimeout = Duration.ofMillis(100);
       //连接池一些配置
        private Pool pool;
    }

}

1.2 RedisAutoConfiguration

RedisAutoConfiguration是springboot结合Redis配置核心类。

//禁止其它配置类使用该配置类的@Bean方法
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(RedisOperations.class)
@EnableConfigurationProperties(RedisProperties.class)
//初始化Redis连接工厂类 Import执行的初始化类是顺序执行,这里面会存在一个使用问题须谨慎(后续描述)
@Import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class })
public class RedisAutoConfiguration {

      //若系统中不存在默认的redisTemplateBean 进行初始化 依赖Redis连接工厂类
	@Bean
	@ConditionalOnMissingBean(name = "redisTemplate")
	public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory)
			throws UnknownHostException {
		RedisTemplate<Object, Object> template = new RedisTemplate<>();
		template.setConnectionFactory(redisConnectionFactory);
		return template;
	}

      //若系统中不存在StringRedisTemplate类的任何Bean 进行初始化 依赖Redis连接工厂类
      //StringRedisTemplate实际是RedisTemplate<String,String>子类用于简化操作数据为字符串类型(毕竟转换为json类型的string可以处理大部分的需求)
	@Bean
	@ConditionalOnMissingBean
	public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory)
			throws UnknownHostException {
		StringRedisTemplate template = new StringRedisTemplate();
		template.setConnectionFactory(redisConnectionFactory);
		return template;
	}

}

1.3:RedisConnectionConfiguration

此类是下述LettuceConnectionConfiguration与JedisConnectionConfiguration的父类,提供对一些基础类的管理。例如RedisProperties,RedisSentinelConfiguration,RedisClusterConfiguration类

1.4:LettuceConnectionConfiguration与JedisConnectionConfiguration

这里我将这两个类放在一块来解释,因为两者的功能都是一致为了创建初始化Redis连接工厂类

LettuceConnectionConfiguration:

//禁止其它配置类使用该配置类的@Bean方法
@Configuration(proxyBeanMethods = false)
//应用包含RedisClient 此类在io.lettuce.core包中
@ConditionalOnClass(RedisClient.class)
class LettuceConnectionConfiguration extends RedisConnectionConfiguration {

	LettuceConnectionConfiguration(RedisProperties properties,
			ObjectProvider<RedisSentinelConfiguration> sentinelConfigurationProvider,
			ObjectProvider<RedisClusterConfiguration> clusterConfigurationProvider) {
		super(properties, sentinelConfigurationProvider, clusterConfigurationProvider);
	}

	@Bean(destroyMethod = "shutdown")
	@ConditionalOnMissingBean(ClientResources.class)
	DefaultClientResources lettuceClientResources() {
		return DefaultClientResources.create();
	}

	@Bean
        //如果上下文不包含RedisConnectionFactory的bean初始化
	@ConditionalOnMissingBean(RedisConnectionFactory.class)
	LettuceConnectionFactory redisConnectionFactory(
                         //ObjectProvider 作用和@Autowired作用一致和Autowired不同在于对于实例对象为null的处理ObjectProvider只有当实例对象的确存在时才检索bean,而Autowired会报错 ObjectProvider可以支持多实例
			ObjectProvider<LettuceClientConfigurationBuilderCustomizer> builderCustomizers,
			ClientResources clientResources) throws UnknownHostException {
		LettuceClientConfiguration clientConfig = getLettuceClientConfiguration(builderCustomizers, clientResources,
				getProperties().getLettuce().getPool());
                //调用Lettuce API创建LettuceConnectionFactory 有兴趣可以自己看下
		return createLettuceConnectionFactory(clientConfig);
	}

	。。。。。

}

JedisConnectionConfiguration:

//禁止其它配置类使用该配置类的@Bean方法
@Configuration(proxyBeanMethods = false)
//上下文引入Jedis包
@ConditionalOnClass({ GenericObjectPool.class, JedisConnection.class, Jedis.class })
class JedisConnectionConfiguration extends RedisConnectionConfiguration {

	JedisConnectionConfiguration(RedisProperties properties,
			ObjectProvider<RedisSentinelConfiguration> sentinelConfiguration,
			ObjectProvider<RedisClusterConfiguration> clusterConfiguration) {
		super(properties, sentinelConfiguration, clusterConfiguration);
	}

	@Bean
        //如果上下文不包含RedisConnectionFactory的bean初始化
	@ConditionalOnMissingBean(RedisConnectionFactory.class)
	JedisConnectionFactory redisConnectionFactory(
                         //ObjectProvider 作用和@Autowired作用一致和Autowired不同在于对于实例对象为null的处理ObjectProvider只有当实例对象的确存在时才检索bean,而Autowired会报错 ObjectProvider可以支持多实例
			ObjectProvider<JedisClientConfigurationBuilderCustomizer> builderCusto    mizers) throws UnknownHostException {
                //调用Jedis API创建JedisConnectionFactory 有兴趣可以自己看下
		return createJedisConnectionFactory(builderCustomizers);
	}
    。。。。。

}

从上述代码可以看出在整个应用上下文只会存在一个RedisConnectionFactory的实例,如果LettuceConnectionConfiguration和JedisConnectionConfiguration都满足要求都会执行,那么springboot会按照Import中顺序执行初始化,也就是第一优先执行LettuceConnectionConfiguration来创建RedisConnectionFactory实例。例如如果我们使用spring-boot-starter-parent来作为应用的父工程,又想使用Jedis客户端,那么就会出现上述的问题,原因在于spring-boot-starter-data-redis(默认推荐的是基于Lettcue)中会存在Lettuce包的依赖,如果我们不注意这块就会出现不管怎么设置jedis pool的属性发现都毫无作用,因为创建的是LettuceConnectionFactory实例对象。

解决方案:

  1. 在应用中自己初始化RedisConnectionFactory
  2. 在pom引用中去除lettuce包会存在Lettuce包的依赖 如下所示:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
    <exclusions>
        <exclusion>
            <groupId>io.lettuce</groupId>
            <artifactId>lettuce-core</artifactId>
        </exclusion>
    </exclusions>
</dependency>

1.5:LettuceClientConfigurationBuilderCustomizer和JedisClientConfigurationBuilderCustomizer

两者的功能作用一致,所以将两者放到一起描述 ,这里以JedisClientConfigurationBuilderCustomizer做为Demo来描述。

我们可以使用JedisClientConfigurationBuilderCustomizer来做一些定制化参数配置,也可以在多Redis下使不同客户端使用不同的定制化配置(后续会详细介绍)。

springboot执行定制操作代码:

class JedisConnectionConfiguration extends RedisConnectionConfiguration {

	
	private JedisClientConfiguration getJedisClientConfiguration(
			ObjectProvider<JedisClientConfigurationBuilderCustomizer> builderCustomizers) {
		。。。。。
           //执行应用中被注入到spring类JedisClientConfigurationBuilderCustomizer的Bean
		builderCustomizers.orderedStream().forEach((customizer) -> customizer.customize(builder));
		return builder.build();
	}

}

测试Demo:

@Configuration
class RedisCustomizerConfiguration {

    @Bean
    public MyJedisClientConfigurationBuilderCustomizer builderCustomizers(){

        return new MyJedisClientConfigurationBuilderCustomizer();
    }

    @Bean
    public MyJedisClientConfigurationBuilderCustomizerTwo builderCustomizersTow(){

        return new MyJedisClientConfigurationBuilderCustomizerTwo();
    }


    public class MyJedisClientConfigurationBuilderCustomizer implements JedisClientConfigurationBuilderCustomizer {

        @Override
        public void customize(JedisClientConfiguration.JedisClientConfigurationBuilder clientConfigurationBuilder) {


            JedisClientConfiguration jedisClientConfiguration =  clientConfigurationBuilder.build();

            //获取连接池信息 并做定制化设置
            GenericObjectPoolConfig genericObjectPoolConfig =  jedisClientConfiguration.getPoolConfig().get();

            if("test".equals(jedisClientConfiguration.getClientName().get())){

                //此两个参数在RedisProperties中统一为timeout 所以默认connectTimeout与readTimeout相同
                //可以通过JedisClientConfigurationBuilderCustomizer进行细致化配置
                clientConfigurationBuilder.connectTimeout(Duration.ofSeconds(10));
                clientConfigurationBuilder.readTimeout(Duration.ofSeconds(10));
                clientConfigurationBuilder.usePooling();
            }

        }
    }

    public class MyJedisClientConfigurationBuilderCustomizerTwo implements JedisClientConfigurationBuilderCustomizer {

        @Override
        public void customize(JedisClientConfiguration.JedisClientConfigurationBuilder clientConfigurationBuilder) {

            JedisClientConfiguration jedisClientConfiguration =  clientConfigurationBuilder.build();

            //获取连接池信息 并做定制化设置
            GenericObjectPoolConfig genericObjectPoolConfig =  jedisClientConfiguration.getPoolConfig().get();

            if("test1".equals(jedisClientConfiguration.getClientName().get())) {

                //此两个参数在RedisProperties中统一为timeout 所以默认connectTimeout与readTimeout相同
                //可以通过JedisClientConfigurationBuilderCustomizer进行细致化配置
                clientConfigurationBuilder.connectTimeout(Duration.ofSeconds(6));

                clientConfigurationBuilder.readTimeout(Duration.ofSeconds(6));

                clientConfigurationBuilder.usePooling();
            }
        }
    }
}

LettuceClientConfigurationBuilderCustomizer的使用方式和JedisClientConfigurationBuilderCustomizer是一致

1.6:RedisRepositoriesAutoConfiguration和RedisRepositoriesRegistrar

两类是为了简化spring Data中Repository对于redis的支持的一些列初始化的操作

//禁止其它配置类使用该配置类的@Bean方法
@Configuration(proxyBeanMethods = false)
//应用上下文必须包含 @EnableRedisRepositories注解类 EnableRedisRepositories中会Import RedisRepositoriesRegistrar类,会根据注解中的各参数进行各种初始化
@ConditionalOnClass(EnableRedisRepositories.class)
@ConditionalOnBean(RedisConnectionFactory.class)
//通过配置文件中spring.data.redis.repositories属性来配置是否执行RedisRepositoriesAutoConfiguration
@ConditionalOnProperty(prefix = "spring.data.redis.repositories", name = "enabled", havingValue = "true",
		matchIfMissing = true)
//必须包含RedisRepositoryFactoryBean类实例对象
@ConditionalOnMissingBean(RedisRepositoryFactoryBean.class)
//执行仓库注册类
@Import(RedisRepositoriesRegistrar.class)
//在RedisAutoConfiguration之后执行
@AutoConfigureAfter(RedisAutoConfiguration.class)
public class RedisRepositoriesAutoConfiguration {

}

//整体使用了模版方法设计模式(可以了解下24种设计模式)
//提供有关于Redis对于Repository模块基础参数
class RedisRepositoriesRegistrar extends AbstractRepositoryConfigurationSourceSupport {

	@Override
	protected Class<? extends Annotation> getAnnotation() {
		return EnableRedisRepositories.class;
	}

	@Override
	protected Class<?> getConfiguration() {
		return EnableRedisRepositoriesConfiguration.class;
	}

	@Override
	protected RepositoryConfigurationExtension getRepositoryConfigurationExtension() {
            //初始化Redis Repository配置扩展类 用于初始化注册一些基础Bean
		return new RedisRepositoryConfigurationExtension();
	}

        //启用spring Data中Repository 对Redis的支持
	@EnableRedisRepositories
	private static class EnableRedisRepositoriesConfiguration {

	}

}

//
public abstract class AbstractRepositoryConfigurationSourceSupport
        //实现该接口可以做到动态注册Bean 详细可以了解下ImportBeanDefinitionRegistrar接口的作用
		implements ImportBeanDefinitionRegistrar
        //初始化时可以BeanFactory写入类属性中
        ,BeanFactoryAware
        //初始化时可以ResourceLoader写入类属性中
        , ResourceLoaderAware
        //初始化时可以Environment写入类属性中
        , EnvironmentAware {

	private ResourceLoader resourceLoader;

	private BeanFactory beanFactory;

	private Environment environment;

        //结合注入类(RedisRepositoriesAutoConfiguration)的Metadata信息将需要初始化的Bean注入
	@Override
	public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry,
			BeanNameGenerator importBeanNameGenerator) {
        //RepositoryConfigurationDelegate Repository仓库代理类是spring-data对于Repository模块核心类,用于代理执行注册执行Bean
        //有兴趣可以查看下spring-data Repository源码 这里不详细介绍
		RepositoryConfigurationDelegate delegate = new RepositoryConfigurationDelegate(
				getConfigurationSource(registry, importBeanNameGenerator), this.resourceLoader, this.environment);
        //注册和Repository有关bean
		delegate.registerRepositoriesIn(registry, getRepositoryConfigurationExtension());
	}

    。。。。。

}

Spring Data中Repository对于Redis的支持可以查看此篇博客
 

1.7:RedisReactiveAutoConfiguration 

此类是redis对于响应式编程的支

@Configuration(proxyBeanMethods = false)
//Flux类 所属reactor包中 需要在maven依赖中添加
@ConditionalOnClass({ ReactiveRedisConnectionFactory.class, ReactiveRedisTemplate.class, Flux.class })
//在RedisAutoConfiguration启动之后执行
@AutoConfigureAfter(RedisAutoConfiguration.class)
public class RedisReactiveAutoConfiguration {

        //创建响应式编码类
	@Bean
	@ConditionalOnMissingBean(name = "reactiveRedisTemplate")
        //必须要求自定义创建ReactiveRedisConnectionFactory实例bean
	@ConditionalOnBean(ReactiveRedisConnectionFactory.class)
	public ReactiveRedisTemplate<Object, Object> reactiveRedisTemplate(
			ReactiveRedisConnectionFactory reactiveRedisConnectionFactory, ResourceLoader resourceLoader) {
		JdkSerializationRedisSerializer jdkSerializer = new JdkSerializationRedisSerializer(
				resourceLoader.getClassLoader());
		RedisSerializationContext<Object, Object> serializationContext = RedisSerializationContext
				.newSerializationContext().key(jdkSerializer).value(jdkSerializer).hashKey(jdkSerializer)
				.hashValue(jdkSerializer).build();
		return new ReactiveRedisTemplate<>(reactiveRedisConnectionFactory, serializationContext);
	}

	@Bean
	@ConditionalOnMissingBean(name = "reactiveStringRedisTemplate")
        //必须要求自定义创建ReactiveRedisConnectionFactory实例bean
	@ConditionalOnBean(ReactiveRedisConnectionFactory.class)
	public ReactiveStringRedisTemplate reactiveStringRedisTemplate(
			ReactiveRedisConnectionFactory reactiveRedisConnectionFactory) {
		return new ReactiveStringRedisTemplate(reactiveRedisConnectionFactory);
	}

}

Demo所在Git地址:https://github.com/fangyuan94/redisDemo

 

 

Redis教程四(Springboot集成Redis) Springboot操作数据:spring-data jpa jdbc mongodb redis Springdata也是和springboot齐名的项目 说明:在springboot2.X之后,原来使用的jedis被替换为lettuce Jedis:采用的直连,多个线程操作的话,是不安全的,如果响应避免不安全的,使用jedis pool连接池,更像BIO模式 Lettuce:采用netty,实例可以再多个线程中进行共享,不存在线程不安全的情况,可以减少线程数据,更像是NIO模式 1. 源码分析 阅读详情

相关推荐

spring boot 2.1学习笔记【九】SpringBoot 2 集成redis

springboot2.X 集成redis非常简单,只需要引入依赖包,配置数据源连接池,就可以直接使用redisTemplate了。 注意:springboot 2.X 版本使用lettuce连接池来替换jedis。Lettuce和Jedis都是连接Redis Server的客户端程序,Jedis在实现上是直连redis server,多线...

刘本龙的专栏 5354

day10 分布式缓存

Redis 如何判断某个 key 应该在哪个实例?将 16384 个插槽分配到不同的实例根据 key 的有效部分计算哈希值,然后对 16384 取余余数作为插槽,寻找插槽所在实例即可如何将同一类数据固定的保存在同一个 Redis 实例?将这一类数据使用相同的有效部分,例如 key 都以{typeId}为前缀。

JavaAlenboy 786

Android应用隐私合规自动化检测:Frida与Camille实战指南

在移动应用安全与隐私合规领域,动态代码插桩技术已成为核心检测手段。其原理是通过运行时注入,实时监控和修改应用行为,从而绕过传统静态分析的局限。这项技术的核心价值在于能够精准捕获应用在运行时的敏感数据调用与网络传输行为,为隐私合规审计、安全测试提供直接证据。在实际应用场景中,它尤其适用于自动化检测违规收集个人信息、追踪数据流向等任务。本文聚焦于利用Frida这一动态插桩框架,结合Camille隐私合规检测工具集,构建自动化监控环境。通过注入JavaScript代码,实现对Android敏感API(如获取设备标

weixin_34254464的博客 388

Redis进阶 - Redis哨兵

原文首更地址,阅读效果更佳!Redis进阶 - Redis哨兵 | CoderMast编程桅杆思考slave 节点宕机恢复以后可以找 master 节点同步数据,那么 master 节点宕机怎么办?

一个编程爱好者的博客 2965

开放自己本机的mysql允许别人连接

需要在左下角搜索记事本应用,右键以管理员身份运行,之后按照上述地址找到my.ini文件,ctrl+F搜索到[mysqld],修改或添加 bind-address 设置,将其更改为 0.0.0.0 或你的计算机的 IP 地址。打开 MySQL 的配置文件 my.ini。username和密码是第3步创建能从远程地址访问的用户和密码,ip地址是ipconfig查看的地址(前提是能ping通,才能连接该地址对应的数据库)。使用 MySQL 命令行连接到自己的数据库,并创建一个能够从远程地址访问的用户。

m0_74824687的博客 1168

DoubletFinder实战:如何优化参数提升scRNA-seq双细胞识别准确率?

本文深入探讨了如何通过优化DoubletFinder参数提升scRNA-seq双细胞识别准确率。详细解析了pK和nExp参数的影响机制,提供了系统化的参数优化流程和多样本整合策略,并结合真实数据集演示了验证方法与高级应用场景,帮助研究人员获得更可靠的分析结果。

weixin_28523493的博客 339

Springboot 中 Redis 自动配置源码分析

Springboot 中 Redis 自动配置源码分析

donkeyboy001的博客 2286

SAP 配额修改 + 修改记录写入实现

采购配额修改并写入修改记录 cdhdr 和 cdpos

GAVIN 1099

Spring Boot整合Redis缓存(Lettuce)

* springBoot集成redis*

志豪的博客 1914

强化学习:Distributed PPO (DPPO) 学习笔记

DPPO = Distributed + Proximal Policy Optimization Distributed:多个智能体并行训练 Proximal:限制策略更新幅度,确保稳定性 Policy Optimization:基于策略梯度的优化方法 核心思想:多个智能体并行探索环境,共享经验,通过裁剪策略更新确保训练稳定

只是个人学习笔记 1331

【0000】PostgreSQL V17.4 内核源码剖析专栏(2017 ~ 2025.11.28 更新)

本专栏将会持续更新,直到将PostgreSQL V13.2源码涉及的所有原理、技术剖析完成为止。每一篇文章都是经过多次的源码阅读 + 调试,得以验证之后才梳理成文章形式。最终该专栏的文章数量应该在一万篇或以下,这也是文章序号从【0000】开始的缘故。通过本专栏的学习,能够让你掌握PostgreSQL数据库中的每个技术背后,底层的实现原理。

Postgres 数据库内核开发工程师 1万+

springboot整合redis集群

一、建立redis主从集群 启动多个redis,其他从属redis通过slaveof IP号 端口号绑定主redis,只有主redis可以写数据,其他从redis只能读取数据,同时自动会进行数据同步 二、搭建哨兵集群 1.复制多份redis,每一个redis新建一个sentinel.conf文件,并写入下面的代码 2.启动命令,这里使用的window搭建的 三、springboot整合redis哨兵集群 1.yml 这里的nodes是哨兵集群的IP地址 2.配置LettuceClientConfigurat

weixin_45390688的博客 8651

手把手教你学Simulink--基于新能源与储能系统的场景实例:压缩空气储能(CAES)系统热力学建模

本文介绍了使用Simulink进行压缩空气储能(CAES)系统热力学建模的详细步骤。系统模型包含压缩机、储气装置、膨胀机、热交换器和控制器等核心模块,通过MATLAB函数计算各部件参数,并设置仿真条件。文章详细说明了从模型创建到性能评估的完整流程,包括压缩/膨胀过程的能量转换、温度压力变化等关键指标分析。该建模方法可验证设计方案的有效性,并为系统优化提供参考,适用于新能源与储能领域的研究与应用。

MHD0815的博客 9180

springboot集成redis实现原理分析

我们知道,在 springboot 1.5.x版本的默认的Redis客户端是 Jedis实现的,需要导入jedis依赖,springboot 2.x版本中默认客户端是用 lettuce实现的,需要导入spring-boot-starter-data-redis依赖。这两种方式使用的都是 TCP协议.Jedis使用直连方式连接Redis Server,在多线程环境下存在线程安全问题, 因此需要增加连接池来解决线程安全的问题,

blueheartstone的博客 3130

【AI大模型应用开发】教你用AI轻松将你的知识库变为知识图谱(附完整代码,直接运行)

本文我们来介绍如何使用AI,将自己的知识库自动转换为知识图谱,并进行可视化展示。

同学小张的博客 3927

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

2018最新SpringBoot2.X 系列讲解

本人闲暇中录制了一套SpringBoot2.X最新的。 有兴趣的可以去百度云下载观看,一共也就三四个小时吧,上手很容易 链接:https://pan.baidu.com/s/1mFSxtwkVRpKPlnta6jZxFw 密码:mv6k 如果大家有兴趣也可以进我的群:590583588,一起聊聊技术。 01、SpringBoot简介 02、HelloWorld 03、详细介绍HelloW...

2012年开始工作,全栈开发老兵,目前已是一个老师,分享这么多年的心得体会 4288

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【Redis】SpringBoot整合Redis源码分析

一.Jedis被替换了 在SpringBoot2.x之后,原来使用的jedis被替换为了lettuce,从spring-boot-starter-data-redis-2.2.5.RELEASE.pom中可以看出来,为啥被替换了查阅资料是说 jedis:采用的直连,多个线程操作的话,是不安全的,如果想要避免不安全使用jedis pool连接池!更像BIO模式 lettuce:采用netty,实例可以再多个线程中进行共享,不存在线程不安全的情况,可以减少线程的数据,更像NIO模式。 二..

wistchen 1130

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Jedis使用和SpringBoot与Redis整合

Jedis 我们要使用java 来操作redis 什么是Jedis: Jedis是Redis官方推荐的java连接开发工具,使用java操作Redis中间件。 1、导入jar包 <!--导入jedis的jar包--> <dependencies> <!-- https://mvnrepository.com/artifact/redis.clients/jedis --> <dependency>

qq_43430343的博客 627

SpringBoot整合Redis

springboot整合redis

奔走的王木木Sir的博客 2150

springboot2.x +redis使用和源码分析二(RedisTemplate)

目录 序言:本文讲述RedisTemplate对象如何构建以及该对象对于redis提供的功能的支持 1:定义RedisTemplate 2:基本使用Ddemo 3:RedisTemplate对Pipelined支持 4:RedisTemplate对事务支持 5:RedisTemplate对Lua语言支持 5.1:使用内置字符串形式 5.2:以文件的形式 5.3:使用Lua的一些应...

F_Hello_World的博客 1239

SpringBoot集成Redis

SpringBoot集成Redis 文章目录SpringBoot集成Redis1、概述2、测试Redis3、自定义redisTemplate 1、概述 Redis是什么? Redis(Remote Dictionary Server ),即远程字典服务。 是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。 与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操

... 1310

Springboot整合redis与缓存

文章目录Springboot整合源码分析整合测试自定义序列化Redis.conf讲解单位包含网络配置通用GENERAL快照SECURITY安全限制CLIENTSAPPEND ONLY 模式Redis持久化RDB触发机制如何恢复rdb文件优点:缺点:AOF(Append Only File)重写规则aof优点和缺点优点:缺点Redis发布订阅测试原理微信:使用场景:Redis主从复制**概念**环境配置复制原理链路模式哨兵模式(自动选举老大)概述:这里哨兵只有两个作用测试哨兵模式优缺点哨兵模式全部配置Redi

qq_52329552的博客 2961

SpringBoot(十九)集成Redis

如果有收获!!! 希望老铁们来个三连,点赞、收藏、转发。 创作不易,别忘点个赞,可以让更多的人看到这篇文章,顺便鼓励我写出更好的博客

星海IT学习之路 1435

Redis学习--SpringBoot整合Redis

SpringBoot整合Redis1. 导入依赖2. 配置application.propertie3. RedisAutoConfiguration 源码分析4. 自定义RedisConfig5. 简单测试一下6. 使用StringRedisTemplate7. 使用RedisTemplate8. 使用boundXXXOps()9. 封装Redis工具类 1. 导入依赖 SpringBoot2.x之后,原来使用的jedis被替换为了 lettuce <!--操作Redis-->

463

SpringBoot学习小结之Redis

Redis是一个持久化在磁盘上的内存数据库,支持多种数据类型Redis和Mencashed对比总而言之,Redis提供了非常丰富的功能,而且性能基本上与Memcached相差无几,这也是它最近这几年占领内存数据库鳌头的原因。在技术选型方面,如果你的业务需要各种数据结构给予支撑,同时要求数据的高可用保障,那么选择Redis是比较合适的,但是如果你的业务非常简单,只是简单的set/get,并且对于内存使用并不高,那么使用Memcached足够了。...

十十办文武的博客 1576

Springboot Redis客户端配置及初始化过程源码解读

spring boot集成redis,配置比较简单,网上存在不同的配置。为什么有不同的配置文件? spring boot是如何加载redis的呢? 为了搞清楚背后的机制,阅读源码一探究竟。 1: spring boot 集成redis 为什么存在不同的配置文件 在spring boot 1.x.x集成redis时,默认jedis作为连接客户端。由于jedis是直连模式,在...

wiseyl的专栏 4954
上一篇: 自定义Dockerfile安装Redis单点
下一篇: springboot2.x +redis使用和源码分析二(RedisTemplate)
F_Hello_World
博客等级 码龄11年 38粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值