Java 客户端操作 Redis 命令(端口号映射方法,命令演示,注意事项)

文章目录

  • 开放端口号问题
  • 引入依赖
  • 验证连接
  • 通用命令使用
    • set 和 get 命令的使用
    • exists 和 del 命令的使用
    • keys 命令的使用
    • expire 和 ttl 命令
    • type 命令的使用
  • String 类型命令使用
    • mset 和 mget 命令
    • getrange 和 setrange 命令
    • append 命令
    • incr 和 decr 命令
  • list 类型命令使用
    • lpush 和 lrange 命令
    • lpop 和 rpop
    • llen
  • hash 类型命令使用
    • hset 和 hget 命令
    • hexists 命令
    • hdel 命令
    • hkeys 和 hvals 命令
    • hmget 和 hmset 命令
  • set 类型命令使用
    • sadd 和 smembers
    • sismember
    • scard
    • spop
    • sinter 和 sinterstore
  • zset 类型命令使用
    • zadd 和 zrange 命令
    • zcard 和 zrem 命令
    • zscore 和 zrank命令

开放端口号问题

使用 Java 开发代码时,使用的时 IDEA,这个软件是在 Windows 系统上运行的,而我们的 Redis 是在 Linux云服务器上的,如下图:

在这里插入图片描述

此时,要想通过我们开发的Redis客户端访问 Linux 云服务器,就要通过”外网ip“进行访问,而且,光修改外网IP还是不够的,因为 Redis 所使用的 6379 端口,默认是被云服务器的防火墙给保护起来了 ,如果要想访问,就需要公开这个端口号,但是注意,这个防火墙最好不要放开,因为,Redis 的端口一旦公开到公网上,就特别容易被入侵,所以,在不开放 Redis 端口号的前提下,又想要跨主机访问,就有以下两种方式:

① 直接让 Java 程序,也在linux上运行,但是这就需要把咱们写好的代码打成可执行的 jar 包,然后把 jar 包部署到 Linux 系统上执行。

② 配置 ssh 端口转发,把云服务的 Redis 端口,映射到本地主机(推荐),这种方案,就可以保证我们既能通过外网访问,又不会产生危险。

我们在 window 系统上,连接 Linux 服务器,都是通过一些终端远程登录到 Linux 服务器上的,例如:xshell ,而在登录时或者是操作Linux服务器时,会用到协议 ssh,通过这个协议/程序,就可以使两台主机进行远程访问。

ssh 协议默认是 22 端口,ssh 协议的功能是非常强大的,其中有一个功能就是能够支持端口转发,相当于通过 ssh 的 22 端口,来传递其他端口的数据

例如,本来我们想要通过 Windows 主机访问云服务器的 6379 端口,于是就构造了一个特殊的 ssh 数据报,把要访问 redis 的请求,放到 ssh 数据报中,通过 22 端口发送给服务器,服务器的 ssh 服务器程序,就能够解析出上述的数据报,然后再把数据报中的数据,交给 6379端口的程序。这个 ssh 就相当于中介。

而在 Linux 主机上,存在的服务器有很多,ssh 程序也可能需要给多个端口传递数据,所以,为了能够区分出给不同的端口传递数据 ,就可以在本地定义一个新的端口号,用来与linux主机上某个端口号产生映射关系,如下图:

在这里插入图片描述

通过上述的方式,此时在我们的Java客户端代码上,访问 127.0.0.1:8888 ,就相当于访问 Linux 主机上的 6379 端口了,这个 8888 端口就是 ssh 程序监听的端口。

具体操作如下:

在这里插入图片描述

在这里插入图片描述

引入依赖

进入maven仓库查找jedis依赖

在这里插入图片描述

<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>4.4.6</version>
</dependency>

验证连接

① 连接 Redis 服务器

        //1. 连接 RedisJedisPool jedisPool = new JedisPool("tcp://127.0.0.1:8888");

url中,tcp 表示 reids 在网络通信过程中,使用的是 tcp 协议,并且此处的 url 如果没有使用端口号映射的话,就需要将端口号写成 redis 监听的端口号 6379

② 从连接池中取出一个连接,发送一个 ping 命令,检查 redis 服务器是否在正常运作

        //2. 从 redis 池中取出一个连接try(Jedis resource1 = jedisPool.getResource()) {String ping = jedis.ping();System.out.println(ping);}

在这里插入图片描述

