Redis Java 开发简单示例

文章目录

    • 一、概述
    • 二、Jedis 开发示例
      • 2.1 导入 maven 依赖
      • 2.2 使用连接池读写
      • 2.3 使用集群读写
      • 2.4 完整示例代码
      • 2.5 测试集群的搭建
    • 三、Lettuce 开发示例
      • 3.1 导入 maven 依赖
      • 3.2 读写数据
    • 四、Spring Boot Redis 开发示例
      • 4.1 导入 maven 依赖
      • 4.2 配置Redis服务地址
      • 4.3 基于 RedisTemplate 的读写全类型数据
      • 4.4 基于 StringRedisTemplate 的读写字符串类型数据
      • 4.5 基于 RedisConnection 的读写字节数据
      • 4.6 读写 Hash 数据类型
      • 4.7 订阅发布
      • 4.8 基于SpringBoot的完整测试代码
      • 4.9 注意问题

如果您对Redis的了解不够深入请关注本栏目,本栏目包括Redis安装,Redis配置文件说明,Redis命令和数据类型说明,Redis持久化配置,Redis主从复制和哨兵机制,Redis Cluster(集群)配置,Redis Predixy 集群,Redis Twemproxy 集群,Redis Codis 集群,Redis 集群对比,RedisBloom 布隆过滤器。

一、概述

  • Redis(Remote Dictionary Server)是一种高性能的开源内存数据库,它具有多种用途和功能,可以充当缓存、消息队列、数据库、实时分析和数据处理平台等多种角色。具体功能如下:

    1. 数据缓存: Redis 可以用作应用程序的缓存层,帮助减少对后端数据库的频繁访问。通过将经常使用的数据存储在内存中,可以显著提高读取速度,降低数据库负担,从而提高应用程序性能。
    2. 会话存储: Redis 可以用于存储用户会话数据,特别是在分布式环境中。这使得用户会话可以跨多个服务器实例进行共享,提高了应用程序的伸缩性和可用性。
    3. 消息队列: Redis 支持发布/订阅(Pub/Sub)模式,使其成为一个优秀的消息队列平台。应用程序可以使用 Redis 来发送和接收消息,实现异步通信、事件驱动和消息分发。
    4. 计数器和统计信息: Redis 提供了递增和递减操作,因此它非常适合存储计数器数据。这对于跟踪应用程序中的用户行为、实时统计信息和监视任务非常有用。
    5. 地理空间数据: Redis 支持地理空间数据(Geospatial Data),因此它可以用于存储位置信息、地图数据和地理位置查询。
    6. 分布式锁: Redis 可以用于实现分布式锁,确保在分布式系统中的互斥操作。这对于避免竞态条件和数据一致性非常重要。
    7. 缓存击穿保护: Redis 可以用于缓存击穿保护,通过设置适当的过期时间或使用布隆过滤器来避免某个数据的同时大量请求导致的数据库请求。
    8. 实时数据传输: Redis 可以用于构建实时数据传输和协作应用程序,如聊天应用、协同编辑和游戏。
    9. 数据持久性: Redis 提供不同级别的数据持久性选项,以确保数据在服务器重启后不会丢失。
  • 下面分别使用 Jedis 、Lettuce 访问Redis 和 在 Spring Boot 使用访问 Redis 的简单示例。

二、Jedis 开发示例

  • 开源地址:jedis

2.1 导入 maven 依赖

  • 在 pom.xml 添加 jedis

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

2.2 使用连接池读写

  • 使用连接池对单个Redis实例进行读写

            JedisPool pool = new JedisPool("192.168.8.60", 6379);
            Jedis resource = pool.getResource();
            resource.set("aaa", "111");
            System.out.println("read redis 1="+resource.get("aaa"));
    

