Redisson(三)应用场景及demo
一、基本的存储与查询
分布式环境下,为了方便多个进程之间的数据共享,可以使用RedissonClient的分布式集合类型,如List、Set、SortedSet等。
1、demo
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.8.RELEASE</version><relativePath/></parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--<dependency>--><!--<groupId>org.redisson</groupId>--><!--<artifactId>redisson-spring-boot-starter</artifactId>--><!--<version>3.23.5</version>--><!--</dependency>--><dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.15.0</version></dependency></dependencies>
server.port = 7777
server.servlet.context-path=/redission#1、单机模式
#Redis url should start with redis:// or rediss:// (for SSL connection)
#my.redisson.address = redis://127.0.0.1:6379
#my.redisson.password = wtyy#2、哨兵模式
my.redisson.sentinel.schema=
my.redisson.sentinel.address = redis://xxx.xx.xxx1:19601,redis://xxx.xx.xxx2:19601,redis://xxx.xx.xxx3:19601
my.redisson.sentinel.password = N5WAXX4z9qw
my.redisson.sentinel.master = master-test
my.redisson.sentinel.database = 10
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class RedissionConfig {@Value("${my.redisson.sentinel.address}")private String address;@Value("${my.redisson.sentinel.password}")private String password;@Value("${my.redisson.sentinel.master}")private String master;@Value("${my.redisson.sentinel.database}")private Integer dataBase;@Value("${my.redisson.sentinel.schema}")private String schema;/*** 所有对Redisson的使用都是通过RedissonClient对象*/@Bean(destroyMethod = "shutdown")public RedissonClient redissonClient(){Config config = new Config();config.useSentinelServers().setScanInterval(2000) // cluster state scan interval in milliseconds.addSentinelAddress(address.split(",")).setCheckSentinelsList(false).setMasterName(master).setPassword(password).setDatabase(dataBase);RedissonClient redissonClient = Redisson.create(config);return redissonClient;}
}
@Autowiredprivate RedissonClient redissonClient;@RequestMapping("/setStr")public void setStr(String key,String value){redissonClient.getBucket(key).set(value);}@RequestMapping("/getStr")public String getStr(String key){return (String) redissonClient.getBucket(key).get();}
测试:
访问localhost:7777/redission/setStr?key=userName&value=李四
查看redis存储情况
访问localhost:7777/redission/getStr?key=userName 输出:李四
二、分布式锁
1、背景
关于jedis锁的几个痛点:(1)锁先于业务过期(2)主从节点不一致;
Redisson都很好的解决了。
2、特点
高效的分布式锁设计应该包含以下几个要点:
(1)互斥:
在分布式高并发的条件下,我们最需要保证,同一时刻只能有一个线程获得锁,这是最基本的一点
(2)防止死锁:
在分布式高并发的条件下,比如有个线程获得锁的同时,还没有来得及去释放锁,就因为系统故障或者其它原因使它无法执行释放锁的命令,导致其它线程都无法获得锁,造成死锁。所以分布式非常有必要设置锁的有效时间
,确保系统出现故障后,在一定时间内能够主动去释放锁,避免造成死锁的情况。
(3)性能:
对于访问量大的共享资源,需要考虑减少锁等待的时间,避免导致大量线程阻塞。所以在锁的设计时,需要考虑两点:
① 锁的颗粒度要尽量小
。比如你要通过锁来减库存,那这个锁的名称你可以设置成是商品的ID,而不是任取名称。这样这个锁只对当前商品有效,锁的颗粒度小。
② 锁的范围尽量要小
。比如只要锁2行代码就可以解决问题的,就不要去锁10行代码了。
(4)重入:
ReentrantLock是可重入锁,它的特点是:同一个线程可以重复拿到同一个资源的锁。重入锁非常有利于资源的高效利用。
3、原理
Redisson并没有通过setNx命令来实现加锁,而是基于 Redis+ 看⻔狗机制,自己实现了一套分布式锁逻辑。
(1)加锁机制:
当一个线程想要获取锁时,它会先尝试通过`getLock()`方法获取锁。如果获取成功,它将执行Lua脚本(保证这段复杂业务逻辑执行的原子性)并保存数据到Redis数据库。如果获取失败,一直通过while循环尝试获取锁,直到获取成功后,执行lua脚本,保存数据到redis数据库
如果多个线程同时尝试获取同一个锁,Redisson会将这些请求放入队列中,然后按照FIFO(先进先出)的方式逐个处理它们。如果有一个线程已经获得了锁并且没有释放,那么其他线程将会等待,直到这个线程释放锁。
(2)Watch Dog自动延期机制:
如果一个线程获得了锁但没有立即使用,而是发生了故障或超出了锁的使用期限,Redisson的Watch Dog机制会在一定时间内自动释放锁。用户可以设置锁的有效时间,如果不设置,默认的时间是30秒。
之前使用jedis加锁,提到过业务逻辑耗时较长锁已经过期了这种情况,所以redission加入了看门狗机制。它的作用就是 线程1 业务还没有执行完,时间就过了,线程1 还想持有锁的话,就会启动一个watch dog后台线程,不断的延长锁key的生存时间。
注意
正常这个看门狗线程是不启动的,还有就是这个看门狗启动后对整体性能也会有一定影响,所以不建议开启看门狗。
(3)锁的互斥机制:
Redisson确保同一时刻只有一个线程拥有锁。当一个线程获取到锁后,它会将自己的信息保存在Redis中,以证明它是锁的所有者。当另一个线程试图获取相同的锁时,它会检查Redis中是否存在这条记录。如果存在,说明有其他线程已经拥有了锁,因此当前线程会被阻止继续执行。
(4)锁的释放机制:
当线程完成了所有的资源操作后,它应该及时释放锁。这可以通过发送一个`release()`命令来实现,Redisson会删除锁记录,从而允许其他线程重新获取锁。
综上所述,Redisson的分布式锁机制结合了Lua脚本的执行和Redis的操作,以及Watch Dog自动延期的功能,确保了锁的互斥性和释放的及时性。
(5)可重入:
它最大的优点就是相同线程不需要在等待锁,而是可以直接进行相应操作
4、使用方法
RLock lock = redisson.getLock("lock");
lock.lock();
try {// 处理业务逻辑
} finally {lock.unlock();
}
升级写法:判断加锁是否成功
RLock lock = redissonClient.getLock(你的key);try {if (lock.tryLock()) {//你的业务逻辑} else {ResponseWrapper.error("冲突提示语");}} catch (Exception e) {log.error("异常");} finally {lock.unlock();}
5、demo
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service("productService")
public class ProductServiceImpl implements ProductService {
private static final Logger logger = LoggerFactory.getLogger(ProductServiceImpl.class);@Autowiredprivate RedissonClient redissonClient;int productTotal = 5;@Overridepublic void buy(String productId) {//模拟数据库查询if(productTotal > 0){logger.info(Thread.currentThread().getName()+"买到了一件");productTotal --;}logger.info("库存:"+productTotal);}@Overridepublic void lockBuy(String productId) {RLock lock = redissonClient.getLock(productId);lock.lock();try{//模拟数据库查询if(productTotal > 0){logger.info(Thread.currentThread().getName()+"买到了一件");productTotal --;}logger.info("库存:"+productTotal);}finally {lock.unlock();}}
}
测试未加锁并发情况:
public class ProductTest implements Runnable{public static void main(String[] args) {ProductTest productTest = new ProductTest();for(int i=0;i<50;i++){Thread thread = new Thread(productTest);thread.start();}}@Overridepublic void run() {String url = "http://localhost:7777/redission/buy";String productId = "abcd";String param = "productId="+productId;HttpRequestUtil.sendGet(url, param);}
}
随机测试,20个并发量的情况下,出现负数,最大为 -4(如下图);并发量50时出现 -12。
而测试lockBuy接口,无论并发量为多少,都不会出现负数。打印50并发数的某一个结果:
2024-01-28 15:00:43.979 INFO 142656 --- [nio-7777-exec-6] com.demo.service.ProductServiceImpl : http-nio-7777-exec-6买到了一件
2024-01-28 15:00:43.980 INFO 142656 --- [nio-7777-exec-6] com.demo.service.ProductServiceImpl : 库存:4
2024-01-28 15:00:44.010 INFO 142656 --- [io-7777-exec-42] com.demo.service.ProductServiceImpl : http-nio-7777-exec-42买到了一件
2024-01-28 15:00:44.013 INFO 142656 --- [io-7777-exec-42] com.demo.service.ProductServiceImpl : 库存:3
2024-01-28 15:00:44.050 INFO 142656 --- [io-7777-exec-22] com.demo.service.ProductServiceImpl : http-nio-7777-exec-22买到了一件
2024-01-28 15:00:44.050 INFO 142656 --- [io-7777-exec-22] com.demo.service.ProductServiceImpl : 库存:2
2024-01-28 15:00:44.077 INFO 142656 --- [nio-7777-exec-5] com.demo.service.ProductServiceImpl : http-nio-7777-exec-5买到了一件
2024-01-28 15:00:44.077 INFO 142656 --- [nio-7777-exec-5] com.demo.service.ProductServiceImpl : 库存:1
2024-01-28 15:00:44.103 INFO 142656 --- [io-7777-exec-30] com.demo.service.ProductServiceImpl : http-nio-7777-exec-30买到了一件
2024-01-28 15:00:44.103 INFO 142656 --- [io-7777-exec-30] com.demo.service.ProductServiceImpl : 库存:0
2024-01-28 15:00:44.121 INFO 142656 --- [io-7777-exec-14] com.demo.service.ProductServiceImpl : 库存:0
2024-01-28 15:00:44.129 INFO 142656 --- [io-7777-exec-46] com.demo.service.ProductServiceImpl : 库存:0
2024-01-28 15:00:44.138 INFO 142656 --- [io-7777-exec-11] com.demo.service.ProductServiceImpl : 库存:0
2024-01-28 15:00:44.146 INFO 142656 --- [nio-7777-exec-7] com.demo.service.ProductServiceImpl : 库存:0
2024-01-28 15:00:44.160 INFO 142656 --- [io-7777-exec-37] com.demo.service.ProductServiceImpl : 库存:0
2024-01-28 15:00:44.173 INFO 142656 --- [io-7777-exec-19] com.demo.service.ProductServiceImpl : 库存:0
2024-01-28 15:00:44.201 INFO 142656 --- [io-7777-exec-23] com.demo.service.ProductServiceImpl : 库存:0
2024-01-28 15:00:44.222 INFO 142656 --- [nio-7777-exec-8] com.demo.service.ProductServiceImpl : 库存:0
2024-01-28 15:00:44.244 INFO 142656 --- [io-7777-exec-18] com.demo.service.ProductServiceImpl : 库存:0
2024-01-28 15:00:44.277 INFO 142656 --- [io-7777-exec-15] com.demo.service.ProductServiceImpl : 库存:0
2024-01-28 15:00:44.314 INFO 142656 --- [io-7777-exec-41] com.demo.service.ProductServiceImpl : 库存:0
2024-01-28 15:00:44.339 INFO 142656 --- [io-7777-exec-24] com.demo.service.ProductServiceImpl : 库存:0
2024-01-28 15:00:44.365 INFO 142656 --- [io-7777-exec-10] com.demo.service.ProductServiceImpl : 库存:0
2024-01-28 15:00:44.392 INFO 142656 --- [io-7777-exec-21] com.demo.service.ProductServiceImpl : 库存:0
2024-01-28 15:00:44.411 INFO 142656 --- [io-7777-exec-45] com.demo.service.ProductServiceImpl : 库存:0
2024-01-28 15:00:44.431 INFO 142656 --- [io-7777-exec-48] com.demo.service.ProductServiceImpl : 库存:0
2024-01-28 15:00:44.455 INFO 142656 --- [io-7777-exec-13] com.demo.service.ProductServiceImpl : 库存:0
2024-01-28 15:00:44.473 INFO 142656 --- [io-7777-exec-32] com.demo.service.ProductServiceImpl : 库存:0
2024-01-28 15:00:44.502 INFO 142656 --- [nio-7777-exec-3] com.demo.service.ProductServiceImpl : 库存:0
2024-01-28 15:00:44.532 INFO 142656 --- [io-7777-exec-20] com.demo.service.ProductServiceImpl : 库存:0
2024-01-28 15:00:44.553 INFO 142656 --- [io-7777-exec-29] com.demo.service.ProductServiceImpl : 库存:0
2024-01-28 15:00:44.578 INFO 142656 --- [io-7777-exec-28] com.demo.service.ProductServiceImpl : 库存:0
2024-01-28 15:00:44.620 INFO 142656 --- [io-7777-exec-36] com.demo.service.ProductServiceImpl : 库存:0
2024-01-28 15:00:44.642 INFO 142656 --- [io-7777-exec-49] com.demo.service.ProductServiceImpl : 库存:0
2024-01-28 15:00:44.664 INFO 142656 --- [io-7777-exec-17] com.demo.service.ProductServiceImpl : 库存:0
2024-01-28 15:00:44.695 INFO 142656 --- [io-7777-exec-16] com.demo.service.ProductServiceImpl : 库存:0
2024-01-28 15:00:44.711 INFO 142656 --- [io-7777-exec-40] com.demo.service.ProductServiceImpl : 库存:0
2024-01-28 15:00:44.740 INFO 142656 --- [io-7777-exec-12] com.demo.service.ProductServiceImpl : 库存:0
2024-01-28 15:00:44.757 INFO 142656 --- [io-7777-exec-44] com.demo.service.ProductServiceImpl : 库存:0
2024-01-28 15:00:44.772 INFO 142656 --- [nio-7777-exec-2] com.demo.service.ProductServiceImpl : 库存:0
2024-01-28 15:00:44.789 INFO 142656 --- [io-7777-exec-26] com.demo.service.ProductServiceImpl : 库存:0
2024-01-28 15:00:44.814 INFO 142656 --- [io-7777-exec-27] com.demo.service.ProductServiceImpl : 库存:0
2024-01-28 15:00:44.830 INFO 142656 --- [io-7777-exec-50] com.demo.service.ProductServiceImpl : 库存:0
2024-01-28 15:00:44.845 INFO 142656 --- [io-7777-exec-43] com.demo.service.ProductServiceImpl : 库存:0
2024-01-28 15:00:44.863 INFO 142656 --- [io-7777-exec-35] com.demo.service.ProductServiceImpl : 库存:0
2024-01-28 15:00:44.887 INFO 142656 --- [io-7777-exec-47] com.demo.service.ProductServiceImpl : 库存:0
2024-01-28 15:00:44.912 INFO 142656 --- [io-7777-exec-34] com.demo.service.ProductServiceImpl : 库存:0
2024-01-28 15:00:44.937 INFO 142656 --- [nio-7777-exec-4] com.demo.service.ProductServiceImpl : 库存:0
2024-01-28 15:00:44.955 INFO 142656 --- [io-7777-exec-38] com.demo.service.ProductServiceImpl : 库存:0
2024-01-28 15:00:44.977 INFO 142656 --- [nio-7777-exec-9] com.demo.service.ProductServiceImpl : 库存:0
2024-01-28 15:00:45.008 INFO 142656 --- [nio-7777-exec-1] com.demo.service.ProductServiceImpl : 库存:0
2024-01-28 15:00:45.028 INFO 142656 --- [io-7777-exec-39] com.demo.service.ProductServiceImpl : 库存:0
2024-01-28 15:00:45.050 INFO 142656 --- [io-7777-exec-33] com.demo.service.ProductServiceImpl : 库存:0
2024-01-28 15:00:45.483 INFO 142656 --- [io-7777-exec-25] com.demo.service.ProductServiceImpl : 库存:0
2024-01-28 15:00:47.232 INFO 142656 --- [io-7777-exec-31] com.demo.service.ProductServiceImpl : 库存:0
相关文章:

Redisson(三)应用场景及demo
一、基本的存储与查询 分布式环境下,为了方便多个进程之间的数据共享,可以使用RedissonClient的分布式集合类型,如List、Set、SortedSet等。 1、demo <parent><groupId>org.springframework.boot</groupId><artifact…...

考研要求掌握的C语言程度(堆排序)1
含义 堆排序就是把数组的内容在心中建立为大根堆,然后每次循环把根顶和没交换过的根末进行调换,再次建立大根堆的过程 建树的几个公式 一个数组有n个元素 最后一个父亲节点是n/2-1; 假如父亲节点在数组的下标为a 那么左孩子节点在数组下标为2*a1,…...

chronyd配置了local的NTP server之后, NTP报文中出现public IP的问题
描述 客户在Rocky Linux 9.4的VM上配了一个local的NTP server(IP: 10.64.1.76)。 配置完成后, 时钟可以同步,但一段时间后客户的firewall收到告警, 拒绝了大量目标端口为123的请求, 且这些请求的目的IP并不是客户指定的NTP server的IP,客户要求解释原因…...

docker常用命令整理
文章目录 docker 常用操作命令一、镜像类操作1.构建镜像2.从容器创建镜像3.查看镜像列表4.删除镜像5. 从远程镜像仓库拉取镜像6. 将镜像推送到镜像仓库中7. 将镜像导出8. 导入镜像9. 登录镜像仓库 二、容器相关操作1. 运行容器2. 进入容器3. 查看容器的运行状态4. 查看容器的日…...

将CSDN博客转换为PDF的Python Web应用开发--Flask实战
文章目录 项目概述技术栈介绍 项目目录应用结构 功能实现单页博客转换示例: 专栏合集博客转换示例: PDF效果: 代码依赖文件requirements.txt:app.py:代码解释: /api/onepage.py:代码解释: /api/zhuanlan.py…...

AIGC学习笔记(3)——AI大模型开发工程师
文章目录 AI大模型开发工程师002 GPT大模型开发基础1 OpenAI账户注册2 OpenAI官网介绍3 OpenAI GPT费用计算4 OpenAI Key获取与配置5 OpenAI 大模型总览6 代码演示安装依赖导入依赖初始化客户端执行代码遇到的问题 AI大模型开发工程师 002 GPT大模型开发基础 1 OpenAI账户注册…...

Windows server 2003服务器的安装
Windows server 2003服务器的安装 安装前的准备: 1.镜像SN序列号 图1-1 Windows server 2003的安装包非常人性化 2.指定一个安装位置 图1-2 选择好安装位置 3.启动虚拟机打开安装向导 图1-3 打开VMware17安装向导 图1-4 给虚拟光驱插入光盘镜像 图1-5 输入SN并…...

HTML作业
作业 复现下面的图片 复现结果 代码 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><body><form action"#"method"get"enctype"text/plain"><…...

MYSQL-SQL-04-DCL(Data Control Language,数据控制语言)
DCL(数据控制语言) DCL英文全称是Data Control Language(数据控制语言),用来管理数据库用户、控制数据库的访问权限。 一、管理用户 1、查询用户 在MySQL数据库管理系统中,mysql 是一个特殊的系统数据库名称,它并不…...

多线程进阶——线程池的实现
什么是池化技术 池化技术是一种资源管理策略,它通过重复利用已存在的资源来减少资源的消耗,从而提高系统的性能和效率。在计算机编程中,池化技术通常用于管理线程、连接、数据库连接等资源。 我们会将可能使用的资源预先创建好,…...

C++网络编程之C/S模型
C网络编程之C/S模型 引言 在网络编程中,C/S(Client/Server,客户端/服务器)模型是一种最基本且广泛应用的架构模式。这种模型将应用程序分为两个部分:服务器(Server)和客户端(Clien…...

目标检测:YOLOv11(Ultralytics)环境配置,适合0基础纯小白,超详细
目录 1.前言 2. 查看电脑状况 3. 安装所需软件 3.1 Anaconda3安装 3.2 Pycharm安装 4. 安装环境 4.1 安装cuda及cudnn 4.1.1 下载及安装cuda 4.1.2 cudnn安装 4.2 创建虚拟环境 4.3 安装GPU版本 4.3.1 安装pytorch(GPU版) 4.3.2 安装ultral…...

面试域——岗位职责以及工作流程
摘要 介绍互联网岗位的职责以及开发流程。在岗位职责方面,详细阐述了产品经理、前端开发工程师、后端开发工程师、测试工程师、运维工程师等的具体工作内容。产品经理负责需求收集、产品规划等;前端专注界面开发与交互;后端涉及系统架构与业…...

C#文件内容检索的功能
为了构建一个高效的文件内容检索系统,我们需要考虑更多的细节和实现策略。以下是对之前技术方案的扩展,以及一个更详细的C# demo示例,其中包含索引构建、多线程处理和文件监控的简化实现思路。 扩展后的技术方案 索引构建: 使用L…...

Redis-05 Redis发布订阅
Redis 的发布订阅(Pub/Sub)是一种消息通信模式,允许客户端订阅消息频道,以便在发布者向频道发送消息时接收消息。这种模式非常适合实现消息队列、聊天应用、实时通知等功能。 #了解即可,用的很少...

【读书笔记·VLSI电路设计方法解密】问题27:什么是可制造性设计
尽管业界尚未达成共识,但“可制造性设计”这一术语大致描述了旨在提高产品良率的特定分析、预防、纠正和验证工作。这不同于后GDSII阶段的分辨率增强技术,如光学邻近效应校正(OPC)和相位移掩膜(PSM)。“可制造性设计”中的关键词是“设计”,意指在设计阶段(而非设计完成…...

数据结构:堆的应用
堆排序 假定有一组数据极多的数,让我们进行排序,那我们很容易想到一种经典的排序方法,冒泡排序,我们对冒泡排序的时间复杂度进行分析: 显然,冒泡排序的时间复杂度是O(n^2),当数据量…...

Spring Boot 实现文件分片上传和下载
文章目录 一、原理分析1.1 文件分片1.2 断点续传和断点下载1.2 文件分片下载的 HTTP 参数 二、文件上传功能实现2.1 客户端(前端)2.2 服务端 三、文件下载功能实现3.1 客户端(前端)3.2 服务端 四、功能测试4.1 文件上传功能测试4.2 文件下载功能实现 参考资料 完整案例代码&…...

夹逼准则求数列极限(复习总结)
记住这两个准则,然后我们就开始看题目 因为是证明题,所以要放缩到什么值已经是确定的了。也就是放缩到0,然后很明显地可以看出前面已经有一个可以使得极限是0了,并且后面的值明显小于1,就是逐渐缩小的趋势,…...

【python】OpenCV—WaterShed Algorithm(1)
文章目录 1、功能描述2、代码实现3、完整代码4、效果展示5、涉及到的库函数5.1、cv2.pyrMeanShiftFiltering5.2、cv2.morphologyEx5.3、cv2.distanceTransform5.4、cv2.normalize5.5、cv2.watershed 6、参考 1、功能描述 基于分水岭算法对图片进行分割 分水岭分割算法&#x…...

查找与排序-插入排序
思考:在把待排序的元素插入已经有序的子序列中时,是不是一定要逐一比较?有没有改进方法? 在查找插入位置的时候可以采用折半(二分)搜索的办法。 一、折半插入排序 1.折半插入排序算法的基本思想 假设待…...

JAVA基础:多线程 (学习笔记)
多线程 一,什么是线程? 程序:为完成特定任务、用某种语言编写的一组指令的集合,是一段静态的代码进程:程序的一次执行过程。 正在运行的一个程序,进程作为资源分配的单位,在内存中会为每个进程分配不同的…...

盲盒小程序/APP系统,市场发展下的新机遇
当下,年轻人热衷于各种潮玩商品,尤其是一盲盒为主的潮流玩具风靡市场,吸引了众多入局者。随着互联网信息技术的快速发展,各类线上盲盒小程序又进一步推动了盲盒市场的发展,成为年轻人拆盲盒的主要阵地。在盲盒经济中&a…...

Unity3D LayoutGroup组件详解
Unity3D中的LayoutGroup组件是一种强大的工具,用于动态调整UI元素的布局。它主要包括三种类型:Horizontal Layout Group(水平布局组)、Vertical Layout Group(垂直布局组)和Grid Layout Group(网…...

[NeetCode 150] Foreign Dictionary
Foreign Dictionary There is a foreign language which uses the latin alphabet, but the order among letters is not “a”, “b”, “c” … “z” as in English. You receive a list of non-empty strings words from the dictionary, where the words are sorted lex…...

小新学习K8s第一天之K8s基础概念
目录 一、Kubernetes(K8s)概述 1.1、什么是K8s 1.2、K8s的作用 1.3、K8s的功能 二、K8s的特性 2.1、弹性伸缩 2.2、自我修复 2.3、服务发现和负载均衡 2.4、自动发布(默认滚动发布模式)和回滚 2.5、集中化配置管理和密钥…...

如何用终端批量修改一个文件夹里面所有图片的后缀名?
步骤: winr ,然后输入cmd,打开终端 使用cd命令导航到要修改图片后缀名的文件夹。eg.我的该文件夹(C:\dog)下,保存的图片。(cd和文件目录之间要有空格)批量改变后缀名,假如让后缀名全部要从 ".webp&q…...

关于AI网络架构的文章
思科OCP anounce了800G 51.2T G200-based minipack3 switch。对比之前Tesla anounce的TTPoE。真的很好奇,谁是AI-networking的未来,以及思科是否走在正确的路上,以及S1背后的技术。 大致浏览了相关的文章,先mark住,回…...

【ChatGPT】在多轮对话中引导 ChatGPT 保持一致性
在多轮对话中引导 ChatGPT 保持一致性 多轮对话是与 ChatGPT 等对话模型互动时的一大特点,特别是在复杂任务和长时间对话中,保持对话的一致性显得尤为重要。用户往往希望 ChatGPT 能够在上下文中理解先前的对话内容,避免反复重申问题或者给出…...

【Chapter 7】因果推断中的机器学习:从T-学习器到双重稳健估计
随着机器学习技术的发展,数据科学家们开始探索如何将这些先进的方法应用于因果推断问题,尤其是处理异质性效应(Effect Heterogeneity)时。本章将介绍几种基于机器学习的因果推断方法,包括T-学习器、X-学习器和双重稳健…...