Redis ping 命令用于客户端向 Redis 服务器发送一个 PING ,如果服务器运作正常的话,会返回一个 PONG 。 PING 命令不带参数返回 PONG 。 带参数则返回参数 message 。 PING 通常用来测试连接是否存活,或者测试延迟。

在这里插入图片描述

注意:这里的代码之所以能够跑通,除了配置 ssh 端口映射外,还有一个要点就是 要配置绑定的 ip 及 关闭保护模式,在 redis 的配置文件中进行设置,如下图:

  1. 找到 redis 的配置文件 redis.conf

在这里插入图片描述

  1. 编辑配置文件

    在这里插入图片描述

在新安装的 redis 中,默认绑定的 ip 是 127.0.0.1,此时只能本机访问本机,不能跨主机访问,所以需要进行修改,并且,保护模式默认是 yes,也要改成 no

通用命令使用

下面,我们演示一些 redis 命令在代码中的使用,这里的命令演示,只会演示一部分命令,其他的命令也都是一样的用法。

set 和 get 命令的使用

代码:

public class JedisDemo {public static void main(String[] args) {//1. 连接 RedisJedisPool jedisPool = new JedisPool("tcp://127.0.0.1:8888");//2. 从 redis 池中取出一个连接try(Jedis jedis = jedisPool.getResource()) {test1(jedis);}}private static void test1(Jedis jedis) {//在进行测试之前,先清空redis数据库,防止残留上一组测试的数据jedis.flushAll();//使用 set 和 get 命令System.out.println("测试 get 和 set 命令");jedis.set("k1", "111");String value = jedis.get("k1");System.out.println("value:" + value);}
}

在这里插入图片描述

set 命令除了上述的基本使用外,还可以配置一些选项,如:设置key的过期时间,设置 nx / xx ,代码如下:

    private static void test1(Jedis jedis) {//在进行测试之前,先清空redis数据库,防止残留上一组测试的数据jedis.flushAll();//使用 set 和 get 命令System.out.println("测试 get 和 set 命令");SetParams params = new SetParams();//设置过期时间params.ex(10);jedis.set("k1", "111");String value = jedis.get("k1");System.out.println("value:" + value);}

在调用 set 方法时,可以看到多个重载方法,其中就有包含 SetParams 类型的参数,通过该类型对象来进行 选项的设置

在这里插入图片描述
在这里插入图片描述

exists 和 del 命令的使用

代码:

    private static void test2(Jedis jedis) {System.out.println("演示 exists 和 del 命令");jedis.set("key1", "111");//检查 key1 是否存在boolean result = jedis.exists("key1");System.out.println("result:" + result);//删除 key1long result2 = jedis.del("key1");System.out.println("result2:" + result2);//再次检查 key1 是否存在System.out.println(jedis.exists("key1"));}

在这里插入图片描述

del 命令不仅可以删除一个 key ,也可以删除多个 key

    private static void test2(Jedis jedis) {System.out.println("演示 exists 和 del 命令");jedis.set("key1", "111");jedis.set("key2","222");jedis.set("key3","333");//删除 key1 key2 key3long result2 = jedis.del("key1", "key2", "key3");System.out.println("result2:" + result2);}

在这里插入图片描述

keys 命令的使用

代码:

    private static void test3(Jedis jedis) {System.out.println("演示 keys 命令");jedis.set("key1", "111");jedis.set("key2", "222");jedis.set("key3", "333");jedis.set("kay", "555");jedis.set("kby", "666");//keys 里面的参数就是通配符,按照keys命令的规则获取指定样式的keySet<String> set = jedis.keys("*");System.out.println(set.toString());set = jedis.keys("k[ab]y");System.out.println(set.toString());}

在这里插入图片描述

expire 和 ttl 命令

代码:

    private static  void test4(Jedis jedis) throws InterruptedException {System.out.println("演示 expire 和 ttl 命令");jedis.flushAll();jedis.set("key1", "111");jedis.expire("key1", 10);Thread.sleep(3000);long time = jedis.ttl("key1");System.out.println("time:" + time);}

在这里插入图片描述

type 命令的使用

代码:

    private static void test5(Jedis jedis) {System.out.println("演示 type 命令");jedis.flushAll();jedis.set("key1", "111");String type = jedis.type("key1");System.out.println("type: " + type);//设置list类型jedis.lpush("key2", "111", "222");type = jedis.type("key2");System.out.println("type: " + type);//设置hash类型jedis.hset("key3", "k1", "1");type = jedis.type("key3");System.out.println("type: " + type);}

在这里插入图片描述

String 类型命令使用

mset 和 mget 命令

代码:

    private static void test6(Jedis jedis) {System.out.println("mset 和 mget 命令的使用");jedis.mset("key1","111", "key2", "222", "key3","333");List<String> values = jedis.mget("key1", "key2", "key3");System.out.println("values: " + values.toString());}

在这里插入图片描述

注意:此处的获取多个key中的value的顺序和设置key时的顺序都是匹配的,如果某个key不存在,则使用 null 表示。

getrange 和 setrange 命令

代码:

    private static void test7(Jedis jedis) {System.out.println("getrange 和 setrange");jedis.set("key1", "abcdefgh");String result = jedis.getrange("key1", 0, 3);System.out.println("result: " + result);jedis.setrange("key1", 0, "qqq");result = jedis.getrange("key1", 0, -1);System.out.println("result: " + result);}

在这里插入图片描述

append 命令

代码:

    private static void test8(Jedis jedis) {System.out.println("append 命令");jedis.flushAll();jedis.set("key1", "abc");String result = jedis.get("key1");System.out.println("result: " + result);jedis.append("key1", "111");result = jedis.get("key1");System.out.println("result: " + result);}

在这里插入图片描述

incr 和 decr 命令

代码:

    private static void test9(Jedis jedis) {System.out.println("incr 和 decr 命令");jedis.flushAll();jedis.set("key1", "100");jedis.incr("key1");String value = jedis.get("key1");System.out.println("value: " + value);jedis.decr("key1");value = jedis.get("key1");System.out.println("value: " + value);}

在这里插入图片描述

list 类型命令使用

lpush 和 lrange 命令

代码:

    private static void test10(Jedis jedis) {System.out.println("lpush 和 rpush");jedis.flushAll();jedis.lpush("key1", "111", "222", "333");List<String> reslut = jedis.lrange("key1", 0, -1);System.out.println("result: " + reslut);jedis.rpush("key2", "111", "222", "333");reslut = jedis.lrange("key2", 0, -1);System.out.println("result: " + reslut);}

在这里插入图片描述

lpop 和 rpop

代码:

    private static void test11(Jedis jedis) {System.out.println("lpop 和 rpop");jedis.flushAll();jedis.lpush("key1", "111", "222", "333");jedis.lpop("key1");List<String> result = jedis.lrange("key1", 0, -1);System.out.println("result: " + result);jedis.rpop("key1");result = jedis.lrange("key1", 0, -1);System.out.println("result: " + result);}

在这里插入图片描述

llen

代码:

    private static void test12(Jedis jedis) {System.out.println("llen 命令");jedis.flushAll();jedis.lpush("key1", "111", "222", "333");long key1 = jedis.llen("key1");System.out.println("key1: " + key1);a}

在这里插入图片描述

hash 类型命令使用

hset 和 hget 命令

代码:

    private static void test18(Jedis jedis) {System.out.println("hset 和 hget");jedis.flushAll();//插入元素jedis.hset("key", "f1", "111");jedis.hset("key", "f2", "222");jedis.hset("key", "f3", "333");//获取元素String f1 = jedis.hget("key", "f1");String f2 = jedis.hget("key", "f2");System.out.println("f1: " + f1);System.out.println("f2: " + f2);}

在这里插入图片描述

hexists 命令

代码:

    private static void test19(Jedis jedis) {System.out.println("hexists 命令");jedis.flushAll();//插入元素jedis.hset("key", "f1", "111");jedis.hset("key", "f2", "222");jedis.hset("key", "f3", "333");//检查 f1 字段是否存在boolean f1 = jedis.hexists("key", "f1");System.out.println("f1: " + f1);}

在这里插入图片描述

hdel 命令

代码:

    private static void test20(Jedis jedis) {System.out.println("hdel 命令");jedis.flushAll();//插入元素jedis.hset("key", "f1", "111");jedis.hset("key", "f2", "222");jedis.hset("key", "f3", "333");//删除字段long result = jedis.hdel("key", "f1", "f2");System.out.println("成功删除: " + result);System.out.println("是否存在: " + jedis.hexists("key", "f1"));}

在这里插入图片描述

hkeys 和 hvals 命令

代码:

    private static void test21(Jedis jedis) {System.out.println("hkeys 和 hvals 命令");jedis.flushAll();//插入元素jedis.hset("key", "f1", "111");jedis.hset("key", "f2", "222");jedis.hset("key", "f3", "333");//获取所有的字段Set<String> fields = jedis.hkeys("key");System.out.println("fields: " + fields);//获取所有字段对应的valueList<String> values = jedis.hvals("key");System.out.println("values: " + values);}

在这里插入图片描述

hmget 和 hmset 命令

    private static void test22(Jedis jedis) {System.out.println("hmset 和 hmget 命令");jedis.flushAll();Map<String, String> map = new HashMap<>();map.put("f1", "111");map.put("f2", "222");map.put("f3", "333");jedis.hmset("key", map);//获取指定字段对应的valueList<String> result = jedis.hmget("key", "f1", "f2", "f3");System.out.println("result: " + result);}

在这里插入图片描述

set 类型命令使用

sadd 和 smembers

代码:

    private static void test13(Jedis jedis) {System.out.println("sadd 和 smemgbers 命令");jedis.flushAll();//插入元素jedis.sadd("key1", "111", "222", "333");//获取set中所有元素Set<String> result = jedis.smembers("key1");System.out.println("result: " + result);}

在这里插入图片描述

sismember

代码:

    private static void test16(Jedis jedis) {System.out.println("sismembers 命令");jedis.flushAll();jedis.sadd("key1", "111", "222", "333", "444", "555");//检查 333 在列表中是否存在boolean result = jedis.sismember("key1", "333");System.out.println("reslut: " + result);}

scard

代码:

    private static void test14(Jedis jedis) {System.out.println("scard 命令");jedis.flushAll();jedis.sadd("key1", "111", "222");//获取列表中的长度long result = jedis.scard("key1");System.out.println("result: " + result);}

在这里插入图片描述

spop

代码:

    private static void test15(Jedis jedis) {System.out.println("spop 命令");jedis.flushAll();jedis.sadd("key1", "111", "222", "333", "444", "555");//随机删除String result1 = jedis.spop("key1");System.out.println("result1: " + result1) ;String result2 = jedis.spop("key1");System.out.println("result2: " + result2);String result3 = jedis.spop("key1");System.out.println("result3: " + result3);}

在这里插入图片描述

sinter 和 sinterstore

代码:

    private static void test17(Jedis jedis) {System.out.println("sinter 和 sinterstore 命令");jedis.flushAll();jedis.sadd("key1", "111", "222", "333");jedis.sadd("key2", "111", "222", "444");//求交集Set<String> result = jedis.sinter("key1", "key2");System.out.println("result: " + result);//求完交集后,存放到key3中jedis.sinterstore("key3", "key1", "key2");Set<String> resultOfkey3 = jedis.smembers("key3");System.out.println("reslultOfKey3: " + resultOfkey3);}

在这里插入图片描述

zset 类型命令使用

zadd 和 zrange 命令

代码:

private static void test23(Jedis jedis) {System.out.println("zadd 和 zrange 命令");jedis.flushAll();//添加元素jedis.zadd("key", 10, "张三");//添加多个元素//添加多个元素时,要先把多个元素放到Map中,并且,在Map中存放分数时,类型必须是double类型Map<String, Double> map = new HashMap<>();map.put("李四", 20.0);map.put("王五", 30.0);jedis.zadd("key", map);//获取有序列表中的元素List<String> result = jedis.zrange("key", 0, -1);System.out.println("result: " + result);//获取有序列表中的元素+分数List<Tuple> result2 = jedis.zrangeWithScores("key", 0, -1);System.out.println("result2: " + result2);//获取某一个指定的成员和分数String member = result2.get(0).getElement();double score = result2.get(0).getScore();System.out.println("member: " + member + ",score: " + score);}

在这里插入图片描述

zcard 和 zrem 命令

代码:

    private static void test24(Jedis jedis) {System.out.println("zadd 和 zrange 命令");jedis.flushAll();//添加多个元素//添加多个元素时,要先把多个元素放到Map中,并且,在Map中存放分数时,类型必须是double类型Map<String, Double> map = new HashMap<>();map.put("张三", 10.0);map.put("李四", 20.0);map.put("王五", 30.0);jedis.zadd("key", map);//获取元素个数long members = jedis.zcard("key");System.out.println("members: " + members);//删除元素long n = jedis.zrem("key", "张三", "李四");System.out.println("n: " + n);List<String> result = jedis.zrange("key", 0, -1);System.out.println("result: " + result);}

在这里插入图片描述

zscore 和 zrank命令

 private static void test25(Jedis jedis) {System.out.println("ascore 和 zrank 命令");jedis.flushAll();//添加多个元素//添加多个元素时,要先把多个元素放到Map中,并且,在Map中存放分数时,类型必须是double类型Map<String, Double> map = new HashMap<>();map.put("张三", 10.0);map.put("李四", 20.0);map.put("王五", 30.0);jedis.zadd("key", map);//根据member获取分数Double zscore = jedis.zscore("key", "张三");System.out.println("zscore: " + zscore);//获取当前指定member的排名Long zrank = jedis.zrank("key", "张三");System.out.println("zrank: " + zrank);}

在这里插入图片描述

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

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

相关文章

[极客大挑战 2019]FinalSQL

用异或来注入 注入语句为1是error&#xff0c;为0时为check ?id1^(length(database())5)写盲注脚本 这道题有点坑&#xff0c;首先是表名有两个&#xff0c;一个特别想flag&#xff0c;还有一个就是需要多线程&#xff0c;但是由于是python的&#xff0c;也没有那么必要等一…

CinemachineBrain的属性简介

CinemachineBrain的属性简介 CinemachineBrain是Unity Cinemachine的核心组件&#xff0c;它和Camera组件挂载在一起&#xff0c;监控场景中所有的virtual camera。CinemachineBrain在inspector中暴露的属性如下&#xff1a; Live Camera和Live Blend分别表示当前active的virtu…

51单片机嵌入式开发:9、 STC89C52RC 操作LCD1602技巧

STC89C52RC 操作LCD1602技巧 1 代码工程2 LCD1602使用2.1 LCD1602字库2.2 巧妙使用sprintf2.3 光标显示2.4 写固定长度的字符2.5 所以引入固定长度写入方式&#xff1a; 3 LCD1602操作总结 1 代码工程 承接上文&#xff0c;在原有工程基础上&#xff0c;新建关于lcd1602的c和h…

k8s NetworkPolicy

Namespace 隔离 默认情况下&#xff0c;所有 Pod 之间是全通的。每个 Namespace 可以配置独立的网络策略&#xff0c;来 隔离 Pod 之间的流量。 v1.7 版本通过创建匹配所有 Pod 的 Network Policy 来作为默认的网络策略 默认拒绝所有 Pod 之间 Ingress 通信 apiVersion: …

【线程安全】关于死锁问题

文章目录 死锁的基本概念死锁的四个必要条件避免死锁避免死锁的算法死锁检测算法 死锁的基本概念 死锁是指在一组进程中的各个进程均占有不会释放的资源&#xff0c;但因互相申请被其他进程所站用不会释放的资源而处于的一种永久等待状态。当然&#xff0c;线程之间同样也有死…

OpenCV中使用Canny算法在图像中查找边缘

操作系统&#xff1a;ubuntu22.04OpenCV版本&#xff1a;OpenCV4.9IDE:Visual Studio Code编程语言&#xff1a;C11 算法描述 Canny算法是一种广泛应用于计算机视觉和图像处理领域中的边缘检测算法。它由John F. Canny在1986年提出&#xff0c;旨在寻找给定噪声条件下的最佳边…

部署大语言模型并对话

随着人工智能技术的飞速发展&#xff0c;大语言模型&#xff08;Large Language Models, LLMs&#xff09;因其强大的语言理解和生成能力而备受关注。OpenWebUI &#xff0c;原名 Ollama WebUI &#xff0c;是一款专为大语言模型&#xff08;LLM&#xff09;设计的先进 Web 交互…

Facebook的未来蓝图:从元宇宙到虚拟现实的跨越

随着科技的不断演进和社会的数字化转型&#xff0c;虚拟现实&#xff08;VR&#xff09;和增强现实&#xff08;AR&#xff09;作为下一代计算平台正逐渐走进人们的视野。作为全球领先的科技公司之一&#xff0c;Facebook正在积极探索并推动这一领域的发展&#xff0c;以实现其…

【Superset】dashboard 自定义URL

URL设置 在发布仪表盘&#xff08;dashboard&#xff09;后&#xff0c;可以通过修改看板属性中的SLUG等&#xff0c;生成url 举例&#xff1a; http://localhost:8090/superset/dashboard/test/ 参数设置 以下 URL 参数可用于修改仪表板的呈现方式&#xff1a;此处参考了官…

论文翻译 | LEAST-TO-MOST: 从最少到最多的提示使大型语言模型中的复杂推理成为可能

摘要 思维链提示&#xff08;Chain-of-thought prompting&#xff09;在多种自然语言推理任务上展现了卓越的性能。然而&#xff0c;在需要解决的问题比提示中展示的示例更难的任务上&#xff0c;它的表现往往不佳。为了克服从简单到困难的泛化挑战&#xff0c;我们提出了一种新…

请你谈谈:BeanDefinition类作为Spring Bean的建模对象,与BeanFactoryPostProcessor之间的羁绊

那么&#xff0c;我们如何理解Spring Bean的建模对象呢&#xff1f;简而言之&#xff0c;它是指用于描述和配置Bean实例化过程的模型对象。有人可能会提出疑问&#xff0c;既然只需要Class&#xff08;类&#xff09;就可以实例化一个对象&#xff0c;Class作为类的元数据&…

电气工程VR虚拟仿真实训平台以趣味化方式增强吸引力

在工业4.0时代和教育信息化的双重推动下&#xff0c;我们致力于推动实训课件的跨界合作与共创。VR实训课件不仅促进了不同领域、不同行业之间的紧密合作&#xff0c;更让学习变得生动直观。我们凭借3D技术生动、直观、形象的特点&#xff0c;开发了大量配套3D教材&#xff0c;让…

CSS 【实用教程】(2024最新版)

CSS 简介 CSS 是层叠样式表( Cascading Style Sheets ) 的简写&#xff0c;用于精确控制 HTML 页面的样式&#xff0c;以便更好地展示图文信息或产生炫酷/友好的交互体验。 没有必要让所有浏览器都显示得一模一样的&#xff0c;好的浏览器有更好的显示&#xff0c;糟糕的浏览器…

C\C++ 终端输出带有颜色的字符

终端显示带有颜色的字符 终端显示带有颜色的字符 终端显示带有颜色的字符背景&#xff1a;测试机器&#xff0c;win10系统&#xff0c; VS2022编写字体设置不同的颜色背景色光标移动 &#xff08;这个用的估计不是很多&#xff09;字体设置动态显示C cout 也可以测试代码准确的…

【C++】继承(二)

目录 5、继承与友元 6、继承与静态成员 7、复杂的菱形继承和菱形虚拟继承 8、继承的总结与反思 5、继承与友元 友元关系不能继承&#xff0c;也就是说父类的友元不能访问子类的私有或保护的成员 class Student; class Person { public:friend void Display(const Person&a…

.net C# 使用网易163邮箱搭建smtp服务,实现发送邮件功能

功能描述&#xff1a;使用邮箱验证实现用户注册激活和找回密码。邮箱选择网易163作为smtp服务器。 真实测试情况&#xff1a;第一种&#xff1a;大部分服务器运行商的25端口默认是封禁的&#xff0c;可以联系运营商进行25端口解封&#xff0c;解封之后可以使用25端口。第二种&…

【Pytorch】Conda环境下载慢换源/删源/恢复默认源

文章目录 背景临时换源永久换源打开conda配置condarc换源执行配置 命令行修改源添加源查看源 删源恢复默认源使用示范 背景 随着实验增多&#xff0c;需要分割创建环境的情况时有出现&#xff0c;在此情况下使用conda create --name xx python3.10 pytorch torchvision pytorc…

文件读写操作之c语言、c++、windows、MFC、Qt

目录 一、前言 二、c语言文件读写 1.写文件 2.读文件 三、c文件读写 1.写文件 2.读文件 四、windows api文件读写 1.写文件 2.读文件 五、MFC文件读写 1.写文件 2.读文件 六、Qt文件读写 1.写文件 2.读文件 七、总结 一、前言 我们在学习过程中&#xff0c…

OpenCV解决验证码(数字和字母)识别(Python)

文章目录 前言一、准备验证码图片 前言 OpenCV是一个基于Apache2.0许可&#xff08;开源&#xff09;发行的跨平台计算机视觉和机器学习软件库。它支持Windows、Linux、Mac OS、Android和iOS等多个操作系统&#xff0c;提供了丰富的图像处理和计算机视觉功能&#xff0c;包括但…

链路追踪系列-01.mac m1 安装zipkin

下载地址&#xff1a;https://hub.docker.com/r/openzipkin/zipkin jelexjelexxudeMacBook-Pro zipkin-server % pwd /Users/jelex/Documents/work/zipkin-server 先启动Es: 可能需要先删除 /Users/jelex/dockerV/es/plugins 目录下的.DS_Store 当端口占用时再次启动&#x…