Redis Java 开发简单示例

news2024/11/24 16:51:35

文章目录

    • 一、概述
    • 二、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;
        }
    }
    

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

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

相关文章

52基于MATLAB的希尔伯特Hilbert变换求包络谱

基于MATLAB的希尔伯特Hilbert变换求包络谱&#xff0c;对原始信号进行初步滤波&#xff0c;之后进行包络谱分析。可替换自己的数据进行优化。程序已调通&#xff0c;可直接运行。 52的尔伯特Hilbert变换包络谱 (xiaohongshu.com)

混沌系统在图像加密中的应用(基于哈密顿能量函数的混沌系统构造1.1)

混沌系统在图像加密中的应用&#xff08;基于哈密顿能量函数的混沌系统构造1.1&#xff09; 前言一、基于广义哈密顿系统的一类混沌系统构造1.基本动力学特性分析2.数值分析 待续 前言 本文的主题是“基于哈密顿能量函数的混沌系统构造”&#xff0c;哈密顿能量函数是是全文研…

【Git】快速入门安装及使用git与svn的区别常用命令

一、导言 1、什么是svn&#xff1f; SVN是Subversion的简称&#xff0c;是一个集中式版本控制系统。与Git不同&#xff0c;SVN没有分布式的特性。在SVN中&#xff0c;项目的代码仓库位于服务器上&#xff0c;团队成员通过向服务器提交和获取代码来实现版本控制。SVN记录了每个文…

Go 接口:nil接口为什么不等于nil?

本文主要内容:深入了解接口类型的运行时表示层。 文章目录 一、Go 接口的地位二、接口的静态特性与动态特性2.1 接口的静态特性与动态特性介绍2.2 “动静皆备”的特性的好处 三、nil error 值 ! nil四、接口类型变量的内部表示第一种&#xff1a;nil 接口变量第二种&#xff1a…

JDBC(二)

第4章 操作BLOB类型字段 4.1 MySQL BLOB类型 MySQL中&#xff0c;BLOB是一个二进制大型对象&#xff0c;是一个可以存储大量数据的容器&#xff0c;它能容纳不同大小的数据。 插入BLOB类型的数据必须使用PreparedStatement&#xff0c;因为BLOB类型的数据无法使用字符串拼接写…

Hundred Finance 攻击事件分析

背景知识 Hundred Finance 是 fork Compound 的一个借贷项目&#xff0c;在2023/04/15遭受了黑客攻击。攻击者在发起攻击交易之前执行了两笔准备交易占据了池子&#xff0c;因为发起攻击的前提是池子处于 empty 的状态&#xff08;发行的 hToken 数量为 0&#xff09;。 准备交…

​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​

软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】 课本里章节里所有蓝色字体的思维导图

CAN 协议常见面试题总结

0.讲一下CAN通讯的过程 第一段&#xff1a;需要发送的通讯设备&#xff0c;先发送一个显性电平0&#xff0c;告诉其他通讯设备&#xff0c;需要开始通讯。 第二段&#xff1a;就是发送仲裁段&#xff0c;其中包括ID帧和数据帧类型&#xff0c;告诉其他通讯设备&#xff0c;需…

记录一次校园CTF--wp

一.第一题简单nc 这题直接nc 地址端口即可得到flags没有套路 二.第二题pwn:ezstack 这是一题栈溢出题目&#xff0c;查看保护&#xff1a; 没有开启PIE&#xff0c;运行下查看效果&#xff1a; 题目是一个文字购物游戏。 接着扔进IDA中分析&#xff1a; 在主函数中我们找到…

C++ string赋值和添加值

在MFC中使用C的string&#xff0c;要先#include <string>&#xff0c;然后&#xff0c;std::string s2("") 这样就可以了&#xff1b; void CStrnewView::OnDraw(CDC* pDC) {CStrnewDoc* pDoc GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for n…

【Redis】list常用命令内部编码使用场景

文章目录 前置知识列表类型的特点 命令LPUSHLPUSHXRPUSHRPUSHXLRANGELPOPRPOPLINDEXLREMLINSERTLTRIMLSETLLEN 阻塞版本命令BLPOPBRPOP 命令总结内部编码测试内部编码 使用场景消息队列分频道的消息队列 模拟栈和队列 前置知识 列表类型是⽤来存储多个有序的字符串&#xff0c…

项目管理之如何出道(上)

前言 终于有时间更新了&#xff0c;大家是不是等不及了&#xff1f;那么书接上文&#xff0c;言归正传。 各位盆友&#xff0c;时间之轮已划入夜晚&#xff0c;尝试静下心来&#xff0c;思考一番。 Q1&#xff1a;是否曾经期待自己做一名项目经理&#xff0c;干了几年的coder甚…

MinGW32丢失dll文件

问题现象 执行Makefile的时候&#xff0c;突然出现这个提示&#xff0c;还有好几个类似的&#xff0c;提示我找不到dll文件&#xff0c;建议重装。 问题分析 重装软件 最直接的办法肯定是按照建议来重装&#xff0c;但是发现重装了好几次&#xff0c;不是缺这个就是缺那个&a…

每天一道算法题:17. 电话号码的字母组合

难度 中等 题目 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 示例 1&#xff1a; 输入&#xff1a;digits “23” …

换服还是掀桌?哪条才是程序员的出路?

站在时代的风口浪尖&#xff0c;猪都能起飞。 大数据互联网正是时代的宠儿&#xff0c;IT行业的发展也正如火如荼。 人人都眼红程序员的高薪资&#xff0c;认为他们吃着时代的红利。 但是三百六十行&#xff0c;行行出社畜。”996“也好&#xff0c;甚至"007"也罢…

龙迅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 通道。 …

2023最新版JavaSE教程——第2天:变量与运算符

目录 一、关键字(keyword)二、标识符(identifier)三、变量3.1 为什么需要变量3.2 初识变量3.3 Java中变量的数据类型3.4 变量的使用3.4.1 步骤1&#xff1a;变量的声明3.4.2 步骤2&#xff1a;变量的赋值 四、基本数据类型介绍4.1 整数类型&#xff1a;byte、short、int、long4…

OmniFocus Pro for Mac(GTD时间管理软件) OmniFocus Mac版

OmniFocus Pro 3 for Mac 中文激活版是一款功能强大且灵活的 GTD 时间管理工具&#xff0c;可为您提供无干扰的环境&#xff0c;帮助您可以轻松地从邮件&#xff0c;消息&#xff0c;Safari 和任何其他第三方应用程序中安排任务&#xff0c;编写备注和剪辑信息。您可以快速轻松…

kotlin 基本语法

const val INFO "ZZZ is Success Result" fun main(){ var name: String? "zzz" name null name?.capitalize() //?问号的意思是如果name是null ,后面的方法不执行&#xff0c;如果name不是null&#xff0c;后面方法执行 var name: String? &q…

16 DNS协议详解

1、DNS的由来 很难记住网站的 IP 地址&#xff0c;因而也需要一个地 址簿&#xff0c;就是DNS 服务器。DNS 在日常生活中非常重要。每个人上网&#xff0c;都需要访问它&#xff0c;因此一旦DNS出现故障&#xff0c;是非常可怕的。因而&#xff0c;DNS 服务器&#xff0c;一定…