2.3 使用集群读写

  • 使用集群对Redis集群进行读写

            Set<HostAndPort> jedisClusterNodes = new HashSet<HostAndPort>();
            jedisClusterNodes.add(new HostAndPort("192.168.8.60", 30001));
            jedisClusterNodes.add(new HostAndPort("192.168.8.60", 30002));
            jedisClusterNodes.add(new HostAndPort("192.168.8.60", 30003));
    //        jedisClusterNodes.add(new HostAndPort("192.168.8.60", 30004));
    //        jedisClusterNodes.add(new HostAndPort("192.168.8.60", 30005));
    //        jedisClusterNodes.add(new HostAndPort("192.168.8.60", 30006));
            JedisCluster jedis = new JedisCluster(jedisClusterNodes);
    
            jedis.set("ddd", "1111");
            System.out.println("read redis 2="+ jedis.get("aaa"));
    

在这里插入图片描述

2.4 完整示例代码

  • 以下是完整的测试代码

    package top.yiqifu.study.p121;
    
    
    import redis.clients.jedis.HostAndPort;
    import redis.clients.jedis.Jedis;
    import redis.clients.jedis.JedisCluster;
    import redis.clients.jedis.JedisPool;
    
    import java.util.HashSet;
    import java.util.Set;
    
    public class Test01_Redis {
    
        public static void main(String[] args) {
            // 通过连接池直接读写数据
            testResource();
    
            //通过Redis集群(Cluster)读写数据
            testCluster();
        }
    
        private static void testResource(){
            JedisPool pool = new JedisPool("192.168.8.60", 6379);
            Jedis resource = pool.getResource();
            resource.set("aaa", "111");
            System.out.println("read redis 1="+resource.get("aaa"));
        }
    
        private static void testCluster(){
            Set<HostAndPort> jedisClusterNodes = new HashSet<HostAndPort>();
            jedisClusterNodes.add(new HostAndPort("192.168.8.60", 30001));
            jedisClusterNodes.add(new HostAndPort("192.168.8.60", 30002));
            jedisClusterNodes.add(new HostAndPort("192.168.8.60", 30003));
    //        jedisClusterNodes.add(new HostAndPort("192.168.8.60", 30004));
    //        jedisClusterNodes.add(new HostAndPort("192.168.8.60", 30005));
    //        jedisClusterNodes.add(new HostAndPort("192.168.8.60", 30006));
            JedisCluster jedis = new JedisCluster(jedisClusterNodes);
    
            jedis.set("ddd", "1111");
            System.out.println("read redis 2="+ jedis.get("aaa"));
        }
    }
    

2.5 测试集群的搭建

  • 以下给出测试集群搭建的核心命令,具体请参考Redis Cluster(集群)配置。

    cd /redis-6.0.6/utils/create-cluster
    vi create-cluster
        CLUSTER_HOST=192.168.8.60
        PROTECTED_MODE=no
    ./create-cluster start
    ./create-cluster create
    
    
    firewall-cmd  --permanent  --add-port=30001/tcp
    firewall-cmd  --permanent  --add-port=30002/tcp
    firewall-cmd  --permanent  --add-port=30003/tcp
    firewall-cmd  --permanent  --add-port=30004/tcp
    firewall-cmd  --permanent  --add-port=30005/tcp
    firewall-cmd  --permanent  --add-port=30006/tcp
    firewall-cmd  --reload
    

三、Lettuce 开发示例

3.1 导入 maven 依赖

  • 开源地址:lettuce-core

  • 在 pom.xml 添加 lettuce-core

            <dependency>
                <groupId>io.lettuce</groupId>
                <artifactId>lettuce-core</artifactId>
                <version>6.1.10.RELEASE</version>
            </dependency>
    

