- 博客(19)
- 收藏
- 关注
原创 力扣-hot100(最长连续序列 - Hash)
那么我可以将数组中的分为 n 个组,毕竟组是相对有序的,比直接在乱七八糟的原数组里直接做要来的方便。一旦断了,那断的那个数你就自己做队长去招募你的队员吧。我们只需要从队长开始不断的报数就可以统计该组的元素数量,然后求每个组的max就行了。第一想法,先预处理一波,可以创建一个数组把存在的数都标记一遍,如:nums = [100,4,200],标记:number[100] = 1, number[4] = 1, number[200] = 1;,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
2025-04-15 16:04:02
379
原创 力扣 - Hot100 (字母异位词分组 - Hash)
题目要求按异位词来分组,也就是只要组成单词的字母完全相同,就可以被称为一个组,他们就应该有同样的唯一性标识可以进入同一个组,也就是要有同样的key。而题目中的成员是String类型,这就很容易了,让每个String排个序,同一组的异位词不就可以等到同样的结果吗。有没有这样一种数据结构可以维护n个不同的组,并且能检测每个想加入的成员的唯一性标识来决定给你分配到哪个组 (不然每个元素都可以加入任意组那我分组的意义在哪?// 加入失败,您加入的组不存在。// 维护n个组,每个组互为字母异位词。
2025-04-14 21:09:03
607
原创 苍穹外卖day04
webSocketServer.sendToAllClient("这是来自服务端的消息:" + DateTimeFormatter.ofPattern("HH:mm:ss").format(LocalDateTime.now()));System.out.println("收到来自客户端:" + sid + "的信息:" + message);System.out.println("客户端:" + sid + "建立连接");System.out.println("连接断开:" + sid);
2025-04-14 20:24:17
528
原创 苍穹外卖day03
用户请求-> 后端服务器 -> 微信官方的服务器 -> 后端服务器(得到响应,老用户就用微信官方返回的结构和查询本地数据库的数据进行对比,新用户就插入数据到本地) -> 响应给用户登录状态。// 设置key序列化方式。业务为基本增删改查,注意的是在做增删改查的时候首先要考虑好本次数据操作涉及哪几个表,理清整条线的逻辑,再进行业务开发。// 订单详情表为补充订单信息,部分数据是从购物车中获取的,所以需要查询购物车数据。// 订单表是主表,部分数据是从地址表中获取的,所以需要先查询地址数据。
2025-04-13 20:39:52
405
原创 苍穹外卖day02
与前面接口相比学到的有:1、引用了第三方工具阿里云OSS进行图片文件缓存;2、同一接口进行多个表查询and维护代码原子性;(数据关性。
2025-04-13 14:38:20
411
原创 力扣-hot100(两数之和 - Hash)
优化,想法:如果这是一个有序的数组那么就,只需要用双指针指向两边逐渐向中间靠拢,则遍历n次就可保证得到。答:这里的核心在于,对于数组中的每个元素 num,需要快速判断数组里是否存在另一个元素 target - num,并且要知道它们各自的索引。:有没有一个结构能将前面遍历过的数都存储起来,往后遍历时只需要用目标值减去当前遍历到的值,然后判断之前是否有存储过这么一个值(有的 兄弟有的)。解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1]。整数,并返回它们的数组下标。
2025-04-13 13:28:50
806
原创 Redis实现签到功能
Bitmap使用Redis数据结构实现完成,如01010 就表示这个月(月分以key的形式存储)第2、4天签到了:SetBit(指定位置存入0|1)、getBit(获取指定位置的bit,下标从0开始)BitCount(统计BitMap中值为1的数量)、Bitpos(第一个0|1出现的位置)Bitfield(获取bit数组,以10进制形式返回)、Bitfield_ro、Bitop、// 签到实现@Override// 1.获取当前登录用户// 2.获取日期。
2025-04-11 19:22:51
480
原创 Redis实现附件店铺
RedisGeoCommands.GeoSearchCommandArgs.newGeoSearchArgs().includeDistance().limit(end) //这里是从第一条到结束,所以要截取需要的数据返回。new Distance(5000),//距离圆心的距离。// 3.查询redis、按照距离排序、分页。// 2.把店铺分组,按照typeId分组,typeId一致的放到一个集合。// 不需要坐标查询,按数据库查询。// 3.2.获取同类型的店铺的集合。// 4.2.获取店铺id。
2025-04-11 19:21:46
657
原创 Redis实现数据推送
就是要实现有数据变动的分页查询,比如说,每次查询3个,刚开始查询到7,6,5后又插进来一个数8,那么按以往的分页查询page = page * page_size = 1 * 3 = 3 确定起始位置,下次查询从第4个开始查询,而新插进来一个数,此时的第四个就是旧数据的第三个。,当张三和李四发了消息后,都会保存在自己的邮箱中,假设赵六要读取信息,那么他会从读取他自己的收件箱,此时系统会从他关注的人群中,把他关注人的信息全部都进行拉取到自己的收件箱,然后在进行排序。时效快,不用临时拉取,数据冗余内存压力大。
2025-04-11 19:20:30
1111
原创 Redis实现点赞功能
ZSET问题:防重复点赞,通过 Redis 判断用户是否已点赞,避免重复操作。数据库和 Redis 协同维护点赞状态,确保前端展示一致性。利用 Redis 的原子操作(如 ZSET)快速处理点赞 / 取消点赞请求,减少数据库压力。基于 Redis 有序集合按时间戳排序,高效获取点赞排行榜。Redis数据结构:Redis 有序集合(ZSET),存储用户 ID 和点赞时间戳,保证唯一性( 天然去重);通过 快速判断用户是否已点赞;使用 获取点赞排行榜(如前 5 名);Redis命令:ZADD key sco
2025-04-11 19:19:11
884
原创 苍穹外卖Day01
使用PageHelper工具类开启分页查询,PageHelper会在执行sql前进行拦截并且拼接分页sql,然后进行查询时返回数据类型为Page<>,这样返回的该对象会包含总记录数、总页数、当前页码、每页记录数等分页信息。点击 “VCS”→“Git”→“Remotes”,点 “+”,“Name” 填 “origin”,“URL” 粘贴 Gitee 复制的地址,测试连接后确认。// 在 autoFillPointCut 所定义的切入点的目标方法执行前执行。// 获取到当前被拦截的方法上的数据库操作类型。
2025-04-11 14:57:46
404
原创 Redis实现消息队列
就是下单之后,利用redis去进行校验下单条件,再通过队列把消息存入消息队列中,然后再启动一个线程去消费这个消息,完成解耦,同时也加快我们的响应速度。使用 LPUSH 写入消息,RPOP/BRPOP 消费消息,实现生产者 - 消费者模型;采用发布订阅模型,支持多生产、多消费、不支持数据持久化、无法避免消息丢失、消息堆积有上限,超出时数据丢失。异步解耦:将下单请求快速写入消息队列,异步处理库存扣减和订单生成,避免阻塞主线程,提升系统响应速度;//为0,把下单信息保存到阻塞队列。// 获取代理对象(事务)
2025-04-05 13:18:45
787
原创 全局唯一ID
通过结合时间戳和序列号,利用 Redis 的原子性操作生成全局唯一 ID,确保在分布式环境下生成的 ID 是唯一的。:INCR icr:product:2025:04:04,INCR命令是 Redis 的原子性操作,它会将指定键的值加 1,如果键不存在,则会先将键的值初始化为 0 再进行加 1 操作。// 64位:1(符号位,永为0)、2-32(时间戳,以秒为单位)、33-64(序列号,秒内的计数器):借助 Redis 的原子性操作 INCR 来生成序列号,确保在分布式环境下序列号的唯一性和原子性。
2025-04-05 13:17:25
608
原创 Redis实现分布式锁
使用这把锁不使用主从,每个节点的地位都是一样的, 这把锁加锁的逻辑需要写入到每一个主丛节点上,只有所有的服务器都写入成功,此时才是加锁成功,假设现在某个节点挂了,那么他去获得锁的时候,只要有一个节点拿不到,都不能算是加锁成功,保证了加锁的可靠性。:用state变量来记录重入的状态的,比如当前没有人持有这把锁,那么state=0,假如来一个人持有这把锁,那么state++,释放一次就-1 ,直到减少成0 时,表示当前这把锁没有被人持有。假如他在一个方法内,调用另一个方法,那么此时如果是不可重入的,就死锁了)
2025-04-04 17:19:21
847
原创 Redis缓存查询
若先删缓存再写数据库,在这两个操作之间可能:又来了一个读请求触发 “缓存未命中(此时缓存被删除) → 查数据库(此时数据库更新操作还未完成) → 写入旧数据到缓存” 的流程,导致脏数据。//判断是否存在 Redis缓存中为null,直接返回null,因为热点key是会先做数据预热的,如果redis中没有则表名该key不是热点key。此时数据库中没有,redis中自然也没有缓存相应的资源,因此大量请求打到数据库中,给数据库带来巨大压力。//此时只存在两种情况:null(没有查询过,数据库中可能有);
2025-04-04 17:17:18
663
原创 Redis实现短信登录
发送验证码前端请求后校验手机号,生成 6 位随机验证码(如RandomUtil.randomNumbers(6))。将验证码存入 Redis(键格式login:code:手机号),设置 5 分钟有效期。javastringRedisTemplate.opsForValue().set("login:code:" + phone, code, 5, TimeUnit.MINUTES);验证验证码从 Redis 中获取缓存的验证码(键login:code:手机号),与用户输入的验证码比对。jav
2025-04-02 21:02:31
882
原创 归并排序--分治思想
2、分界点选取mid, 需要开一个数组来记录 q[l..mid] , q[mid+1..r] 中从小到大排序的所有数。分治: 这个大区间被划分n次当只剩下一个数的时候, 显然这个子区间是有序的.合并两个只一个数的区间得到两个数的区间,显然也是有序的.我们在解决此问题只需要关注子问题的解决, 所有子问题解决完后再合并子问题.得到整个大问题的解决。解决子问题: 将分成的两个区间各用一个指针变量指向起始位置, 用arr记录两个区间排序结果。1、与快排类似, 不同的是归并排序是先分成若干子问题, 再解决子问题。
2024-10-24 20:13:29
306
原创 快速排序 || 快排
这个大区间被划分n次当只剩下一个数的时候, 显然这个子区间是有序的. 合并两个只一个数的区间得到两个数的区间,显然也是有序的.因为上面子问题解决保证了(右边的数 >= 左边) 左右两边的有序数会被分别划分为一个区间,之前的数是有序的得到的区间必然也是有序的. 以此类推得到的整个大区间自然也是有序的.选择一个参考值(可左|右|中间...), 再定义两个指针分别指向最左和最右,在指针没有相遇前使所有左边的数小于参考值, 右边的所有数大于参考值. 这样结束后得到两个排好序的子区间(右边的数 >= 左边)
2024-10-23 21:17:26
407
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人