<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Enjun97的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/Enjun97</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Enjun97]]></copyright><item><title><![CDATA[通过MySQL窗口函数获取最新未读消息数据]]></title><link>https://blog.youkuaiyun.com/Enjun97/article/details/153734950</link><guid>https://blog.youkuaiyun.com/Enjun97/article/details/153734950</guid><author>Enjun97</author><pubDate>Wed, 22 Oct 2025 15:20:18 +0800</pubDate><description><![CDATA[该SQL查询用于获取按用户和消息类型分组的最新未读消息。首先通过PARTITION BY对notifier_uid和type分组，按id降序排序并标记行号，然后筛选每组(rn=1)的最新消息。在GORM实现中，通过子查询获取原始数据并添加行号，再从结果中筛选每组第一条记录。查询条件包括is_read=0（未读）和deleted_at为NULL（未删除），可选限制特定用户。最终返回各类型的最新未读消息基本信息。]]></description><category></category></item><item><title><![CDATA[Golang Gorm实现自定义多态模型关联查询]]></title><link>https://blog.youkuaiyun.com/Enjun97/article/details/143433948</link><guid>https://blog.youkuaiyun.com/Enjun97/article/details/143433948</guid><author>Enjun97</author><pubDate>Fri, 01 Nov 2024 16:39:03 +0800</pubDate><description><![CDATA[使用Gin+Gorm实现自定义接口形式多态模型关联查询]]></description><category></category></item><item><title><![CDATA[获取每个评论下的回复列表[支持定位指定回复ID](基本思路+Go-Gorm实现示例)]]></title><link>https://blog.youkuaiyun.com/Enjun97/article/details/141897726</link><guid>https://blog.youkuaiyun.com/Enjun97/article/details/141897726</guid><author>Enjun97</author><pubDate>Wed, 04 Sep 2024 17:02:44 +0800</pubDate><description><![CDATA[【代码】 获取每个评论下的回复列表[支持定位指定回复ID](基本思路+Go-Gorm实现示例)]]></description><category></category></item><item><title><![CDATA[golang多个切片合并后按照指定长度进行切割分组]]></title><link>https://blog.youkuaiyun.com/Enjun97/article/details/138847703</link><guid>https://blog.youkuaiyun.com/Enjun97/article/details/138847703</guid><author>Enjun97</author><pubDate>Tue, 14 May 2024 11:37:34 +0800</pubDate><description><![CDATA[【代码】golang多个切片合并后按照指定长度进行切割分组。]]></description><category></category></item><item><title><![CDATA[PHP laravel Redis Scan、Hscan游标查询法]]></title><link>https://blog.youkuaiyun.com/Enjun97/article/details/134674428</link><guid>https://blog.youkuaiyun.com/Enjun97/article/details/134674428</guid><author>Enjun97</author><pubDate>Tue, 28 Nov 2023 19:02:05 +0800</pubDate><description><![CDATA[【代码】PHP laravel Redis Scan、Hscan游标查询法。]]></description><category></category></item><item><title><![CDATA[laravel实现AMQP(rabbitmq)生产者以及消费者]]></title><link>https://blog.youkuaiyun.com/Enjun97/article/details/132478339</link><guid>https://blog.youkuaiyun.com/Enjun97/article/details/132478339</guid><author>Enjun97</author><pubDate>Thu, 24 Aug 2023 17:01:34 +0800</pubDate><description><![CDATA[基于php-amqplib/php-amqplib组件适配laravel框架的amqp封装库支持便捷可配置的队列工作模式在此基础上可支持延迟消息、死信队列等机制。]]></description><category></category></item><item><title><![CDATA[Docker部署php运行环境(php-fpm+nginx)]]></title><link>https://blog.youkuaiyun.com/Enjun97/article/details/132364290</link><guid>https://blog.youkuaiyun.com/Enjun97/article/details/132364290</guid><author>Enjun97</author><pubDate>Fri, 18 Aug 2023 19:09:27 +0800</pubDate><description><![CDATA[如果使用docker去部署一套php的运行环境，我们需要构建出nginx、php-fpm两个容器，nginx通过fast_cgi协议去转发php-fpm中的端口，从而实现web server的搭建，接下来以php的laravel框架为演示例子。]]></description><category></category></item><item><title><![CDATA[redis实现基于令牌桶算法(控制速率)以及固定时间的固定请求次数的请求限流器(golang版)]]></title><link>https://blog.youkuaiyun.com/Enjun97/article/details/129711525</link><guid>https://blog.youkuaiyun.com/Enjun97/article/details/129711525</guid><author>Enjun97</author><pubDate>Wed, 22 Mar 2023 15:50:41 +0800</pubDate><description><![CDATA[具体地，我们可以使用Redis中的有序集合(sorted set)来实现令牌桶算法。首先，我们需要在Redis中设置一个有序集合，将时间戳作为成员(member)，将令牌数作为分值(score)。然后，每次收到一个请求时，就从有序集合中获取当前的令牌数，并将其减1。同时，我们也需要根据一定的规则，定期向有序集合中添加令牌，确保令牌桶中的令牌数不会永久耗尽。Redis可以通过实现一个基于令牌桶算法的限流器来限制HTTP请求的访问速率。令牌桶算法是一种常见的限流算法，它基于一个令牌桶来控制请求的速率。]]></description><category></category></item><item><title><![CDATA[golang kafka Shopify/sarama 消费者重置新增分区偏移量并进行重新消费]]></title><link>https://blog.youkuaiyun.com/Enjun97/article/details/129520077</link><guid>https://blog.youkuaiyun.com/Enjun97/article/details/129520077</guid><author>Enjun97</author><pubDate>Tue, 14 Mar 2023 11:37:39 +0800</pubDate><description><![CDATA[在重平衡回调方法中使用redis的无序集合储存当前主题、当前消费者组下的全部分区信息，然后在根据当前消费者会话去和上一代的全部分区信息进行差集对比，对比的结果就是新增的分区。得到新增的分区后将这些分区的偏移量重置为0即重头开始消费，当前存在重复消费的情况，需要你的业务逻辑上做好幂等性。最后再将这些差集新增分区ID更新至redis存储的当前主题、当前消费者组下的全部分区信息内形成了一个闭环，即使一个消费者组下有多个消费者进程也不会出现数据覆盖更新等问题，因为如果存在差集新增分区只会将更新差集分区ID。]]></description><category></category></item><item><title><![CDATA[分阶段构建golang运行环境Dockerfile镜像]]></title><link>https://blog.youkuaiyun.com/Enjun97/article/details/129195468</link><guid>https://blog.youkuaiyun.com/Enjun97/article/details/129195468</guid><author>Enjun97</author><pubDate>Fri, 24 Feb 2023 11:15:00 +0800</pubDate><description><![CDATA[分阶段构建镜像就会用到scratch这个空镜像，这样的好处是可以大大节约服务器资源，比如用普通的镜像(golang:1.18-alpine)来说，它在构建完之后大约占300MB左右，那么我们通过分阶段构建的话可能只需要20MB左右(与你的程序文件以及系统安装的文件内容有关，总之会比原镜像小很多)，这里我在想scratch既然是个空镜像干净的环境那么它系统加载的内容也会非常少，在一定程度上是不是也存在提升了程序的性能，这里懂的原理的同学可以交流。为什么出现了这么多none的镜像呢？]]></description><category></category></item><item><title><![CDATA[golang rabbitMQ 生产者复用channel以及生产者组分发策略]]></title><link>https://blog.youkuaiyun.com/Enjun97/article/details/128974918</link><guid>https://blog.youkuaiyun.com/Enjun97/article/details/128974918</guid><author>Enjun97</author><pubDate>Fri, 10 Feb 2023 18:44:14 +0800</pubDate><description><![CDATA[项目初始化构建时可以自定义选择生产者开启多个connection，每个connection可以启动多少个channel【都是全局复用的】，因为rabbitMQ所有的命令都是基本都是通过channel去操作完成的，所以这个channel很重要，也是我们想要复用的重点。在网络编程中我们知道tcp连接的创建、交互、销毁等相关操作的"代价"都是很高的，所以就要去实现如何复用这些连接，并要做到高效并可靠。引用的是rabbitMQ官方示例的库。]]></description><category></category></item><item><title><![CDATA[golang优雅退出守护进程、信号处理]]></title><link>https://blog.youkuaiyun.com/Enjun97/article/details/128958805</link><guid>https://blog.youkuaiyun.com/Enjun97/article/details/128958805</guid><author>Enjun97</author><pubDate>Thu, 09 Feb 2023 18:48:59 +0800</pubDate><description><![CDATA[golang优雅退出守护进程、信号处理]]></description><category></category></item><item><title><![CDATA[laravel guzzhttp 记录请求参数、响应参数日志]]></title><link>https://blog.youkuaiyun.com/Enjun97/article/details/128231845</link><guid>https://blog.youkuaiyun.com/Enjun97/article/details/128231845</guid><author>Enjun97</author><pubDate>Thu, 08 Dec 2022 10:30:54 +0800</pubDate><description><![CDATA[在laravel中我们用guzzhttp去请求一些第三方的API时记录相关的日志信息必不可少，日志信息对于查询请求记录或是排查问题都是必需项，这里我就为大家演示一下如何记录日志。]]></description><category></category></item><item><title><![CDATA[golang 切片结构体多条件排序]]></title><link>https://blog.youkuaiyun.com/Enjun97/article/details/127728497</link><guid>https://blog.youkuaiyun.com/Enjun97/article/details/127728497</guid><author>Enjun97</author><pubDate>Mon, 07 Nov 2022 11:56:16 +0800</pubDate><description><![CDATA[日常工作中我们经常会有将数据排序的需求，在golang中无法直接将map数据类型进行排序，所以我们会通过切片+结构体数据类型的方式进行数据字段的排序，从而实现二维数组的排序效果。]]></description><category></category></item><item><title><![CDATA[golang 切片元素去重]]></title><link>https://blog.youkuaiyun.com/Enjun97/article/details/127694309</link><guid>https://blog.youkuaiyun.com/Enjun97/article/details/127694309</guid><author>Enjun97</author><pubDate>Fri, 04 Nov 2022 18:34:37 +0800</pubDate><description><![CDATA[golang 切片元素去重]]></description><category></category></item><item><title><![CDATA[golang 切片分割份数]]></title><link>https://blog.youkuaiyun.com/Enjun97/article/details/127675169</link><guid>https://blog.youkuaiyun.com/Enjun97/article/details/127675169</guid><author>Enjun97</author><pubDate>Thu, 03 Nov 2022 17:47:09 +0800</pubDate><description><![CDATA[本篇主要演示日常工作中可能会遇到一个较大切片，此时需要将该切片分割成若干份数，每份数中可以控制有多少个元素。]]></description><category></category></item><item><title><![CDATA[golang 多协程控制请求API频次/频率 X秒内请求X次]]></title><link>https://blog.youkuaiyun.com/Enjun97/article/details/127669446</link><guid>https://blog.youkuaiyun.com/Enjun97/article/details/127669446</guid><author>Enjun97</author><pubDate>Thu, 03 Nov 2022 14:22:57 +0800</pubDate><description><![CDATA[本篇文章简单演示了一个golang在多协程的情况下如何控制执行频次频率，经典场景就是在我们请求第三方API时，对方的API有接口请求频次限制，X秒内请求X次。]]></description><category></category></item><item><title><![CDATA[Golang获取过去或将来某周某月的开始时间戳和结束时间戳]]></title><link>https://blog.youkuaiyun.com/Enjun97/article/details/127404679</link><guid>https://blog.youkuaiyun.com/Enjun97/article/details/127404679</guid><author>Enjun97</author><pubDate>Wed, 19 Oct 2022 11:30:09 +0800</pubDate><description><![CDATA[开发过程中我们经常需要拿到相对于当前时间过去或将来的某周某月的开始和结束时间戳，下面为大家准备了对应的方法。]]></description><category></category></item><item><title><![CDATA[golang 利用channel收集多协程返回值]]></title><link>https://blog.youkuaiyun.com/Enjun97/article/details/127157550</link><guid>https://blog.youkuaiyun.com/Enjun97/article/details/127157550</guid><author>Enjun97</author><pubDate>Mon, 03 Oct 2022 22:49:01 +0800</pubDate><description><![CDATA[golang 利用channel收集多协程返回值]]></description><category></category></item><item><title><![CDATA[golang 模拟用户分数名次超过总数的百分比算法]]></title><link>https://blog.youkuaiyun.com/Enjun97/article/details/127138782</link><guid>https://blog.youkuaiyun.com/Enjun97/article/details/127138782</guid><author>Enjun97</author><pubDate>Sat, 01 Oct 2022 23:35:41 +0800</pubDate><description><![CDATA[golang 模拟用户分数名次超过总数的百分比算法]]></description><category></category></item></channel></rss>