3.2 读写数据

  • 以下使用 lettuce 来读写Redis,lettuce 最大的特点是支持响应式编程(Reactive API)。

    package top.yiqifu.study.p121;
    
    
    import io.lettuce.core.RedisClient;
    import io.lettuce.core.api.StatefulRedisConnection;
    import io.lettuce.core.api.async.RedisAsyncCommands;
    import io.lettuce.core.api.sync.RedisStringCommands;
    
    public class Test02_LettuceRedis {
    
        public static void main(String[] args) {
            // 同步/异步方式读写数据
            testSync();
        }
    
        private static void testSync(){
            RedisClient client = RedisClient.create("redis://192.168.8.60:6379");
            StatefulRedisConnection<String, String> connection = client.connect();
            RedisStringCommands sync = connection.sync();
            sync.set("aaa", "111");
            System.out.println("read redis 1="+sync.get("aaa"));
    
            RedisAsyncCommands<String, String> async = connection.async();
            async.set("bbb", "222");
            System.out.println("read redis 2="+async.get("bbb"));
        }
    }
    
    

四、Spring Boot Redis 开发示例

4.1 导入 maven 依赖

  • 这里 spring-boot-starter-data-redis 是 Redis 的依赖,而 spring-boot-starter-json 是用于数据序列化的 json 依赖。
		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
            <version>2.7.15</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-json</artifactId>
            <version>2.7.15</version>
        </dependency>

4.2 配置Redis服务地址

  • 在 application.yaml 文件中添加配置
spring:
  redis:
    host: 192.168.8.60
    port: 6379

4.3 基于 RedisTemplate 的读写全类型数据

    @Autowired
    RedisTemplate redisTemplate;
    
    private void  testObject(){
        redisTemplate.opsForValue().set("aaa", "111");
        System.out.println("reda redis 1 = "+redisTemplate.opsForValue().get("aaa"));
    }

4.4 基于 StringRedisTemplate 的读写字符串类型数据

    @Autowired
    StringRedisTemplate stringRedisTemplate;
    
    private void testString(){
        stringRedisTemplate.opsForValue().set("bbb", "222");
        System.out.println("read redis 2 = "+stringRedisTemplate.opsForValue().get("bbb"));
    }

4.5 基于 RedisConnection 的读写字节数据

    @Autowired
    RedisTemplate redisTemplate;
    
    private void  testObject(){
        redisTemplate.opsForValue().set("aaa", "111");
        System.out.println("reda redis 1 = "+redisTemplate.opsForValue().get("aaa"));
    }

4.6 读写 Hash 数据类型

    @Autowired
    RedisTemplate redisTemplate;
    @Autowired
    StringRedisTemplate stringRedisTemplate;
    @Autowired
    @Qualifier("serializerRedisTemplate")
    StringRedisTemplate serializerRedisTemplate;

    private void testHash(){
        // 方法一:使用 StringRedisTemplate 直接读写hash
        HashOperations<String, Object, Object> hash = stringRedisTemplate.opsForHash();
        hash.put("someInfo", "name" , "qifu");
        hash.put("someInfo", "age" , "30");
        System.out.println("read redis 4 = "+hash.entries("someInfo"));//hincrby someInfo age 1

        // 创建对象
        Person person = new Person();
        person.setName("zhang san");
        person.setAge(20);
        Jackson2HashMapper hashMapper = new Jackson2HashMapper(objectMapper, false);

        // 方法二:使用 RedisTemplate 读写 hash 对象
        redisTemplate.opsForHash().putAll("person1", hashMapper.toHash(person));
        Map personMap1 = redisTemplate.opsForHash().entries("person1");
        Person value6 = objectMapper.convertValue(personMap1, Person.class);
        System.out.println("read redis 6 = "+value6.getName());

        // 方法三:使用 StringRedisTemplate 读写 hash 对象
        // stringRedisTemplate 需设置 ValueSerializer ,因为age是Integer类型
        stringRedisTemplate.setHashValueSerializer(new Jackson2JsonRedisSerializer<Object>(Object.class));
        stringRedisTemplate.opsForHash().putAll("person2", hashMapper.toHash(person));
        Map personMap2 = stringRedisTemplate.opsForHash().entries("person2");
        Person value7 = objectMapper.convertValue(personMap2, Person.class);
        System.out.println("read redis 7 = "+value7.getName());

        // 方法四:使用自定义 serializerRedisTemplate  读写 hash 对象
        serializerRedisTemplate.opsForHash().putAll("person3", hashMapper.toHash(person));
        Map personMap3 = serializerRedisTemplate.opsForHash().entries("person3");
        Person value8 = objectMapper.convertValue(personMap3, Person.class);
        System.out.println("read redis 8 = "+value8.getName());
    }

