<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[thorandloki的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/thorandloki</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; thorandloki]]></copyright><item><title><![CDATA[【DL】我们的深度学习之旅：时尚商品分类项目实战记录]]></title><link>https://blog.youkuaiyun.com/thorandloki/article/details/151288640</link><guid>https://blog.youkuaiyun.com/thorandloki/article/details/151288640</guid><author>thorandloki</author><pubDate>Sun, 07 Sep 2025 15:19:10 +0800</pubDate><description><![CDATA[在这个快节奏的电商时代，我和我的团队决定挑战一个既有趣又有实际意义的问题：如何让机器"看懂"时尚商品？经过几个月的努力，我们完成了这个基于深度学习的时尚商品分类项目，现在想和大家分享我们的整个开发历程。这个时尚商品分类项目不仅让我们掌握了深度学习的核心技术，更重要的是培养了我们的科研思维和团队协作能力。从最初的想法到最终的实现，我们经历了无数次的讨论、实验、失败和改进。]]></description><category></category></item><item><title><![CDATA[【Mysql】事务的实现原理]]></title><link>https://blog.youkuaiyun.com/thorandloki/article/details/145120570</link><guid>https://blog.youkuaiyun.com/thorandloki/article/details/145120570</guid><author>thorandloki</author><pubDate>Mon, 13 Jan 2025 17:43:10 +0800</pubDate><description><![CDATA[如果trxId==创建事务id，说明数据是这个事务更改的，如果trx预分配id，则不可以访问，因为这个事务是在readview创建后提交的，如果在min和max之间且属于活跃id，也不可以访问。1.当前活跃的事务ids，2.最小活跃事务Id，3.预分配事务id，4.创建这个readview的事务id。看一下undolog版本链，undolog记录了同一个事务和不同事务的修改信息，生成一条链表，链表头部是最新数据，尾部是最旧数据。rowId是没有主键时自动生成的。]]></description><category></category></item><item><title><![CDATA[【JUC】wait/notify]]></title><link>https://blog.youkuaiyun.com/thorandloki/article/details/144903594</link><guid>https://blog.youkuaiyun.com/thorandloki/article/details/144903594</guid><author>thorandloki</author><pubDate>Fri, 03 Jan 2025 22:23:04 +0800</pubDate><description><![CDATA[当owner里的线程长时间占用cpu，但是它不满足解锁的条件，于是可以调用wait()方法，于是进入waitset，状态也调整为waiting。而entrylist里blocked的线程就从此刻被唤醒，竞争owner。我之前写过sychronized的原理，讲到了monitor里的owner和entrylist。当owner里的线程调用notify()的时候，waitset里waiting的线程被唤醒，进入entrylist重新竞争。一个是在waitset中随机挑一个唤醒，一个是在waitset全部唤醒。]]></description><category></category></item><item><title><![CDATA[【JUC】synchronized]]></title><link>https://blog.youkuaiyun.com/thorandloki/article/details/144312973</link><guid>https://blog.youkuaiyun.com/thorandloki/article/details/144312973</guid><author>thorandloki</author><pubDate>Mon, 16 Dec 2024 16:18:52 +0800</pubDate><description><![CDATA[等到thread1运行结束，和monitor的owner断开关联，于是monitor的entrylist中的线程被唤醒开始竞争，竞争成功的线程成为monitor的owner。当thread1调用sychronized给对象加锁，该对象头的markword就会指向monitor对象（java对象关联上monitor对象），markword的锁状态由01变成10，并且monitor的owner变成thread1。a锁的是静态方法即整个类，而b锁的是this，所以锁的不是同一个对象，不存在互斥。]]></description><category></category></item><item><title><![CDATA[【黑马RabbitMQ】MQ高级]]></title><link>https://blog.youkuaiyun.com/thorandloki/article/details/144292500</link><guid>https://blog.youkuaiyun.com/thorandloki/article/details/144292500</guid><author>thorandloki</author><pubDate>Mon, 09 Dec 2024 15:31:08 +0800</pubDate><description><![CDATA[比如用户下单后订单状态改变对可靠性有要求。（不能下单后订单状态不变）所以要保证发送的消息至少消费一次。消息可能丢失的地方：发送的过程、MQ处理、消费者接受消息的过程。因此我们要解决这三个地方的可靠性问题。]]></description><category></category></item><item><title><![CDATA[【黑马RabbitMQ】MQ基础]]></title><link>https://blog.youkuaiyun.com/thorandloki/article/details/144242908</link><guid>https://blog.youkuaiyun.com/thorandloki/article/details/144242908</guid><author>thorandloki</author><pubDate>Thu, 05 Dec 2024 19:52:13 +0800</pubDate><description><![CDATA[MQ提供接受消息、存储消息、发送消息的功能。]]></description><category></category></item><item><title><![CDATA[【Easy云盘】Day3 视频切割、文件预览]]></title><link>https://blog.youkuaiyun.com/thorandloki/article/details/144195793</link><guid>https://blog.youkuaiyun.com/thorandloki/article/details/144195793</guid><author>thorandloki</author><pubDate>Tue, 03 Dec 2024 19:29:33 +0800</pubDate><description><![CDATA[利用ffmpeg切割视频，先将视频转成ts格式，再将ts文件切割成多个ts文件，再生成m3u8索引文件（用于描述切片序列和播放顺序）。切割的好处：流式播放，实现边看边加载。最后将一开始转成的ts文件删除。第一次根据视频文件名称拼接出获取m3u8文件。之后跟据m3u8按序读取ts文件。缩略图的原理就是将图片的尺寸调小以及压缩图片。依旧使用FFmpeg的命令实现。根据图片后缀生成对应的 Content-Type，以便浏览器正确显示图片。使用 readFile 方法将图片数据从服务器传输到客户端。]]></description><category></category></item><item><title><![CDATA[【Easy云盘】Day2 文件秒传、分片上传、异步合并]]></title><link>https://blog.youkuaiyun.com/thorandloki/article/details/144139645</link><guid>https://blog.youkuaiyun.com/thorandloki/article/details/144139645</guid><author>thorandloki</author><pubDate>Mon, 02 Dec 2024 18:49:40 +0800</pubDate><description><![CDATA[session存储的用户信息，fileId（传第一个分片的时候没有，由代码生成，传其它分片的时候使用），file，filename，fileMd5（验证文件使用），chunkIndex（第几个分片），chunks（分片数）新建fileinfo文件表（用户id，文件id，文件类型（文件或文件夹），父级id，文件md5，文件大小，名称，路径，文件种类，状态（上传中，上传失败，已上传），删除标记（未被删除，在回收站中，彻底删除），回收时间）更新头像：判断头像文件夹是否存在，不存在就创建，然后新建头像文件。]]></description><category></category></item><item><title><![CDATA[【Easy云盘】Day1 生成验证码、邮箱发送验证码、用AOP实现拦截器和参数校验]]></title><link>https://blog.youkuaiyun.com/thorandloki/article/details/144117089</link><guid>https://blog.youkuaiyun.com/thorandloki/article/details/144117089</guid><author>thorandloki</author><pubDate>Fri, 29 Nov 2024 16:07:17 +0800</pubDate><description><![CDATA[登陆上传文件（断点续传、大文件的分片上传、秒传、文件预览）文件分级、文件删除、文件下载、文件移动、回收站还原分享文件（被分享到的文件可以保存到自己的网盘，如果是自己分享的文件就不需要，可以取消分享）管理员：用户管理（分配空间）]]></description><category></category></item><item><title><![CDATA[【Spring注解】@Retention]]></title><link>https://blog.youkuaiyun.com/thorandloki/article/details/144135962</link><guid>https://blog.youkuaiyun.com/thorandloki/article/details/144135962</guid><author>thorandloki</author><pubDate>Fri, 29 Nov 2024 14:39:27 +0800</pubDate><description><![CDATA[是 Java 中的元注解，用于指定注解的保留策略。它定义了注解在编译后的生命周期，以及可以通过何种方式访问它。]]></description><category></category></item><item><title><![CDATA[【苍穹外卖】总结--业务逻辑+技术要点]]></title><link>https://blog.youkuaiyun.com/thorandloki/article/details/144093646</link><guid>https://blog.youkuaiyun.com/thorandloki/article/details/144093646</guid><author>thorandloki</author><pubDate>Thu, 28 Nov 2024 16:14:30 +0800</pubDate><description><![CDATA[先简单挑重点写一点，后面有空补充。]]></description><category></category></item><item><title><![CDATA[【BUG记录】redis一直连接不到服务器]]></title><link>https://blog.youkuaiyun.com/thorandloki/article/details/144089973</link><guid>https://blog.youkuaiyun.com/thorandloki/article/details/144089973</guid><author>thorandloki</author><pubDate>Wed, 27 Nov 2024 17:15:43 +0800</pubDate><description><![CDATA[买了服务器，准备连一下redis，但是每次都是连到本地的redis服务器上。redis没有放在spring底下。修改成下面这样就可以了。]]></description><category></category></item><item><title><![CDATA[如何在CentOS中安装MinIO]]></title><link>https://blog.youkuaiyun.com/thorandloki/article/details/144065586</link><guid>https://blog.youkuaiyun.com/thorandloki/article/details/144065586</guid><author>thorandloki</author><pubDate>Tue, 26 Nov 2024 19:30:18 +0800</pubDate><description><![CDATA[配置 MinIO 为后台服务（systemd）加载 systemd 并启动服务。移到系统路径，方便全局使用。]]></description><category></category></item><item><title><![CDATA[【苍穹外卖】Day01-03 用户登陆、Swagger、ThreadLocal、公共字段自动填充、OSS]]></title><link>https://blog.youkuaiyun.com/thorandloki/article/details/143979028</link><guid>https://blog.youkuaiyun.com/thorandloki/article/details/143979028</guid><author>thorandloki</author><pubDate>Mon, 25 Nov 2024 19:33:55 +0800</pubDate><description><![CDATA[当项目上线后可能有多个后端服务器，这个时候利用nginx作为负载均衡器，将前端请求合理分发给不同的后端服务器。根据用户名查询数据库的用户信息，如果不存在，抛出异常，如果存在，进行密码比对，查看是否被锁定。利用Nginx反向代理，前端将请求发送给Nginx，Nginx再发送给后端tomcat服务器。Nginx可以缓存后端的数据，在第二次发送同一个请求时，无需再次访问后端。每个请求是一个线程，每个线程有自己的存储空间，即ThreadLocal。保证后端服务安全，后端服务器放在公司内网，前端无法直接请求后端。]]></description><category></category></item><item><title><![CDATA[【JUC】Day1线程基础]]></title><link>https://blog.youkuaiyun.com/thorandloki/article/details/143917562</link><guid>https://blog.youkuaiyun.com/thorandloki/article/details/143917562</guid><author>thorandloki</author><pubDate>Thu, 21 Nov 2024 17:09:20 +0800</pubDate><description><![CDATA[同时线程里是指令流，将一条条指令交给CPU，各个线程处理不同的任务。一个类去实现这个runnable接口，重写run方法，再将这个类作为参数传入thread的构造器，创建thread实例后start。在单核CPU下，如果有两个任务A、B，并发的情况是CPU先处理一部分A，再处理一部分B，反复交替。对于依赖性任务，如果任务之间存在强依赖性（例如需要等待前一个任务的结果），并行化可能导致资源浪费。在多核CPU下，可以实现真正的并行。并行是多个CPU同时运行，并发是多个线程使用一个CPU。]]></description><category></category></item><item><title><![CDATA[【安卓开发】-学习]]></title><link>https://blog.youkuaiyun.com/thorandloki/article/details/136803655</link><guid>https://blog.youkuaiyun.com/thorandloki/article/details/136803655</guid><author>thorandloki</author><pubDate>Fri, 25 Oct 2024 19:23:51 +0800</pubDate><description><![CDATA[怎么接收广播，broadcastreceiver，onreceive。]]></description><category></category></item><item><title><![CDATA[【redis】原子性的实现--lua脚本]]></title><link>https://blog.youkuaiyun.com/thorandloki/article/details/143240895</link><guid>https://blog.youkuaiyun.com/thorandloki/article/details/143240895</guid><author>thorandloki</author><pubDate>Fri, 25 Oct 2024 19:20:41 +0800</pubDate><description><![CDATA[Lua 脚本可以将多条 Redis 命令写在一个脚本中。Redis 会将这个脚本作为一个整体执行，确保脚本内的所有命令是原子操作。脚本会检查 Redis 中的键是否等于传入的值，如果相等，则删除该键。]]></description><category></category></item><item><title><![CDATA[【秒杀】超卖和一人一单的问题]]></title><link>https://blog.youkuaiyun.com/thorandloki/article/details/143236016</link><guid>https://blog.youkuaiyun.com/thorandloki/article/details/143236016</guid><author>thorandloki</author><pubDate>Fri, 25 Oct 2024 16:25:27 +0800</pubDate><description><![CDATA[在高并发情况下，由于查询库存和减库存之间存在时间差异，导致查询的数据不是真正的数据，导致的问题。在修改数据的同时查询数据：如果查询到的数据和之前查询到的数据一致，库存减1，新增订单。但是会产生问题，多个线程同时查询的数据都是已经被修改的数据，所以大量线程会执行失败。和超卖不同，一人一单是插入不存在的数据而不是修改数据，因此不适用于乐观锁。在扣减库存之前判断当前用户是否已存在当前订单。仍然会出现并发问题。因此需要修改策略：判断库存是否大于0。使用悲观锁解决并发问题。]]></description><category></category></item><item><title><![CDATA[【无标题】]]></title><link>https://blog.youkuaiyun.com/thorandloki/article/details/125488403</link><guid>https://blog.youkuaiyun.com/thorandloki/article/details/125488403</guid><author>thorandloki</author><pubDate>Mon, 27 Jun 2022 17:33:30 +0800</pubDate><description><![CDATA[bug记录]]></description><category></category></item><item><title><![CDATA[＜c++＞pat乙级 1014 福尔摩斯的约会]]></title><link>https://blog.youkuaiyun.com/thorandloki/article/details/121664702</link><guid>https://blog.youkuaiyun.com/thorandloki/article/details/121664702</guid><author>thorandloki</author><pubDate>Wed, 01 Dec 2021 21:02:57 +0800</pubDate><description><![CDATA[大侦探福尔摩斯接到一张奇怪的字条：
我们约会吧！
3485djDkxh4hhGE
2984akDfkkkkggEdsb
s&amp;hgsfdk
d&amp;Hyscvnm
大侦探很快就明白了，字条上奇怪的乱码实际上就是约会的时间星期四 14:04，因为前面两字符串中第 1 对相同的大写英文字母（大小写有区分）是第 4 个字母 D，代表星期四；第 2 对相同的字符是 E ，那是第 5 个英文字母，代表一天里的第 14 个钟头（于是一天的 0 点到 23 点由数字 0 到 9、以及大写字母 A 到 N 表示）]]></description><category></category></item></channel></rss>