<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[qq_45016922的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/qq_45016922</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; qq_45016922]]></copyright><item><title><![CDATA[黑马点评笔记(5)--好友关注]]></title><link>https://blog.youkuaiyun.com/qq_45016922/article/details/166143300</link><guid>https://blog.youkuaiyun.com/qq_45016922/article/details/166143300</guid><author>qq_45016922</author><pubDate>Mon, 21 Sep 2026 00:39:07 +0800</pubDate><description><![CDATA[Service层：FollowServiceImpl类下的followCommons()方法，利用redis的set数据结构的交集功能，获取两个用户的id，然后以两个id为key，查询对应的set的交集。Service层：在BlogServiceImpl类下实现saveBlog()方法，先获取登录用户，并保存探店笔记，保存成功后，使用mybatis-plus查询笔记作者的所有粉丝，并推送笔记id给所有粉丝，在redis中保存的形式是每个用户id对应一个收件箱，保存他关注的所有用户发送的blog的id。]]></description><category></category></item><item><title><![CDATA[黑马点评笔记(4)--达人探店]]></title><link>https://blog.youkuaiyun.com/qq_45016922/article/details/165352999</link><guid>https://blog.youkuaiyun.com/qq_45016922/article/details/165352999</guid><author>qq_45016922</author><pubDate>Mon, 14 Sep 2026 19:38:48 +0800</pubDate><description><![CDATA[我们使用当前用户id去redis中查询，如果查询到了就说明已经点过赞。]]></description><category></category></item><item><title><![CDATA[黑马点评笔记(3)--优惠券秒杀]]></title><link>https://blog.youkuaiyun.com/qq_45016922/article/details/165003742</link><guid>https://blog.youkuaiyun.com/qq_45016922/article/details/165003742</guid><author>qq_45016922</author><pubDate>Fri, 11 Sep 2026 17:35:08 +0800</pubDate><description><![CDATA[本文实现基于Redis的全局唯一ID生成器，结合时间戳与序列号，通过Redis自增保证唯一性与高性能。针对优惠券秒杀场景，采用乐观锁（CAS）防超卖，并通过分布式锁（Redis + Lua脚本）解决一人一单的并发安全问题。最终优化秒杀流程：利用Redis原子判断库存与用户限制，成功后异步将订单入阻塞队列或使用Stream消息队列实现解耦下单，提升系统吞吐量与响应速度，有效应对高并发挑战。]]></description><category></category></item><item><title><![CDATA[黑马点评笔记(2)--商户查询缓存]]></title><link>https://blog.youkuaiyun.com/qq_45016922/article/details/164413302</link><guid>https://blog.youkuaiyun.com/qq_45016922/article/details/164413302</guid><author>qq_45016922</author><pubDate>Sun, 06 Sep 2026 03:50:31 +0800</pubDate><description><![CDATA[方法3：queryWithPassThrough()方法，利用缓存空值的方式解决缓存穿透问题，这里用到了泛型，泛型在方法中使用要先声明，即前面的<R,ID>,第三个参数Class<R> Type传进来的是一个实体类对应的class类，即Shop.class等，第四个参数Function<ID, R> dbFallback传入的是一个函数，ID是参数类型，R是返回值类型，在第四步根据id查询数据库中用到，使用apply()方法调用这个传进来的函数。锁释放的动作就是将这个lock在redis中删除。]]></description><category></category></item><item><title><![CDATA[黑马点评笔记(1)--短信登录]]></title><link>https://blog.youkuaiyun.com/qq_45016922/article/details/164341877</link><guid>https://blog.youkuaiyun.com/qq_45016922/article/details/164341877</guid><author>qq_45016922</author><pubDate>Fri, 04 Sep 2026 00:36:25 +0800</pubDate><description><![CDATA[由于之前的校验登录状态是基于cookie的session id来获取用户信息，现在不用session了，就需要基于token从redis中获取信息，此时需要服务端将用户保存时生成的token返回给客户端，这样客户端才能携带token从Redis中获取用户信息。：之前的拦截器只拦截需要登录的路径，对不需要登录的路径比如网站首页是不会拦截的，此时如果用户只在这些页面进行浏览，则token有效期不会刷新，则会出现用户还在活跃，却退出登录的情况。刷新token有效期仅对登录的用户生效。]]></description><category></category></item><item><title><![CDATA[JavaWeb--MyBatis]]></title><link>https://blog.youkuaiyun.com/qq_45016922/article/details/164336317</link><guid>https://blog.youkuaiyun.com/qq_45016922/article/details/164336317</guid><author>qq_45016922</author><pubDate>Thu, 03 Sep 2026 16:48:50 +0800</pubDate><description><![CDATA[比如下面，只用where的话，当第一个判断为false，就不会拼接第一段sql，而是直接从第二段开始，最前面有一个and，sql语句识别不出来，此时就可以将where替换为<where>，就可以解决这个问题。注意：resultType需要的类型是单条记录所封装的类型，如果mapper中返回的是一个list，则resultType要设置为List中的数据类型。传入的参数Emp是一个实体类，里面的属性要和数据库的emp表的字段一一对应，占位符中写的是Emp的属性名。]]></description><category></category></item><item><title><![CDATA[Java基础--Redis基础]]></title><link>https://blog.youkuaiyun.com/qq_45016922/article/details/164297431</link><guid>https://blog.youkuaiyun.com/qq_45016922/article/details/164297431</guid><author>qq_45016922</author><pubDate>Wed, 02 Sep 2026 14:48:06 +0800</pubDate><description><![CDATA[为了节省内存空间，我们并不会使用JSON序列化器来处理value，而是统一使用String序列化器，要求只能存储String类型的key和value。为了在反序列化时知道对象的类型，JSON序列化器会将类的class类型写入JSON结果中，存入Redis，会带来额外的内存开销。：Jedis本身是线程不安全的，并且频繁的创建和销毁连接会有性能损耗，因此推荐使用Jedis连接池代替Jedis的直连方式。Redis key的结构：Redis的key允许有多个单。完成对象的序列化和反序列化。]]></description><category></category></item><item><title><![CDATA[JavaWeb--请求响应]]></title><link>https://blog.youkuaiyun.com/qq_45016922/article/details/164267077</link><guid>https://blog.youkuaiyun.com/qq_45016922/article/details/164267077</guid><author>qq_45016922</author><pubDate>Tue, 01 Sep 2026 19:29:51 +0800</pubDate><description><![CDATA[JSON数据键名与形参对象属性名相同，定义POJO类型形参即可接收参数，需要使用@RequestBody注解。：通过请求URL直接传递参数，使用{...}来标识该路径参数，需要使用@PathVariable获取路径参数。：请求参数名与形参集合名称相同且请求参数为多个，用@RequestParam绑定参数关系。：请求参数名与形参数组名称相同且请求参数为多个，定义数组类型形参即可接收参数。：简单参数：参数名与形参变量名相同，定义形参即可接收参数。：请求参数名与形参对象属性名相同，定义POJO接受即可。]]></description><category></category></item><item><title><![CDATA[Java基础--函数式编程(lambda)]]></title><link>https://blog.youkuaiyun.com/qq_45016922/article/details/164163047</link><guid>https://blog.youkuaiyun.com/qq_45016922/article/details/164163047</guid><author>qq_45016922</author><pubDate>Sat, 29 Aug 2026 06:55:25 +0800</pubDate><description><![CDATA[如果某个lambda表达式里只是调用一个特定类型的实例方法，并且前面参数列表中的第一个参数是作为方法的主调，后面的所有参数都是作为该实例方法的入参的，则此时就可以使用特定类型的方法引用。如果某个lambda表达式里只是通过对象名称调用一个实例方法，并且->前后参数的形式一致，就可以使用实例方法引用。如果某个lambda表达式里只是调用一个静态方法，并且->前后参数的形式一致，就可以使用静态方法引用。注意：lambda表达式并不是可以简化全部的匿名内部类，lambda只能替代函数式接口的匿名内部类。]]></description><category></category></item><item><title><![CDATA[Java基础--抽象类和接口]]></title><link>https://blog.youkuaiyun.com/qq_45016922/article/details/164163045</link><guid>https://blog.youkuaiyun.com/qq_45016922/article/details/164163045</guid><author>qq_45016922</author><pubDate>Sat, 29 Aug 2026 06:54:44 +0800</pubDate><description><![CDATA[2.一个接口继承多个接口，如果多个接口中存在方法签名冲突（方法名和参数列表完全一样，返回值不一样），则此时不支持多继承，也不支持多实现。私有方法（jdk9开始支持）：用private关键字修饰，在接口内定义实体函数，要用接口内其他的实体方法来调用，不能在接口外调用。3.一个类继承了父类，又同时实现了接口，如果父类中和接口中有同名的默认方法，实现器会优先用父类的。4.一个类实现了多个接口，如果多个接口中存在同名的默认方法，可以不冲突，这个类重写该方法即可。]]></description><category></category></item><item><title><![CDATA[黑马苍穹外卖笔记day12]]></title><link>https://blog.youkuaiyun.com/qq_45016922/article/details/164133163</link><guid>https://blog.youkuaiyun.com/qq_45016922/article/details/164133163</guid><author>qq_45016922</author><pubDate>Fri, 28 Aug 2026 04:06:48 +0800</pubDate><description><![CDATA[Service层：ReportService接口的ReportServiceImpl实现类下的exportBusinessData()方法，在前面导入的工具台代码的workspaceService类中，可以通过传入时间来获取最近30天的运营数据，获取到数据后，需要利用反射动态获取类加载器，加载模板文件，并包装成一个InputStream，并基于这个模板文件创建一个新的Excel文件，并在下面的详细数据中，通过遍历Date来获取到每天的销售数据；一般情况下，POI都是用于操作Excel文件。]]></description><category></category></item><item><title><![CDATA[黑马苍穹外卖笔记day11]]></title><link>https://blog.youkuaiyun.com/qq_45016922/article/details/164107770</link><guid>https://blog.youkuaiyun.com/qq_45016922/article/details/164107770</guid><author>qq_45016922</author><pubDate>Thu, 27 Aug 2026 06:01:48 +0800</pubDate><description><![CDATA[Service层：在ReportService的实现类ReportServiceImpl下的getUserStatistics()方法，建立三个列表，分别为日期，总用户数和新增用户数，然后遍历从begin到end的每一天，使用userMapper中定义的方法查询每天的用户总量和新用户数，并存到列表中，最后将列表转换成字符串并封装到UserReportVO类中返回。Apache Echarts是一款基于Javascript的数据可视化图表库，提供直观，生动，可交互，可个性化定制的数据可视化图表。]]></description><category></category></item><item><title><![CDATA[黑马苍穹外卖笔记day10]]></title><link>https://blog.youkuaiyun.com/qq_45016922/article/details/164006035</link><guid>https://blog.youkuaiyun.com/qq_45016922/article/details/164006035</guid><author>qq_45016922</author><pubDate>Mon, 24 Aug 2026 02:23:06 +0800</pubDate><description><![CDATA[原视频：将WebSocketServer注入到OrderServiceImpl类中，并在支付成功paySuccess()方法里调用WebSocketServer里面的sendToAllClient()方法来向前端发送信息，由于sendToAllClient()方法的形参是字符串，则需要将需要传递的信息封装为JSON字符串来进行传递。L代表最后一天，用于月和周字段，其中周字段中使用L还可以指定每月的最后一个星期几，比如1L就是最后一个星期一。每个域的含义分别为：秒，分钟，小时，日，月，周，年(可选)]]></description><category></category></item><item><title><![CDATA[黑马苍穹外卖笔记day9]]></title><link>https://blog.youkuaiyun.com/qq_45016922/article/details/163982662</link><guid>https://blog.youkuaiyun.com/qq_45016922/article/details/163982662</guid><author>qq_45016922</author><pubDate>Sun, 23 Aug 2026 00:29:12 +0800</pubDate><description><![CDATA[Service层：OrderService的实现类OrderServiceImpl下的confirmOrder()方法，使用订单id和订单状态new一个Order对象，用这个对象去调用orderMapper接口的update()方法，达成改变订单状态的效果。Service层：OrderService的实现类OrderServiceImpl下的cancelOrder()方法，跟拒绝订单的区别就是不用判断订单状态，但是需要判断付款状态，如果已付款则调用微信退款接口进行退款，最后更新订单状态。]]></description><category></category></item><item><title><![CDATA[黑马苍穹外卖笔记day8]]></title><link>https://blog.youkuaiyun.com/qq_45016922/article/details/163950535</link><guid>https://blog.youkuaiyun.com/qq_45016922/article/details/163950535</guid><author>qq_45016922</author><pubDate>Fri, 21 Aug 2026 17:00:27 +0800</pubDate><description><![CDATA[Service层：OrderService接口的OrderServiceImpl实现类，定义submitOrder()方法，首先需要根据用户id查询到购物车数据和地址簿数据，然后根据查询到的数据向订单表插入一个订单，并根据当前用户的购物车和订单号向订单详细表插入多条订单详细数据，最后清空用户购物车并返回VO。Mapper层：两个接口，一个OrderMapper，一个OrderDetailMapper，分别连接订单表order和订单详情表order_detail，实现插入订单数据和批量插入订单详细数据。]]></description><category></category></item><item><title><![CDATA[黑马苍穹外卖笔记day7]]></title><link>https://blog.youkuaiyun.com/qq_45016922/article/details/163821079</link><guid>https://blog.youkuaiyun.com/qq_45016922/article/details/163821079</guid><author>qq_45016922</author><pubDate>Mon, 17 Aug 2026 12:26:31 +0800</pubDate><description><![CDATA[Service层：ShoppingCartService接口的实现类ShoppingCartServiceImpl中的addShoppingCart()方法，如果加入购物车中的商品已经存在，则使用更新方法更新购物车；注意：当在方法上加入了@Cacheable缓存注解时，本质是为这个Bean生成了一个代理对象，在请求这个方法之前先进入他的代理对象，然后在代理对象中通过key查询redis，如果在redis中查询到了数据，则直接返回，不进入方法，只有在redis中不存在数据时，才进入方法。]]></description><category></category></item><item><title><![CDATA[黑马苍穹外卖笔记day6]]></title><link>https://blog.youkuaiyun.com/qq_45016922/article/details/163768111</link><guid>https://blog.youkuaiyun.com/qq_45016922/article/details/163768111</guid><author>qq_45016922</author><pubDate>Sat, 15 Aug 2026 03:37:36 +0800</pubDate><description><![CDATA[增加UserController，UserService和UserServiceImpl三个类，首先在UserController类中调用UserService中的wxLogin()方法，获取登录后的用户对象user，为这个用户生成令牌，并返回UserLoginVO对象。wxml中怎么调用javaScript文件中的方法：使用bindtap等属性，属性设为js中的方法名，就可以调用。：可以提供高效的，最新的，功能丰富的支持HTTP协议的客户端编程工具包，并且支持HTTP协议最新的版本和建议。]]></description><category></category></item><item><title><![CDATA[黑马苍穹外卖笔记day5]]></title><link>https://blog.youkuaiyun.com/qq_45016922/article/details/163678497</link><guid>https://blog.youkuaiyun.com/qq_45016922/article/details/163678497</guid><author>qq_45016922</author><pubDate>Wed, 12 Aug 2026 02:16:43 +0800</pubDate><description><![CDATA[然而，由于Bean使用的是单例模式，两个不同软件包下的同名类会报错，这时候就要改变Bean的唯一标识，也就是名称，可以在RestController这个注释中进行更改：RestController("userShopController")和RestController("adminShopController")需要使用Redis时，先自动注入redisTemplate，然后使用下面的方法来获取Redis中存储的数据。通用命令操作方法：直接使用redisTemplate.方法来调用。]]></description><category></category></item><item><title><![CDATA[黑马苍穹外卖笔记day4]]></title><link>https://blog.youkuaiyun.com/qq_45016922/article/details/163642315</link><guid>https://blog.youkuaiyun.com/qq_45016922/article/details/163642315</guid><author>qq_45016922</author><pubDate>Mon, 10 Aug 2026 17:29:24 +0800</pubDate><description><![CDATA[第四天实现套餐管理的所有接口1.新增套餐业务规则：接口设计：根据分类id查询菜品：controller层在DishController类中编写一个方法list()，返回一个Result<List<Dish>>在Service层的DishServiceImpl类中，将categoryId和状态包装成一个dish对象，然后传入Mapper层，用这个dish对象来进行查询在mapper层的DishMapper.xml文件中，使用Mybatis来进行查询注意：mybatis中where标签的语句要加and（不用加逗]]></description><category></category></item><item><title><![CDATA[黑马苍穹外卖笔记day3]]></title><link>https://blog.youkuaiyun.com/qq_45016922/article/details/163642300</link><guid>https://blog.youkuaiyun.com/qq_45016922/article/details/163642300</guid><author>qq_45016922</author><pubDate>Mon, 10 Aug 2026 17:28:25 +0800</pubDate><description><![CDATA[另外，由于每个菜品口味都需要有一个对应的菜品id，而前端不会在DishFlavor中传这个参数，所以需要在Dish的属性中找到菜品id，赋值给DishFlavor的对应对象，然后才能正确插入。由于一个菜品可能有多种口味，在新增一个菜品时可能会向菜品口味表插入多条数据，因此需要使用mybatis中的批量插入语句，将一个list中的所有元素插入到菜品口味表中。最后，通过反射调用object的对应set方法，进行公共字段的赋值。可以通过注解来实现，当注解的方案实现了对应的操作类型时，就对对应的公共字段进行填充。]]></description><category></category></item></channel></rss>