4.7 订阅发布

    @Autowired
    StringRedisTemplate stringRedisTemplate;
    
    private void  testPubsub(){
        //pub/sub
        stringRedisTemplate.getConnectionFactory().getConnection().subscribe(new MessageListener() {
            @Override
            public void onMessage(Message message, byte[] pattern) {
                System.out.println("sub redis = "+new String(message.getBody()));
            }
        }, "xxx".getBytes());
        stringRedisTemplate.convertAndSend("xxx","yyy");
    }

4.8 基于SpringBoot的完整测试代码

  • TestRedis.java

    package top.yiqifu.study.p211_redis;
    
    import com.fasterxml.jackson.databind.ObjectMapper;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.data.redis.connection.Message;
    import org.springframework.data.redis.connection.MessageListener;
    import org.springframework.data.redis.connection.RedisConnection;
    import org.springframework.data.redis.core.HashOperations;
    import org.springframework.data.redis.core.RedisTemplate;
    import org.springframework.data.redis.core.StringRedisTemplate;
    import org.springframework.data.redis.hash.Jackson2HashMapper;
    import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
    import org.springframework.stereotype.Component;
    
    import java.util.Map;
    
    @Component
    public class TestRedis {
        @Autowired
        RedisTemplate redisTemplate;
        @Autowired
        StringRedisTemplate stringRedisTemplate;
        @Autowired
        @Qualifier("serializerRedisTemplate")
        StringRedisTemplate serializerRedisTemplate;
    
        @Autowired
        ObjectMapper objectMapper;
    
        public void  test(){
            // 基于 RedisTemplate 测试Redis全类型的读写,如 object
            this.testObject();
    
            // 基于 StringRedisTemplate 测试Redis字符串类型的读写,如 string
            this.testString();
    
            // 基于 RedisConnection 测试Redis更底层的字节类型的读写,如 byte[]
            this.testBytes();
    
            // 基于 StringRedisTemplate 测试Redis的Hash类型的读写,如 hash
            this.testHash();
    
            // 基于 StringRedisTemplate 测试Redis的发布、订阅
            this.testPubsub();
        }
    
    
        private void  testObject(){
            redisTemplate.opsForValue().set("aaa", "111");
            System.out.println("reda redis 1 = "+redisTemplate.opsForValue().get("aaa"));
        }
        private void testString(){
            stringRedisTemplate.opsForValue().set("bbb", "222");
            System.out.println("read redis 2 = "+stringRedisTemplate.opsForValue().get("bbb"));
        }
        private void testBytes(){
            RedisConnection connection = redisTemplate.getConnectionFactory().getConnection();
            connection.set("ccc".getBytes(), "333".getBytes());
            System.out.println("read redis 3 = "+new String(connection.get("ccc".getBytes())));
        }
    
        private void testHash(){
            // 方法一:使用 StringRedisTemplate 直接读写hash
            HashOperations<String, Object, Object> hash = stringRedisTemplate.opsForHash();
            hash.put("someInfo", "name" , "qifu");
            hash.put("someInfo", "age" , "30");
            System.out.println("read redis 4 = "+hash.entries("someInfo"));//hincrby someInfo age 1
    
            // 创建对象
            Person person = new Person();
            person.setName("zhang san");
            person.setAge(20);
            Jackson2HashMapper hashMapper = new Jackson2HashMapper(objectMapper, false);
    
            // 方法二:使用 RedisTemplate 读写 hash 对象
            redisTemplate.opsForHash().putAll("person1", hashMapper.toHash(person));
            Map personMap1 = redisTemplate.opsForHash().entries("person1");
            Person value6 = objectMapper.convertValue(personMap1, Person.class);
            System.out.println("read redis 6 = "+value6.getName());
    
            // 方法三:使用 StringRedisTemplate 读写 hash 对象
            // stringRedisTemplate 需设置 ValueSerializer ,因为age是Integer类型
            stringRedisTemplate.setHashValueSerializer(new Jackson2JsonRedisSerializer<Object>(Object.class));
            stringRedisTemplate.opsForHash().putAll("person2", hashMapper.toHash(person));
            Map personMap2 = stringRedisTemplate.opsForHash().entries("person2");
            Person value7 = objectMapper.convertValue(personMap2, Person.class);
            System.out.println("read redis 7 = "+value7.getName());
    
            // 方法四:使用自定义 serializerRedisTemplate  读写 hash 对象
            serializerRedisTemplate.opsForHash().putAll("person3", hashMapper.toHash(person));
            Map personMap3 = serializerRedisTemplate.opsForHash().entries("person3");
            Person value8 = objectMapper.convertValue(personMap3, Person.class);
            System.out.println("read redis 8 = "+value8.getName());
        }
    
        private void  testPubsub(){
            //pub/sub
            stringRedisTemplate.getConnectionFactory().getConnection().subscribe(new MessageListener() {
                @Override
                public void onMessage(Message message, byte[] pattern) {
                    System.out.println("sub redis = "+new String(message.getBody()));
                }
            }, "xxx".getBytes());
            stringRedisTemplate.convertAndSend("xxx","yyy");
        }
    }
    
  • Config.java

    package top.yiqifu.study.p211_redis;
    
    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.StringRedisTemplate;
    import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
    
    import javax.annotation.Resource;
    
    @Configuration
    public class Config {
    
        @Resource
        RedisConnectionFactory factory;
    
        @Bean("serializerRedisTemplate")
        public StringRedisTemplate getRedisTemplate(){
            StringRedisTemplate template = new StringRedisTemplate(factory);
            template.setHashValueSerializer(new Jackson2JsonRedisSerializer<Object>(Object.class));
            return template;
        }
    }
    
  • RedisSpringBootApplication.java

    package top.yiqifu.study.p211_redis;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.context.ConfigurableApplicationContext;
    
    @SpringBootApplication
    public class RedisSpringBootApplication {
        public static void main(String[] args){
    
            ConfigurableApplicationContext context = SpringApplication.run(RedisSpringBootApplication.class, args);
            TestRedis bean = context.getBean(TestRedis.class);
            bean.test();
        }
    }
    

