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-clusterCLUSTER_HOST=192.168.8.60PROTECTED_MODE=no
    ./create-cluster start
    ./create-cluster createfirewall-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.60port: 6379

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

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

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

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

4.5 基于 RedisConnection 的读写字节数据

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

4.6 读写 Hash 数据类型

    @AutowiredRedisTemplate redisTemplate;@AutowiredStringRedisTemplate stringRedisTemplate;@Autowired@Qualifier("serializerRedisTemplate")StringRedisTemplate serializerRedisTemplate;private void testHash(){// 方法一:使用 StringRedisTemplate 直接读写hashHashOperations<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 订阅发布

    @AutowiredStringRedisTemplate stringRedisTemplate;private void  testPubsub(){//pub/substringRedisTemplate.getConnectionFactory().getConnection().subscribe(new MessageListener() {@Overridepublic 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 {@AutowiredRedisTemplate redisTemplate;@AutowiredStringRedisTemplate stringRedisTemplate;@Autowired@Qualifier("serializerRedisTemplate")StringRedisTemplate serializerRedisTemplate;@AutowiredObjectMapper objectMapper;public void  test(){// 基于 RedisTemplate 测试Redis全类型的读写,如 objectthis.testObject();// 基于 StringRedisTemplate 测试Redis字符串类型的读写,如 stringthis.testString();// 基于 RedisConnection 测试Redis更底层的字节类型的读写,如 byte[]this.testBytes();// 基于 StringRedisTemplate 测试Redis的Hash类型的读写,如 hashthis.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 直接读写hashHashOperations<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/substringRedisTemplate.getConnectionFactory().getConnection().subscribe(new MessageListener() {@Overridepublic 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 {@ResourceRedisConnectionFactory 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 {@ResourceRedisConnectionFactory factory;@Bean("serializerRedisTemplate")public StringRedisTemplate getRedisTemplate(){StringRedisTemplate template = new StringRedisTemplate(factory);template.setHashValueSerializer(new Jackson2JsonRedisSerializer<Object>(Object.class));return template;}
    }
    

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智慧城市数据中台建设方案:PPT全文51页,附下载

关键词&#xff1a;智慧城市解决方案&#xff0c;数据中台解决方案&#xff0c;智慧城市建设&#xff0c;数据中台技术架构&#xff0c;数据中台建设 一、智慧城市数据中台建设背景 智慧城市数据中台是在城市数字化转型和智能化升级的背景下提出的&#xff0c;旨在实现城市数…

WebSocket网络协议

二十六、WebSocket 26.1 介绍 WebSocket是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工通信&#xff0c;浏览器和服务器只需要完成一次握手&#xff0c;两者之间就可以创建持久性的连接&#xff0c;并进行双向数据传输。 HHTP协议和WebSocket协议对比&#xff…

基于LDA主题分析的《老友记》情景喜剧数据集的建模分析(文末送书)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

外星人笔记本键盘USB协议逆向

前言 我朋友一台 dell g16 购买时直接安装了linux系统&#xff0c;但是linux上没有官方的键盘控制中心&#xff0c;所以无法控制键盘灯光&#xff0c;于是我就想着能不能逆向一下键盘的协议&#xff0c;然后自己写一个控制键盘灯光的程序。我自己的外星人笔记本是m16&#xff…

Django(三、数据的增删改查、Django生命周期流程图)

文章目录 一、 基于ORM进行的CURDuser_list&#xff1a;作为主页使用路由文件urls.py配置如下&#xff1a;add.html&#xff1a;用于新增用户的数据页add页面视图函数如下:edit.html&#xff1a;修改数据的页面那么来总结一下上序所操作所用到的内容。 导入已存在的表其方式有两…

Unity 使用INI文件存储数据或配置参数预设

法1&#xff1a;调用外部Capi库 具体使用&#xff1a; public class Ini{//读取INI文件需要调用C的APP[System.Runtime.InteropServices.DllImport("kernel32")]private static extern long WritePrivateProfileString(string section, string key, string val, st…

Leetcode—20.有效的括号【简单】

2023每日刷题&#xff08;二十七&#xff09; Leetcode—20.有效的括号 C实现代码 class Solution { public:bool isValid(string s) {stack<char> arr;int len s.size();if(len 1) {return false;}for(int i 0; i < len; i) {if(s[i] ( || s[i] [ || s[i] {)…

SSM框架Demo: 简朴博客系统

文章目录 1. 前端页面效果2. 项目创建3. 前期配置3.1. 创建数据库数据表3.2. 配置文件 4. 创建实体类5. 统一处理5.1. 统一返回格式处理5.2. 统一异常处理 6. 全局变量7. Session工具类8. 登录拦截器9. 密码加盐加密10. 线程池组件11. dao层11.1. UserMapper11.2. ArticleMappe…

Linux 基本语句_10_进程

进程和程序的区别&#xff1a; 程序是一段静态的代码&#xff0c;是保存在非易失储存器上的制令和数据的有序集合&#xff0c;没有任何执行的概念&#xff1b;而进程是一个动态的概念&#xff0c;它是程序的一次执行过程&#xff0c;包括了动态创建、调度、执行和消亡的整个过程…

面向切面编程AOP

2023.11.12 本章学习spring另一大核心——AOP。AOP是一种编程技术&#xff0c;底层是使用动态代理来实现的。Spring的AOP使用的动态代理是&#xff1a;JDK动态代理 CGLIB动态代理技术。Spring在这两种动态代理中灵活切换&#xff0c;如果是代理接口&#xff0c;会默认使用JDK动…

KDE Plasma 6 将不支持较旧的桌面小部件

KDE Plasma 6 进行了一些修改&#xff0c;需要小部件作者进行调整。开发人员&#xff0c;移植时间到了&#xff01; KDE Plasma 6 是备受期待的桌面环境版本升级版本。 最近&#xff0c;其发布时间表公布&#xff0c;第一个 Alpha 版本将于 2023 年 11 月 8 日上线&#xff0…

【JVM系列】- 寻觅·方法区的内容

寻觅方法区的内容 &#x1f604;生命不息&#xff0c;写作不止 &#x1f525; 继续踏上学习之路&#xff0c;学之分享笔记 &#x1f44a; 总有一天我也能像各位大佬一样 &#x1f31d;分享学习心得&#xff0c;欢迎指正&#xff0c;大家一起学习成长&#xff01; 文章目录 寻觅…

一个java文件的JVM之旅

准备 我是小C同学编写得一个java文件&#xff0c;如何实现我的功能呢&#xff1f;需要去JVM(Java Virtual Machine)这个地方旅行。 变身 我高高兴兴的来到JVM&#xff0c;想要开始JVM之旅&#xff0c;它确说&#xff1a;“现在的我还不能进去&#xff0c;需要做一次转换&#x…

解析Python的深浅拷贝机制

引言 在Python编程中&#xff0c;我们经常会遇到数据复制的问题。有时候&#xff0c;我们只是需要复制一份数据的引用&#xff0c;有时候&#xff0c;我们则需要复制数据本身。这就涉及到了Python中的深浅拷贝问题。深浅拷贝是Python中的一个重要概念&#xff0c;理解它对于编…

微软和Red Hat合体:帮助企业更方便部署容器

早在2015年&#xff0c;微软就已经和Red Hat达成合作共同为企业市场开发基于云端的解决方案。时隔两年双方在企业市场的多个方面开展更紧密的合作&#xff0c;今天两家公司再次宣布帮助企业更方便地部署容器。 双方所开展的合作包括在微软Azure上部署Red Hat OpenShift&#xf…

Pyside6/PYQT6如何实现无边框设计,解决无边框窗口无法移动的问题

文章目录 💢 问题 💢💯 解决方案 💯🍔 准备工作🐾 操作步骤🐾 窗口无边框🐾 窗口透明🐾 实现窗口可移动⚓️ 相关链接 ⚓️💢 问题 💢 有时候我们需要一个无边框的UI设计来实现/美化一些功能,如:制作一个桌面时钟,进度条展示等,要实现无边框其实很简…

从开源项目聊鱼眼相机的“360全景拼接”

目录 概述 从360全景的背景讲起 跨过参数标定聊透视变化 拼接图片后处理 参考文献 概述 写这篇文章的原因完全源于开源项目(GitHub参阅参考文献1)。该项目涵盖了环视系统的较为全貌的制作过程&#xff0c;包含完整的标定、投影、拼接和实时运行流程。该篇文章主要是梳理全…

机器学习数据预处理——Word2Vec的使用

引言&#xff1a; Word2Vec 是一种强大的词向量表示方法&#xff0c;通常通过训练神经网络来学习词汇中的词语嵌入。它可以捕捉词语之间的语义关系&#xff0c;对于许多自然语言处理任务&#xff0c;包括情感分析&#xff0c;都表现出色。 代码&#xff1a; 重点代码&#…

科技改变农业:合成数据农业中的应用

介绍 农业在我们的生活中起着至关重要的作用&#xff0c;它为我们提供了生存的食物。如今&#xff0c;它遇到了各种困难&#xff0c;例如气候变化的影响、缺乏工人以及全球流行病造成的中断。这些困难影响了耕作用水和土地的供应&#xff0c;而这些水和土地正变得越来越稀缺。…

PROFINET和UDP、MODBUS-RTU通信速度对比实验

这篇博客我们介绍PROFINET 和MODBUS-RTU通信实验时的数据刷新速度,以及这种速度不同对控制系统带来的挑战都有哪些,在介绍这篇对比实验之前大家可以参考下面的文章链接: S7-1200PLC和SMART PLC的PN智能从站通信 S7-200 SMART 和 S7-1200PLC进行PROFINET IO通信-CSDN博客文…