上一页 1 ··· 4 5 6 7 8 9 下一页
摘要: 代码: String token = UUID.randomUUID().toString(); 用于生成一个全局唯一的字符串标识符(UUID),并将其赋值给变量 token。 详细解析 UUID.randomUUID() 这是 hutool工具类 提供的静态方法,用于生成一个类型为 4 的 UUI 阅读全文
posted @ 2025-04-12 13:22 kuki' 阅读(257) 评论(0) 推荐(0)
摘要: 条件构造器的方法 eq eq 方法是 MyBatis-Plus 中用于构建查询条件的基本方法之一,它用于设置单个字段的相等条件。 使用范围 QueryWrapper LambdaQueryWrapper UpdateWrapper LambdaUpdateWrapper 方法签名 // 设置指定字段 阅读全文
posted @ 2025-04-12 11:17 kuki' 阅读(300) 评论(0) 推荐(0)
摘要: MyBatis-Plus文档地址 https://baomidou.com/guides/data-interface/#使用步骤 持久层接口 query 提供链式查询操作,可以连续调用方法来构建查询条件。 // 链式查询 普通 QueryChainWrapper<T> query(); // 链式 阅读全文
posted @ 2025-04-12 11:12 kuki' 阅读(94) 评论(0) 推荐(0)
摘要: 在 MyBatis-Plus 中, User user = query().eq("phone", phone).one(); 创建一个查询条件,指定字段 phone 等于变量 phone 的值,然后执行查询,返回符合条件的单个 User 对象。 逐部分解释 query():这是在 IService 阅读全文
posted @ 2025-04-12 11:05 kuki' 阅读(84) 评论(0) 推荐(0)
摘要: 在 Java 中,Boolean 是一个包装类,它可以为 null,而基本类型 boolean 则不能。因此,在进行布尔值判断时,必须首先检查对象是否为 null,以避免在解包时抛出 NullPointerException。 在代码中: if (oneLevelLimit != null && o 阅读全文
posted @ 2025-04-12 00:00 kuki' 阅读(22) 评论(0) 推荐(0)
摘要: sendCode逻辑 1. 一级限制(5分钟内禁止发送验证码)检查 借助isMember判断value "1"是否在key "limit:onelevel:"+phone对应的Set中 返回true,则存在一级限制 2. 二级限制(20分钟内禁止发送验证码)检查 借助isMember判断value 阅读全文
posted @ 2025-04-11 23:59 kuki' 阅读(79) 评论(0) 推荐(0)
摘要: 文档地址 https://docs.spring.io/spring-data/redis/docs/current/api/org/springframework/data/redis/core/ZSetOperations.html#add(K,V,double) ZSetOperations. 阅读全文
posted @ 2025-04-11 20:53 kuki' 阅读(21) 评论(0) 推荐(0)
摘要: 文档地址 https://docs.spring.io/spring-data/redis/docs/current/api/org/springframework/data/redis/core/ValueOperations.html#set(K,V) set void set(K key, V 阅读全文
posted @ 2025-04-11 20:45 kuki' 阅读(45) 评论(0) 推荐(0)
摘要: 文档地址 https://docs.spring.io/spring-data/redis/docs/current/api/org/springframework/data/redis/core/RedisTemplate.html#expire(K,long,java.util.concurre 阅读全文
posted @ 2025-04-11 20:37 kuki' 阅读(79) 评论(0) 推荐(0)
摘要: 文档地址 https://docs.spring.io/spring-data/redis/docs/current/api/org/springframework/data/redis/core/SetOperations.html#add(K,V...) add @Nullable Long a 阅读全文
posted @ 2025-04-11 20:02 kuki' 阅读(20) 评论(0) 推荐(0)
摘要: 文档地址 https://docs.spring.io/spring-data/redis/docs/current/api/org/springframework/data/redis/core/ZSetOperations.html#count(K,double,double) count方法 阅读全文
posted @ 2025-04-11 15:01 kuki' 阅读(19) 评论(0) 推荐(0)
摘要: 文档地址 https://docs.spring.io/spring-data/redis/docs/current/api/org/springframework/data/redis/core/RedisTemplate.html#opsForZSet() 文档 opsForZSet() pub 阅读全文
posted @ 2025-04-11 14:57 kuki' 阅读(49) 评论(0) 推荐(0)
摘要: 文档地址 https://docs.spring.io/spring-data/redis/docs/current/api/org/springframework/data/redis/core/RedisTemplate.html Class RedisTemplate<K,V> Type Pa 阅读全文
posted @ 2025-04-11 14:46 kuki' 阅读(18) 评论(0) 推荐(0)
摘要: 文档地址 https://docs.spring.io/spring-data/redis/docs/current/api/org/springframework/data/redis/core/StringRedisTemplate.html StringRedisTemplate 文档介绍 p 阅读全文
posted @ 2025-04-11 14:42 kuki' 阅读(15) 评论(0) 推荐(0)
摘要: Spring文档 https://docs.spring.io/spring-data/redis/docs/current/api/org/springframework/data/redis/core/SetOperations.html#isMember(K,java.lang.Object) 阅读全文
posted @ 2025-04-11 14:20 kuki' 阅读(57) 评论(0) 推荐(0)
摘要: Spring文档 https://docs.spring.io/spring-data/redis/docs/current/api/org/springframework/data/redis/core/RedisTemplate.html#opsForSet() opsForSet() 返回一个 阅读全文
posted @ 2025-04-11 14:11 kuki' 阅读(18) 评论(0) 推荐(0)
摘要: 思路 发送手机号 校验手机号合法与否 符合,则生成验证码 验证码保存到session 发送验证码 代码实现 // 发短信 @Override public Result sendCode(String phone, HttpSession session) throws MessagingExcep 阅读全文
posted @ 2025-04-11 14:02 kuki' 阅读(45) 评论(0) 推荐(0)
摘要: 总体逻辑图 发送短信验证码 输入手机号 校验手机号 若符合,则生成验证码,保存验证码到session 发送验证码 短信验证码登录、注册 提交手机号和验证码 校验验证码 一致则,根据手机号查询用户 用户不存在,则创建新用户,保存到数据库,保存用户到session 用户存在,保存用户到session 校 阅读全文
posted @ 2025-04-11 13:23 kuki' 阅读(13) 评论(0) 推荐(0)
摘要: 分布式锁的定义 分布式锁:满足分布式系统或集群模式下多进程可见并且互斥的锁 前面sychronized锁失效的原因是 原本,由于每一个JVM都有一个独立的锁监视器,用于监视当前JVM中的sychronized锁,所以无法保障多个集群下只有一个线程访问一个代码块。 所以直接将使用一个分布锁,在整个系统 阅读全文
posted @ 2025-04-10 17:26 kuki' 阅读(24) 评论(0) 推荐(0)
摘要: 单体解决一人一单的问题 如上图,两个JVM,多个锁监视器。有问题 出现的问题 两者都进入了锁的内部,这个synchronized锁形同虚设, 这是由于synchronized是本地锁,只能提供线程级别的同步,每个JVM中都有一把synchronized锁,不能跨 JVM 进行上锁, 当一个线程进入被 阅读全文
posted @ 2025-04-10 16:26 kuki' 阅读(13) 评论(0) 推荐(0)
摘要: 1 基础版逻辑图 2 上图存在的问题 问题原因:出现这个问题的原因和前面库存为负数数的情况是一样的。 线程1查询当前用户是否有订单,当前用户没有订单准备下单, 此时线程2也查询当前用户是否有订单,由于线程1还没有完成下单操作,线程2同样发现当前用户未下单,也准备下单, 这样明明一个用户只能下一单,结 阅读全文
posted @ 2025-04-10 16:21 kuki' 阅读(45) 评论(0) 推荐(0)
摘要: 版本号法 为 tb_seckill_voucher 表新增一个版本号字段 version 线程1查询完库存,在进行库存扣减操作的同时将版本号+1, 线程2在查询库存时,同时查询出当前的版本号, 发现库存充足,也准备执行库存扣减操作,但是需要判断当前的版本号是否是之前查询时的版本号, 结果发现版本号发 阅读全文
posted @ 2025-04-10 15:33 kuki' 阅读(44) 评论(0) 推荐(0)
摘要: 定义 CAS(Compare and Swap)是一种并发编程中常用的原子操作,用于解决多线程环境下的数据竞争问题。 它是乐观锁算法的一种实现方式。 CAS操作包含三个参数: 内存地址V、 旧的预期值A和 新的值B。 CAS的执行 CAS的执行过程如下: 比较(Compare):将内存地址V中的值与 阅读全文
posted @ 2025-04-10 14:33 kuki' 阅读(41) 评论(0) 推荐(0)
摘要: 常见方案 悲观锁, 认为线程安全问题一定会发生, 因此操作数据库之前都需要先获取锁,确保线程串行执行。 常见的悲观锁有:synchronized、lock 乐观锁, 认为线程安全问题不一定发生, 因此不加锁, 只会在更新数据库的时候去判断有没有其它线程对数据进行修改, 如果没有修改则认为是安全的,直 阅读全文
posted @ 2025-04-10 12:56 kuki' 阅读(49) 评论(0) 推荐(0)
摘要: 不考虑超卖问题的实现 查询优惠券 判断时间是否符合 判断库存够么 都对,则库存-1 创建订单保存到数据库 1. 高并发的场景下,单体下库存超卖问题 1.1 问题描述 线程1查询库存,发现库存充足,创建订单,然后准备对库存进行扣减, 但此时线程2和线程3也进行查询,同样发现库存充足, 然后线程1执行完 阅读全文
posted @ 2025-04-10 00:54 kuki' 阅读(54) 评论(0) 推荐(0)
摘要: 分布式ID特性 全局唯一性:保证在整个分布式系统中唯一性,不会出现重复的ID。 高可用性:可以通过水平扩展、冗余备份或集群部署来确保。即使某个节点或组件发生故障,仍然能够正常。 安全性:分布式ID生成器独立于 业务逻辑的。设计为一个单独的组件或服务,可以被各种服务共享使用。 高性能:要求在很短的时间 阅读全文
posted @ 2025-04-09 19:28 kuki' 阅读(43) 评论(0) 推荐(0)
摘要: 在MySQL中,表最多可以存储的记录数取决于多个因素,包括数据库版本、操作系统和硬件配置等。下面是一些常见的限制:(感觉没啥用) 行数限制: 在MySQL 5.7及之前的版本中,InnoDB和XtraDB存储引擎的行数限制为最大约为64亿(\(2^{32}-1\)) ,即4,294,967,295行 阅读全文
posted @ 2025-04-09 18:43 kuki' 阅读(138) 评论(0) 推荐(0)
摘要: 自增ID存在的问题 当用户抢购时,就会生成订单并保存到tb_voucher_order这张表中,而订单表如果使用数据库自增ID就存在一些问题: id的规律性太明显,容易出现信息的泄露,被不怀好意的人伪造请求 受单表数据量的限制,MySQL中表能够存储的数据有限,会出现分库分表的情况,id不能够一直自 阅读全文
posted @ 2025-04-09 17:06 kuki' 阅读(24) 评论(0) 推荐(0)
摘要: 什么是逻辑过期 所谓的逻辑过期,类似于逻辑删除,并不是真正意义上的过期, 而是新增一个字段,用来标记key的过期时间,这样能能够避免key过期而被自动删除,这样数据就永不过期了, 从根本上解决因为热点key过期导致的缓存击穿。一般搞活动时,比如抢优惠券,秒杀等场景,请求量比较大就可以使用逻辑过期,等 阅读全文
posted @ 2025-04-09 16:07 kuki' 阅读(61) 评论(0) 推荐(0)
摘要: 代码举例 private boolean tryLock(String key) { Boolean flag = stringRedisTemplate.opsForValue().setIfAbsent(key, "1", 10, TimeUnit.SECONDS); // 避免返回值为null 阅读全文
posted @ 2025-04-09 15:15 kuki' 阅读(47) 评论(0) 推荐(0)
摘要: setIfAbsent Spring 文档 https://docs.spring.io/spring-data/redis/docs/current/api/org/springframework/data/redis/core/ValueOperations.html#setIfAbsent(K 阅读全文
posted @ 2025-04-09 14:58 kuki' 阅读(89) 评论(0) 推荐(0)
摘要: 实现了一个基于 Redis 的分布式锁机制,包含获取锁和释放锁的逻辑。 1. 获取锁的逻辑: private boolean tryLock(String key) { Boolean flag = stringRedisTemplate.opsForValue().setIfAbsent(key, 阅读全文
posted @ 2025-04-09 14:46 kuki' 阅读(31) 评论(0) 推荐(0)
摘要: 文档链接 https://baomidou.com/guides/data-interface/#get // 根据 ID 查询 T getById(Serializable id); 代码举例 shop = getById(id); 这行代码的作用是根据给定的 id,从数据库中查询对应的 Shop 阅读全文
posted @ 2025-04-09 14:30 kuki' 阅读(326) 评论(0) 推荐(0)
摘要: Spring文档 opsForValue public ValueOperations<K,V> opsForValue() Description copied from interface: RedisOperations 返回对简单值(或 Redis 术语中的字符串)执行的操作。 Return 阅读全文
posted @ 2025-04-09 13:33 kuki' 阅读(121) 评论(0) 推荐(0)
摘要: 什么是缓存击穿 缓存击穿问题也叫热点Key问题, 就是一个被高并发访问并且缓存重建业务较复杂的key突然失效了, 无数的请求访问会在瞬间给数据库带来巨大的冲击。 解决方案 互斥锁(时间换空间) 优点:内存占用小,一致性高,实现简单 缺点:性能较低,容易出现死锁 逻辑过期(空间换时间) 优点:性能高 阅读全文
posted @ 2025-04-09 11:31 kuki' 阅读(94) 评论(0) 推荐(0)
摘要: 什么是缓存雪崩? 缓存雪崩是指在同一时段大量的缓存key同时失效或者Redis服务宕机, 导致大量请求到达数据库,带来巨大压力。 解决方案 给不同的Key的TTL(过期时间)添加随机值 给缓存业务添加降级限流策略,(接口限流)比如快速失败机制,让请求尽可能打不到数据库上 给业务添加多级缓存 利用Re 阅读全文
posted @ 2025-04-09 11:11 kuki' 阅读(20) 评论(0) 推荐(0)
摘要: 什么是缓存穿透? 缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在, 这样缓存永远不会生效,这些请求都会打到数据库。 解决方案 缓存空字符串(即一个默认值) 优点:实现简单,维护方便 缺点:额外的内存消耗,可能造成短期的不一致 布隆过滤 优点:内存占用较少,没有多余key 缺点:实现复杂,存在 阅读全文
posted @ 2025-04-08 23:55 kuki' 阅读(42) 评论(0) 推荐(0)
摘要: 文档链接:https://plus.hutool.cn/apidocs/cn/hutool/core/text/CharSequenceUtil.html#isNotBlank-java.lang.CharSequence- CharSequenceUtil public static boolea 阅读全文
posted @ 2025-04-08 23:41 kuki' 阅读(21) 评论(0) 推荐(0)
摘要: 采用缓存主动更新来解决数据一致性问题,同时也选择使用双写方案的删除缓存模式(增加TTL超时剔除兜底),同时将缓存和数据库的操作放到同一个事务来保障操作的原子性。 需求 根据id查询店铺时,如果缓存未命中,则查询数据库,将数据库结果写入缓存,并设置超时时间。 根据id修改店铺时,先修改数据库,再删除缓 阅读全文
posted @ 2025-04-08 21:15 kuki' 阅读(91) 评论(0) 推荐(0)
摘要: 加缓存的问题 缓存的使用降低了后端负载,提高了读写的效率,降低了响应的时间。 但缓存带来问题,比如:数据一致性问题 数据一致性的产生原因 缓存和数据库中的数据不同步 所以需要缓存更新策略。 缓存更新策略 主动更新(手动)。手动编码实现缓存更新,在修改数据库的同时更新缓存 双写方案(Cache Asi 阅读全文
posted @ 2025-04-08 20:44 kuki' 阅读(109) 评论(0) 推荐(0)
上一页 1 ··· 4 5 6 7 8 9 下一页