4.9 注意问题

  • 在新版本(版本大于2.7)的SpringBoot中,以下写法会报错“Could not autowire. No beans of ‘RedisConnectionFactory’ type found”,如下写法:

    @Configuration
    public class Config {
        @Bean("serializerRedisTemplate")
        public StringRedisTemplate getRedisTemplate(RedisConnectionFactory factory){
            StringRedisTemplate template = new StringRedisTemplate(factory);
            template.setHashValueSerializer(new Jackson2JsonRedisSerializer<Object>(Object.class));
            return template;
        }
    }
    
  • 要使用@Resource注解的属性注入,修改后的代码为

    @Configuration
    public class Config {
    
        @Resource
        RedisConnectionFactory factory;
    
        @Bean("serializerRedisTemplate")
        public StringRedisTemplate getRedisTemplate(){
            StringRedisTemplate template = new StringRedisTemplate(factory);
            template.setHashValueSerializer(new Jackson2JsonRedisSerializer<Object>(Object.class));
            return template;
        }
    }
    

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据结构(超详细讲解!!)第二十一节 特殊矩阵的压缩存储

1.压缩存储的目标 值相同的元素只存储一次 压缩掉对零元的存储&#xff0c;只存储非零元 特殊形状矩阵&#xff1a; 是指非零元&#xff08;如值相同的元素&#xff09;或零元素分布具有一定规律性的矩阵。 如&#xff1a; 对称矩阵 上三角矩阵 下三角矩阵 对角矩阵 准…

YOLOv5论文作图教程(2)— 软件界面布局和基础功能介绍

前言:Hello大家好,我是小哥谈。通过上一节课的学习,相信大家都已成功安装好软件了,本节课就给大家详细介绍一下Axure RP9软件的界面布局及相关基础功能,希望大家学习之后能够有所收获!🌈 前期回顾: YOLOv5论文作图教程(1)— 软件介绍及下载安装(包括软件包+下载安…

Java之SpringCloud Alibaba【八】【Spring Cloud微服务Gateway整合sentinel限流】

一、Gateway整合sentinel限流 网关作为内部系统外的一层屏障,对内起到-定的保护作用&#xff0c;限流便是其中之- - .网关层的限流可以简单地针对不同路由进行限流,也可针对业务的接口进行限流,或者根据接口的特征分组限流。 1、添加依赖 <dependency><groupId>c…

Docker-consul容器服务更新与发现

目录 一、服务注册与发现 二、什么是consul 三、consul的关键特性 四、consul部署 环境准备 部署consul服务器 1&#xff09;建立 Consul 服务 &#xff08;30.14&#xff09; 2&#xff09;设置代理&#xff0c;在后台启动 consul 服务端 3&#xff09;查看集群信息 …

[RCTF 2019]nextphp

文章目录 考点前置知识PHP RFC&#xff1a;预加载FFI基本用法PHP RFC&#xff1a;新的自定义对象序列化机制 解题过程 考点 PHP伪协议、反序列化、FFI 前置知识 PHP RFC&#xff1a;预加载 官方文档 通过查看该文档&#xff0c;在最下面找到预加载结合FFI的危害 FFI基本用法 …

时序预测 | MATLAB实现基于SVM-Adaboost支持向量机结合AdaBoost时间序列预测

时序预测 | MATLAB实现基于SVM-Adaboost支持向量机结合AdaBoost时间序列预测 目录 时序预测 | MATLAB实现基于SVM-Adaboost支持向量机结合AdaBoost时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.Matlab实现SVM-Adaboost时间序列预测&#xff08;风…

矩阵乘积的迹对矩阵求导

说明 有时候为了输入方便&#xff0c;B和都代表B的转置。 矩阵的在线计算有个网站可以参考&#xff1a;Matrix Calculus dtr(AB)/dAB 下面用一个例子来证明。 dtr(ABA)/dAABAB 下面用一个例子来证明&#xff1a; 因为我们要求ABA的迹&#xff0c;所以为了简便&#xff0c;我们…

2023-11-Rust

学习方案&#xff1a;Rust程序设计指南 1、变量和可变性 声明变量&#xff1a;let 变量、const 常量 rust 默认变量一旦声明&#xff0c;就不可变(immutable)。当想改变 加 mut&#xff08;mutable&#xff09; 。 const 不允许用mut &#xff0c;只能声明常量&#xff0c;…

R数据分析:净重新分类(NRI)和综合判别改善(IDI)指数的理解

对于分类预测模型的表现评估我们最常见的指标就是ROC曲线&#xff0c;报告AUC。比如有两个模型&#xff0c;我们去比较下两个模型AUC的大小&#xff0c;进而得出两个模型表现的优劣。这个是我们常规的做法&#xff0c;如果我们的研究关注点放在“在原模型新引入一个预测变量&am…

小而美的服务端推送技术SSE之理论与实战(含demo)

[[toc]] SSE 是什么? 基本特点 SSE: Server-Sent Events用途: 服务器向浏览器推送信息, 注意反过来不行本质: 基于http协议的服务端推送技术特点: 响应头mimetype 为 text/event-stream, keep connection open数据: 流信息(streaming),数据流不是一次性数据包,会连续不…

项目实战:中央控制器实现(2)-优化Controller,将共性动作抽取到中央控制器

1、FruitController FruitController已经和Web没有关系了&#xff0c;和Web容器解耦&#xff0c;可以脱离Web容器做单元测试 package com.csdn.fruit.controller; import com.csdn.fruit.dto.PageInfo; import com.csdn.fruit.dto.PageQueryParam; import com.csdn.fruit.dto.R…

龙迅LT6911GXC,HDMI 2.1转4 PORT MIPI/LVDS支持分辨率高达8K30HZ

描述&#xff1a; LT6911GXC 是一款面向 VR / 显示应用的高性能 HDMI2.1 至 MIPI 或 LVDS 芯片。 高清遥控器RX作为高清电脑中继器的上游&#xff0c;可与其他芯片的高清电脑TX合作&#xff0c;实现直译台功能。 对于 HDMI2.1 输入&#xff0c;LT6911GXC 可配置为 3/4 通道。 …

上线项目问题——无法加载响应数据

目录 无法加载响应数据解决 无法加载响应数据 上线项目时 改用服务器上的redis和MySQL 出现请求能请求到后端&#xff0c;后端也能正常返回数据&#xff0c;但是在前端页面会显示 以为是跨域问题&#xff0c;但是环境还在本地&#xff0c;排除跨域问题以为是服务器问题&#…

【Linux系统编程十六】:(基础IO3)--用户级缓冲区

【Linux系统编程十六】&#xff1a;基础IO3--用户级缓冲区 一.用户级缓冲区二.缓冲区刷新策略1.验证&#xff1a; 三.缓冲区意义 一.用户级缓冲区 我们首先理解上面的代码&#xff0c;分别使用printf和fprintf&#xff0c;fwrite往1号文件描述符里输出&#xff0c;也就是往显示…

5 Tensorflow图像识别(下)模型构建

上一篇&#xff1a;4 Tensorflow图像识别模型——数据预处理-CSDN博客 1、数据集标签 上一篇介绍了图像识别的数据预处理&#xff0c;下面是完整的代码&#xff1a; import os import tensorflow as tf# 获取训练集和验证集目录 train_dir os.path.join(cats_and_dogs_filter…

3.4、Linux小程序:进度条

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 目录 回车与换行的概念和区别 行缓冲区概念 进度条代码 version1 version2 version3 回车与换行的概念和区别 换行\n&#xff0c;回车\r 似乎无需多言 行缓冲区概念 这里我们通过例子来简单理解即可&#xff0c;深入…

基于单片机的智能扫地机设计

概要 本文主要设计一个简单的智能扫地机。该扫地机的核心控制元器件是stc89c52&#xff0c;具有编写程序简单&#xff0c;成本普遍较低&#xff0c;功能较多&#xff0c;效率特别高等优点&#xff0c;因此在市场上得到很大的应用。除此之外&#xff0c;该扫地机能够自动避开障碍…

C语言实现利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示

完整代码&#xff1a; /*利用条件运算符的嵌套来完成此题&#xff1a;学习成绩>90分的同学用A表示&#xff0c;60-89分之间 的用B表示&#xff0c;60分以下的用C表示*/ #include<stdio.h>int main(){int score;char grade;printf("请输入你的成绩&#xff1a;&q…

IGP高级特性简要介绍(OSPF-上篇)

OSPF高级特性 一、OSPF_提升故障收敛及网络恢复速度 1.FRR与BFD快速恢复故障 1.1 FRR 在传统转发模式下&#xff0c;当到达同一个目的网络存在多条路由时&#xff0c;路由器总是选择最优路由使用&#xff0c;并且下发到FIB表指导数据转发。 当最优路由故障时&#xff0c;需…

Ubuntu18.04安装pcl-1.12.1,make时报错:/usr/bin/ld: cannot find -lvtkIOMPIImage

解决方案&#xff1a; 在vtk安装包中&#xff0c;重新打开cmake-gui&#xff0c;然后勾选上VTK_Group_MPI和VTK_Group_Imaging。 cd VTK-8.2.0 cd build cmake-gui然后重新编译生成。 make -j8 # 或者j4,量力而行。 sudo make install 就可以解决了。 然后重新回到pcl安装…