Is this you? As a journalist, you can create a free Muck Rack account to customize your profile, list your contact preferences, and upload a portfolio of your best work.
Claim your profile
Articles by return Result.ok
Goodbye Exceptions! Mastering Error Handling in JavaScript with the Result Pattern
The Result Pattern is a functional programming approach used in many programming languages like Rust, Go, C# (and other languages) to handle errors without relying on try-catch blocks. It involves representing the result of an operation as an object that explicitly indicates success or failure. This pattern is particularly useful in asynchronous programming. What is the Result Pattern?
Results May Vary: Going Further with Result Types
In the previous post we introduced the Result type. We saw how always returning a value from a function simplifies the control flow of our program and increases its type safety. We also saw how encapsulating try/catch blocks inside our Result type makes code easier to reason about as a result (ha!) of the reduced number of branching paths in our program. We went from a tree of many branches to a single unidirectional pipe with computations in and results out.
Results May Vary: using Result types for Predictable Program Flow
If you're like most developers, you probably code a multi-step process something like this.
mybatis-plus使用拦截器实现sql完整打印-CSDN博客
shigen坚持更新文章的博客写手,擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长,分享认知,留住感动。 个人IP:shigen 在使用mybatis-plus(mybatis)的时候,往往需要打印完整的sql语句,然而输出的日志不是很理想: 因为sql语句中的关键字段信息都是用?来代替的。那有什么方法实现完整的sql打印呢?有是有的,我记得IDEA的插件市场有一款插件可以实现完整sql的打印,但是好像是要收费的。今天刷某音的时候看到了某博主分享了一下自己写了一个拦截器实现了sql完整的打印,以下是实现的效果: 可以看到了sql的执行时间和完整的sql语句。sql的执行时间没啥好说的,关键是sql语句的完整打印。现在先来分享一下代码吧。 代码 controller的设计 这里仅展示关键的代码,一个更新的操作,一个分页查询的操作。 @PostMapping(value = "update") public Result<String> update(@RequestBody @Validated(value =...
2024年大数据最新《Redis实战篇》三、优惠券秒杀(1),2024年最新大数据开发高级面试题-CSDN博客
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化! 由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新 需要这份系统化资料的朋友,可以戳这里获取 为了增加ID的安全性,我们可以不直接使用Redis自增的数值,而是拼接一些其它信息: ID的组成部分: 符号位:1bit,永远为0 时间戳:31bit,以秒为单位,可以使用69年 序列号:32bit,秒内的计数器,支持每秒产生2^32个不同ID 3.2 Redis实现全局唯一Id /\*\* \* @author lxy \* @version 1.0 \* @Description ID生成器 \* @date 2022/12/12 12:48 \*/ @Component public class RedisIdWorker { /\*\* \* 开始时间戳 \*/ private static final long BEGIN\_TIMESTAMP = 1670803200L;...
Redis的缓存穿透、缓存击穿和缓存雪崩_redis 缓存穿透,雪崩-CSDN博客
目录 一、解释说明 Redis缓存穿透、缓存击穿和缓存雪崩都是缓存机制中的一些问题,具体解释如下: (1)缓存穿透(Cache Penetration):指查询一个不存在的数据,由于缓存中没有数据, 所以这个查询请求会直接穿过缓存层,到达数据库层,造成了数据库的压力。 攻击者可以通过构造恶意请求,使得缓存层无法命中任何数据, 从而导致请求直接访问数据库,从而引起数据库压力过大。 (2)缓存击穿(Cache Breakdown):指缓存中某个热点数据失效,此时有大量并发请求同时访问 这个失效的数据,导致这些请求直接访问数据库,造成数据库压力过大, 甚至导致数据库崩溃。通常是由于缓存中某个热点数据过期失效, 同时有大量并发请求访问该数据。 (3)缓存雪崩(Cache Avalanche):指缓存中大量的数据失效,导致大量请求直接访问数据库, 造成数据库压力过大。通常是由于缓存中大量的数据在同一时间失效, 导致大量请求直接访问数据库。 针对上述问题,可以采取以下措施: (1)缓存穿透:可以在查询缓存之前,先对请求的参数进行合法性检查,如过滤非法字符、...
《黑马点评》Redis高并发项目实战笔记【完结】P1~P72_黑马点评实战笔记-CSDN博客
花费4周敲完《黑马点评》的课程,做了详细的笔记,感觉受益匪浅,一直一直都在不停成长着。 突然想起《苍穹外卖》系列至今已收获200+个赞,500+个收藏,好评颇多,私信我的人不计其数,在此谢谢大家。 下一篇开始学习12306订票系统项目,大家敬请期待吧。 如有问题欢迎加文末微信,商业订单、项目需求都欢迎前来咨询。想进粉丝群的朋友们见文末。 P1 Redis企业实战课程介绍 P2 短信登录 导入黑马点评项目 首先在数据库连接下新建一个数据库hmdp,然后右键hmdp下的表,选择运行SQL文件,然后指定运行文件hmdp.sql即可(建议MySQL的版本在5.7及以上): 下面这个hm-dianping文件是项目源码。在IDEA中打开。 记得要修改数据库连接和Redis连接的密码: 运行程序后尝试访问:localhost:8081/shop-type/list 进行简单测试: 将nginx文件复制到一个没有中文路径的目录,然后点击nginx.exe运行: 在nginx所在目录打开CMD窗口,输入命令:start nginx.exe...
Redis - 登录场景分析-CSDN博客
java代码中使用Redis 环境准备 这里我们需要导入一些所需的依赖 使用的是Spring集成的框架SpringDataRedis <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> </dependency> 配置连接 通过yaml文件配置 对应的redis连接参数 redis: host: ip地址 port: 端口号 auth: 密码 lettuce: pool: max-active: 最大连接数 max-idle: 最大空闲连接 min-idle: 最小空闲连接 time-between-eviction-runs: 连接等待时间 使用 package com.caidan.redis;...
Springboot+Redis:实现缓存 减少对数据库的压力
🎉🎉欢迎光临,终于等到你啦🎉🎉 🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀 🌟持续更新的专栏Redis实战与进阶 本专栏讲解Redis从原理到实践 这是苏泽的个人主页可以看到我其他的内容哦👇👇 努力的苏泽http://suzee.blog.csdn.net/ 缓存如何实现?面试必考题 请看 我的讲解以及最佳实践吧 目录 关于 Redis 缓存的解释如下: Redis 如何实现缓存? 在后端接收到请求后,对于需要进行缓存的接口,首先会在 Redis 中查找是否有对应的数据。如果缓存中不存在数据,系统会继续按照正常的业务流程处理请求,并将查询到的结果返回给客户端的同时也存储在 Redis 中。下次相同的请求到达时,系统可以直接从 Redis 中获取数据,而无需访问数据库。 在启用缓存后,相同的请求在缓存有效期内不会再去读取数据库。但是,如果在此期间修改了数据库中的数据,接口返回的数据就无法保证与数据库一致。因此,在进行增、删、改操作时,需要刷新缓存。 Redis 缓存更新策略是什么? 缓存更新可以采用不同的策略,以下是两种常见情况的比较:...
SpringBoot(JAVA)整合小程序支付和退款功能详解_springboot微信小程序支付及退款-CSDN博客
个人建议支付和退款不要自己去封装请求,因为有很多坑!而且还不一定能弄成功!代码复制直接可用。 需要注意有可能在执行编译证书的时候可能会报一个长度异常,是因为jdk1.8对密匙长度有限制,用jdk大于1.8的版本就能正常编译。 官方文档不是很清晰,都是零零散散的,但有总比没有好。 微信小程序支付文档:https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_5_1.shtml 微信小程序退款文档:https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_5_9.shtml 微信小程序支付 在进行对接微信支付之前,我们首先需要将以下几点准备好: 申请APPID 申请商户号 小程序开通微信支付,绑定已经申请好的商户号。登录小程序后台(mp.weixin.qq.com)。点击左侧导航栏的微信支付,在页面中进行开通。(开通申请要求小程序已发布上线) 支付流程图: 微信小程序退款...
Java 飞书机器人消息发送(简单demo)
w引入pom <dependency> <groupId>com.larksuite.oapi</groupId> <artifactId>oapi-sdk</artifactId> <version>2.1.3</version> </dependency> public Result<?> sendTextByGroupRobots() { feiShuNotifyRequest.sendTextByGroupRobots(FeiShuConfig.WEB_HOOK_URL,"牛爷爷吃饭"); return Result.OK(); } public Result<?> sendTextAboutUserByGroupRobots() { feiShuNotifyRequest.sendTextAboutUserByGroupRobots(FeiShuConfig.WEB_HOOK_URL,"牛爷爷打游戏","ou_b406xxxxxxxxxxx221630"); return Result.OK(); } public Result<?>...
SpringBoot根据多阶层创建文件,然后压缩成压缩包进行下载 - 书画船妄月 - 博客园
临时接到一个需求说让根据按照下面的这个图片的结构来打包下载指定位置下的文件到指定位置! 实现思路: 1.把已经实现的树形结构的代码进行调用,拿到他的数据进行创建对应的文件夹 2.因为结构下方的文件没有特别直观的数据库中的关联关系,所以还需要对于管理关系进行梳理 3.创建好阶级文件,然后调用网上找的工具类打包成为rar压缩包,然后把路劲交给前端进行调用下载 调用数据,然后传递给创建文件方法进行实现: /** * 打包佐证成果文件,压缩成为压缩包! * * @param projectId * @param departId */ @ApiOperation(value = "打包佐证成果文件", notes = "佐证与成果-打包佐证成果文件") @RequestMapping("/exportZip") public Result<?> exportZip(@RequestParam(name = "projectId", required = false) String projectId, @RequestParam(name = "departId", required =...
Java 实现微信扫码登录方法(提供前端及后端核心代码)
思路 1、Vue前端页面获取一个公众号的二维码,不是普通二维号,是带有场景值的 2、java后端接收前端的请求,生成一个带时效性的二维码链接返回给前端 3、公众号平台配置服务器接口地址 4、接收到关注或扫码请求并相应处理 5、前端轮询状态,如果检查到验证通过进到下一页面 前端页面 vue代码 wxlogin() { this.$showLoading(); getTempQrCode(this.token).then((res) => { console.log("res==========",res); this.$closeLoading(); this.imageUrl = objToStr(res.data.message); this.loginType='wx' setTimeout(() => { this.check(); }, 1000); }) }, java代码 @RequestMapping(value = "/getTempQrCode", method = RequestMethod.GET) public Result<?>...
redis缓存更新策略,缓存穿透,缓存雪崩,缓存击穿。封装redis工具类_qq650ec3932eee1的技术博客_51CTO博客
(redis缓存) 缓存是存储数据的临时地方,一般读写性能高 1. 给商铺添加缓存 思路: 在对应的serviceImpl里写逻辑 @Override public Result queryById(Long id) { String key = CACHE_SHOP_KEY + id; //1.从redis查询商铺缓存 String shopJSON = stringRedisTemplate.opsForValue().get(key); if (StrUtil.isNotEmpty(shopJSON)) { Shop shop = BeanUtil.toBean(shopJSON, Shop.class); return Result.ok(shop); } //2. 未查到,查询数据库 Shop shop2 = shopMapper.selectById(id); //3.判断商铺是否存在 if (shop2 == null) { //4.不存在,返回404 Result.fail("商铺不存在!"); } //5.
Redis-秒杀优化、Redis消息队列、达人探店-阿里云开发者社区
秒杀优化 异步秒杀思路 我们来回顾一下下单流程 当用户发起请求,此时会请求nginx,nginx会访问到tomcat,而tomcat中的程序,会进行串行操作,分成如下几个步骤 1、查询优惠卷 2、判断秒杀库存是否足够 3、查询订单 4、校验是否是一人一单 5、扣减库存 6、创建订单 在这六步操作中,又有很多操作是要去操作数据库的,而且还是一个线程串行执行, 这样就会导致我们的程序执行的很慢,所以我们需要异步程序执行,那么如何加速呢?...
03黑马店评-添加商户缓存和商户类型的缓存到Redis_echo 云清的博客-CSDN博客
什么是缓存 实际开发过程中数据量可以达到几千万,缓存可以作为避震器防止过高的数据访问猛冲系统,避免系统内的操作线程无法及时处理信息而瘫痪 缓存(Cache)就是数据交换的缓冲区(储存临时数据的地方),我们俗称的"缓存"实际就是缓冲区内的数据(一般从数据库中获取存储于本地) Static修饰: 随着类的加载而被加载到内存之中从而作为本地缓存 final修饰: 其引用和对象之间的关系是固定的不能改变,因此不用担心赋值时导致缓存失效 Static final ConcurrentHashMap<K,V> map = new ConcurrentHashMap<>(); static final Cache<K,V> USER_CACHE = CacheBuilder.newBuilder().build(); Static final Map<K,V> map = new HashMap(); 缓存的优点和缺点 优点: 缓存数据存储于代码中而代码又运行在内存中(读写性能远高于磁盘),从而大大降低用户访问的并发量给服务器带来的读写压力 缺点:...
【Redis实战】击穿+雪崩+穿透-CSDN博客
基于session实现登录 流程图 代码实现 @Slf4j @Service public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService { public static final String USER_CONSTANT = "user"; @Override public Result sendCode(String phone, HttpSession session) { boolean phoneInvalid = RegexUtils.isPhoneInvalid(phone); if (phoneInvalid) { return Result.fail("手机号码格式错误!"); } String code = RandomUtil.randomNumbers(6); session.setAttribute("code", code); log.info("send code success,code={}", code); return...
黑马点评-01基于Redis实现短信登陆的功能_echo 云清的博客-CSDN博客
当前模型 nginx服务器的作用 手机或者app端向nginx服务器发起请求,nginx基于七层模型走的是HTTP协议,可以实现基于Lua直接绕开tomcat访问Redis nginx也可以作为静态资源服务器,轻松扛下上万并发并负载均衡到下游的tomcat服务器,利用集群支撑起整个项目 使用nginx部署前端项目后还可以做到动静分离,进一步降低tomcat服务的压力 企业级MySQL加上固态硬盘能够支撑的并发大概就是4000起~7000左右,对于上万的并发如果让tomcat直接访问Mysql,瞬间会让Mysql服务器的cpu和硬盘全部打满 在高并发场景下需要选择使用MySQL集群,同时为了进一步降低MySQL的压力增加访问的性能,一般还需要使用Redis集群 导入数据/前端/后端 执行项目所需要的SQL脚本,MySQL的版本要采用5.7及以上版本,否则执行脚本时部分SQL语句无法执行 表说明 tb_user 用户表 tb_user_info 用户详情表 tb_shop 商户信息表 tb_shop_type 商户类型表 tb_blog 用户日记表(达人探店日记) tb_follow...
一文拿捏分布式协调Redis客服端-Redisson-CSDN博客
Redisson Redisson - 是一个高级的分布式协调Redis客服端 , 专注于分布式系统开发,让用户可以在分布式系统中很方便的去使用Redis。 1.加锁 //底层是lua脚本保证了加锁的原子性 // 一直等待获取锁,直到获取到锁为止! 默认锁的存活时间为30s lock.lock(); // 一直等待获取锁,并且显式的指定锁的过期时间 lock.lock(10 , TimeUnit.SECONDS); // 尝试获取一次锁,如果可以获取到锁就返回true,否则返回false, 默认情况下锁的过期时间为30s lock.tryLock(); // 尝试获取一次锁,指定加锁的等待超时时间为3s, 如果在3s内获取到了锁,那么此时就返回true,否则返回false, 默认情况下锁的过期 时间为30s boolean tryLock = lock.tryLock(3, 20, TimeUnit.SECONDS); //通过如下方式获取的锁是可重入锁: RLock lock = redissonClient.getLock(”redisson-lock”); 2.释放锁...
redis实战-redis实现异步秒杀优化_明矾java的博客-CSDN博客
未优化的思路 当用户发起请求,此时会请求nginx,nginx会访问到tomcat,而tomcat中的程序,会进行串行操作,分成如下几个步骤 1、查询优惠卷 2、判断秒杀库存是否足够 3、查询订单 4、校验是否是一人一单 5、扣减库存 6、创建订单 在这六步操作中,又有很多操作是要去操作数据库的,而且还是一个线程串行执行, 这样就会导致我们的程序执行的很慢 优化方案 我们将耗时比较短的逻辑判断放入到redis中,比如是否库存足够,比如是否一人一单,这样的操作,只要这种逻辑可以完成,就意味着我们是一定可以下单完成的,我们只需要进行快速的逻辑判断,根本就不用等下单逻辑走完,我们直接给用户返回成功, 再在后台开一个线程,后台线程慢慢的去执行queue里边的消息,即不追求时效性,让用户先成功下单,后续再完善数据库数据 整体思路...
SpringCloud Alibaba(2021.0.1版本)微服务-OpenFeign以及相关组件使用(保姆级教程)
🌟 本套mode使用的是Alibaba的2021.0.1版,springboot的2.6.3实现(适用于springboot 2.7~2.4),使用到的组件包括OpenFeign(实现远程调用)、loadbalancer(负载均衡)、hystrix(熔断降级)、nacos(注册中心) nacos的安装和基本配置使用可以查看我这篇博客,或者关注下面的专栏后续会持续更新其他的Spring Cloud 组件介绍以及使用 🍅Nacos下载与安装配置(2.2.3版本示例) 🥒Spring Cloud Alibaba专栏 openFeign是要声明式的web服务客户端,或叫做声明式REST客户端,它让编写web服务客户端变得简单。 能够干什么? 可以让我们实现调用别的服务模块像调用本地模块接口一样方便,并且在配合上loadbalancer可以实现负载均衡的效果,实现集群化部署,避免请求全部到一个服务;并且通过hystrix实现一个服务降级到效果,可以当请求过多无法按时返回时,实现一个服务降级到效果,以及通过nacos实现一个服务注册的效果。 实现原理...
redis实战-实现优惠券秒杀&解决超卖问题_明矾java的博客-CSDN博客
唯一ID的必要性 每个店铺都可以发布优惠券: 当用户抢购时,就会生成订单并保存到tb_voucher_order这张表中,而订单表如果使用数据库自增ID就存在一些问题: id的规律性太明显,容易被用户根据id的间隔来猜测到销量等商业信息,不够保密 受单表数据量的限制,mysql的id自增长有数值约束,且数据量大的情况下会进行分库分表,表不同自增长id可能相同,在分布式系统中是不允许的 全局ID生成器,是一种在分布式系统下用来生成全局唯一ID的工具,一般要满足下列特性: Redis恰好满足以上特性,为了增加ID的安全性,我们可以不直接使用Redis自增的数值,而是拼接一些其它信息: ID的组成部分:符号位:1bit,永远为0 时间戳:31bit,以秒为单位,可以使用69年 序列号:32bit,秒内的计数器,支持每秒产生2^32个不同ID,这个序列号足够大,几乎不可能到达极限 redis实现全局唯一ID 获取当前时间戳的秒数 LocalDateTime time = LocalDateTime.of(2023, 9, 2, 0, 0, 0); long of =...
Redis功能实战篇之Session共享_废弃的root的博客-CSDN博客
当用户请求我们的nginx服务器,nginx基于七层模型走的事HTTP协议,可以实现基于Lua直接绕开tomcat访问redis,也可以作为静态资源服务器,轻松扛下上万并发, 负载均衡到下游tomcat服务器,打散流量,我们都知道一台4核8G的tomcat,在优化和处理简单业务的加持下,大不了就处理1000左右的并发, 经过nginx的负载均衡分流后,利用集群支撑起整个项目,同时nginx在部署了前端项目后,更是可以做到动静分离,进一步降低tomcat服务的压力,这些功能都得靠nginx起作用,所以nginx是整个项目中重要的一环。 在tomcat支撑起并发流量后,我们如果让tomcat直接去访问Mysql,根据经验Mysql企业级服务器只要上点并发,一般是16或32 核心cpu,32 或64G内存,像企业级mysql加上固态硬盘能够支撑的并发,大概就是4000起~7000左右,上万并发,...
redis实战-缓存三剑客穿透击穿雪崩解决方案_明矾java的博客-CSDN博客
定义 缓存穿透 :缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库,造成数据库压力,也让缓存没有发挥出应有的作用 解决方案 缓存空对象 当我们客户端访问不存在的数据时,先请求redis,但是此时redis中没有数据,此时会访问到数据库,但是数据库中也没有数据,这个数据穿透了缓存,直击数据库,我们都知道数据库能够承载的并发不如redis这么高,如果大量的请求同时过来访问这种不存在的数据,这些请求就都会访问到数据库,这个数据即使数据库不存在,我们也把这个数据存入到redis中去,这样,下次用户过来访问这个不存在的数据,那么在redis中也能找到这个数据就不会进入到缓存了,但这样缓存大量空对象也会消耗内存 布隆过滤器...
基于jeecg-boot的flowable流程跳转功能实现_宁波阿成的博客-CSDN博客
更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码: https://gitee.com/nbacheng/nbcio-boot 前端代码:https://gitee.com/nbacheng/nbcio-vue.git 在线演示(包括H5) : http://122.227.135.243:9888 今天我们实现nbcio-boot的flowable的流程跳转功能。 一、前端实现 界面实现,就是点击跳转出来的窗口 <!--跳转流程--> <a-modal :z-index="100" :title="jumpTitle" @cancel="jumpOpen = false" :visible.sync="jumpOpen" :width="'40%'" append-to-body> <el-form ref="jumpForm" :model="jumpForm" label-width="160px"> <el-form-item label="跳转节点" prop="jumpType" :rules="[{ required: true,...
08.利用Redis实现签到功能_新时代码农丶的博客-CSDN博客
来源:黑马教程 使用Redis中BitMap数据结构使用签到功能和连续签到功能 解决方案: 1.
07.利用Redis实现点赞排行榜功能_新时代码农丶的博客-CSDN博客
提示:学习如何利用Redisson实现点赞排行榜功能,按照时间顺序 当用户给某一篇文章点赞后,会再数据库中存储一条数据,并且在Redis中存储一条数据为当前博客的点赞用户标识,来区分哪个用户对文章进行了点赞,使用ZSet数据结构对点赞用户进行排序来实现排行榜功能 解决方案: 点赞后的用户记录在Redis的set数据类型中 1.
spring boot分装通用的查询+分页接口
在用spring boot+mybatis plus实现增删改查的时候,总是免不了各种模糊查询和分页的查询。每个数据表设计一个模糊分页,这样代码就造成了冗余,且对自身的技能提升没有帮助。那么有没有办法实现一个通用的增删改查的方法呢?今天的shigen闲不住,参照gitee大神蜗牛的项目,实现了通用的查询+分页的封装。 在此之前,希望你对于mybatis plus的基本API有一定的了解。 那么我先列举一下我之前写的代码,实现的模糊查询和分页吧。 Page<SlowLogData> page = new Page<>(queryVo.getPageNum(), queryVo.getPageSize()); if (StrUtil.isAllNotBlank(sortColumn, isAsc)) { OrderItem orderItem = new OrderItem(sortColumn, Boolean.parseBoolean(isAsc)); page.addOrder(orderItem); } LambdaQueryWrapper<SlowLogData>...
黑马点评-项目集成git及redis实现短信验证码登录_明矾java的博客-CSDN博客
目录 IDEA集成git redis方案 远程仓库采用码云,创建好仓库,复制仓库的url 在idea中点击,出现git选项,点击ok 之后右击项目,点击remotes 填写url即可集成git 传统的登录认证会采用session进行登录认证,将登录的验证码,用户信息都存放到session中,我们通过session来进行操作数据,这有什么问题呢 每个tomcat服务器中都有一份属于自己的session,假设用户第一次访问第一台tomcat,并且把自己的信息存放到第一台服务器的session中,但是第二次这个用户访问到了第二台tomcat,那么在第二台服务器上,肯定没有第一台服务器存放的session,即session在各个服务器之间是不共通的,所以此时整个登录拦截功能就会出现问题,而redis数据本身就是共享的,就可以避免session共享的问题了 业务流程 将验证码存储到redis中 将用户数据存储到redis中 选用的数据结构 存储验证码时采用String类型,key采用业务代码+手机号 存储user数据时采用hash,key采用业务代码+随机的tonke...
Rabbitmq延迟消息_Knight_AL的博客-CSDN博客
延迟消息有两种实现方案: 1,基于死信队列 2,集成延迟插件 1.基于死信实现延迟消息 使用RabbitMQ来实现延迟消息必须先了解RabbitMQ的两个概念: 消息的TTL(存活时间)和死信交换机Exchange,通过这两者的组合来实现延迟队列 消息的TTL就是消息的存活时间。RabbitMQ可以对队列和消息分别设置TTL。对队列设置就是队列没有消费者连着的保留时间,也可以对每一个单独的消息做单独的设置。超过了这个时间,我们认为这个消息就死了,称之为死信。 如何设置TTL: 我们创建一个队列queue.temp,在Arguments 中添加x-message-ttl 为5000 (单位是毫秒),那所在压在这个队列的消息在5秒后会消失。 一个消息在满足如下条件下,会进死信路由,记住这里是路由而不是队列,一个路由可以对应很多队列。 (1) 一个消息被Consumer拒收了,并且reject方法的参数里requeue是false。也就是说不会被再次放在队列里,被其他消费者使用。 (2)上面的消息的TTL到了,消息过期了。...
基于springboot+Redis的前后端分离项目(八)-【黑马点评】_失重外太空.的博客-CSDN博客
(一)好友关注-关注和取消关注 实现思路: 需求:基于该表数据结构,实现两个接口: 关注和取关接口 判断是否关注的接口 关注是User之间的关系,是博主与粉丝的关系,数据库中有一张tb_follow表来标示: 注意: 这里需要把主键修改为自增长,简化开发。 FollowController @PutMapping("/{id}/{isFollow}") public Result follow(@PathVariable("id") Long followUserId, @PathVariable("isFollow") Boolean isFollow) { return followService.follow(followUserId, isFollow); } @GetMapping("/or/not/{id}") public Result isFollow(@PathVariable("id") Long followUserId) { return followService.isFollow(followUserId); } FollowService...
Redis解决Session共享问题_熬夜磕代码丶的博客-CSDN博客
session共享问题:多台Tomcat并不共享session存储空间,当请求切换到不同tomcat服务器时导致数据丢失的问题 tomcat可以进行多台tomcat进行session拷贝,但是数据拷贝保存相同的内容会存在资源浪费,而且会有时间延迟,所以这种方案不可行 session的替代方案应该满足: 数据共享 内存存储 key、value结构 这里我们可以使用redis 发送短信: @Resource private StringRedisTemplate stringRedisTemplate; @Override public Result sendCode(String phone, HttpSession session) { if (phone == null || str.matches("^1([38][0-9]|4[579]|5[0-3,5-9]|6[6]|7[0135678]|9[89])\\d{8}$")) { return Result.fail("手机号格式错误!"); } String code =...
基于springboot+Redis的前后端分离项目(七)-【黑马点评】_失重外太空.的博客-CSDN博客
1、达人探店-发布探店笔记 发布探店笔记 探店笔记类似点评网站的评价,往往是图文结合。对应的表有两个: tb_blog:探店笔记表,包含笔记中的标题、文字、图片等 tb_blog_comments:其他用户对探店笔记的评价 具体发布流程 上传接口 @Slf4j @RestController @RequestMapping("upload") public class UploadController { @PostMapping("blog") public Result uploadImage(@RequestParam("file") MultipartFile image) { try { String originalFilename = image.getOriginalFilename(); String fileName = createNewFileName(originalFilename); image.transferTo(new File(SystemConstants.IMAGE_UPLOAD_DIR, fileName));...
基于springboot+Redis的前后端分离项目之消息队列(六)-【黑马点评】_失重外太空.的博客-CSDN博客
1 秒杀优化-异步秒杀思路 我们来回顾一下下单流程 当用户发起请求,此时会请求nginx,nginx会访问到tomcat,而tomcat中的程序,会进行串行操作,分成如下几个步骤 1、查询优惠卷 2、判断秒杀库存是否足够 3、查询订单 4、校验是否是一人一单 5、扣减库存 6、创建订单 在这六步操作中,又有很多操作是要去操作数据库的,而且还是一个线程串行执行, 这样就会导致我们的程序执行的很慢,所以我们需要异步程序执行,那么如何加速呢?...
Redis实现分布式锁_redis分布式锁-CSDN博客
前言 随着时代的发展,分布式系统的运用越来越多,而在分布式系统中,本地锁已经无法解决数据安全问题,分布式锁能够很好的解决这个问题.
【Redis】2、Redis应用之【根据 Session 和 Redis 进行登录校验和发送短信验证码】
(1) 发送短信验证码 ① 手机号格式后端校验 手机号校验的正则表达式 public abstract class RegexPatterns { public static final String PHONE_REGEX = "^1([38][0-9]|4[579]|5[0-3,5-9]|6[6]|7[0135678]|9[89])\\d{8}$"; public static final String EMAIL_REGEX = "^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$"; public static final String PASSWORD_REGEX = "^\\w{4,32}$"; public static final String VERIFY_CODE_REGEX = "^[a-zA-Z\\d]{6}$"; } 校验工具类: public class RegexUtils { public static boolean isPhoneInvalid(String phone) { return...
基于springboot+Redis的前后端分离项目(三)-【黑马点评】_失重外太空.的博客-CSDN博客
1 -全局唯一ID 每个店铺都可以发布优惠券: 当用户抢购时,就会生成订单并保存到tb_voucher_order这张表中,而订单表如果使用数据库自增ID就存在一些问题: id的规律性太明显 受单表数据量的限制 场景分析:如果我们的id具有太明显的规则,用户或者说商业对手很容易猜测出来我们的一些敏感信息,比如商城在一天时间内,卖出了多少单,这明显不合适。 场景分析二:随着我们商城规模越来越大,mysql的单表的容量不宜超过500W,数据量过大之后,我们要进行拆库拆表,但拆分表了之后,他们从逻辑上讲他们是同一张表,所以他们的id是不能一样的, 于是乎我们需要保证id的唯一性。 全局ID生成器,是一种在分布式系统下用来生成全局唯一ID的工具,一般要满足下列特性: 为了增加ID的安全性,我们可以不直接使用Redis自增的数值,而是拼接一些其它信息: ID的组成部分:符号位:1bit,永远为0 时间戳:31bit,以秒为单位,可以使用69年 序列号:32bit,秒内的计数器,支持每秒产生2^32个不同ID 2 -Redis实现全局唯一Id @Component public class...
商户查询缓存_wx646ac5d68e755的技术博客_51CTO博客
xcxc_ 2023-06-21 16:18:49 博主文章分类:Redis ©著作权 文章标签 缓存 redis json 文章分类 Java 后端开发 yyds干货盘点 ©著作权归作者所有:来自51CTO博客作者xcxc_的原创作品,请联系作者获取转载授权,否则将追究法律责任 什么是缓存 缓存就是数据交换的缓冲区,是存数据的临时地方,一般读写性能较高 添加Redis缓存 ShopServiceImpl @Override public Result queryById(Long id) { String shopJson = stringRedisTemplate.opsForValue().get(CACHE_SHOP_KEY + id); Gson gson = new Gson(); if (StrUtil.isNotBlank(shopJson)) { Shop shop = gson.fromJson(shopJson, Shop.class); return Result.ok(shop); } Shop shop = this.getById(id); if...
网站怎么接入微信扫码支付? - 自律即自由- - 博客园
1、微信支付产品介绍 参考资料:产品中心 - 微信支付商户平台 (qq.com) 付款码支付、JSAPI支付、小程序支付、Native支付、APP支付、刷脸支付 1.1、付款码支付 用户展示微信钱包内的“付款码”给商家,商家扫描后直接完成支付,适用于线下面对面收银的场景。 1.2、JSAPI支付 线下场所:商户展示一个支付二维码,用户使用微信扫描二维码后,输入需要支付的金额,完成支付。 公众号场景:用户在微信内进入商家公众号,打开某个页面,选择某个产品,完成支付。 PC网站场景:在网站中展示二维码,用户使用微信扫描二维码,输入需要支付的金额,完成支付。 1.3、小程序支付 在微信小程序平台内实现支付的功能。 1.4、Native支付 Native支付是指商户展示支付二维码,用户再用微信“扫一扫”完成支付的模式。这种方式适用于PC网站。 1.5、APP支付 商户通过在移动端独立的APP应用程序中集成微信支付模块,完成支付。 1.6、刷脸支付 用户在刷脸设备前通过摄像头刷脸、识别身份后进行的一种支付方式。 2、接口版本...
尚医通day13【预约挂号】(内附源码) - 自律即自由- - 博客园
预约挂号 根据预约周期,展示可预约日期,根据有号、无号、约满等状态展示不同颜色,以示区分 可预约最后一个日期为即将放号日期 选择一个日期展示当天可预约列表 预约确认 接口分析 (1)根据预约周期,展示可预约日期数据 (2)选择日期展示当天可预约列表 1、获取可预约日期接口 1.1、Controller service-hosp微服务创建FrontScheduleController package com.atguigu.syt.hosp.controller.front; @Api(tags = "排班") @RestController @RequestMapping("/front/hosp/schedule") public class FrontScheduleController { @Resource private ScheduleService scheduleService; @ApiOperation(value = "获取可预约排班日期数据") @ApiImplicitParams({ @ApiImplicitParam(name =...
尚医通-day12【token续期和就诊人管理】(内附源码) - 自律即自由- - 博客园
就诊人管理 就诊人列表 添加就诊人 查看就诊人 ![image-20230225060710 管理员系统用户管理 前面我们完成了用户登录、用户认证与就诊人管理,现在我们需要把这些信息在我们的平台管理系统中进行统一管理 用户列表 用户详情 简单的设置redis和cookie的过期时间,会导致用户在操作的过程中掉线,为了解决这个问题,我们可以使用token续期的方案,具体的做法是生成一个刷新token。 1、存储token 设置token与refreshToken,都包含用户信息(userId、name、headimgurl),可以一样可以不一样,refreshToken比token时间更长,如token30分钟,refreshToken60分钟 在ApiWxController的callback方法的return "redirect:"前面,将之前的生成token和存储token的相关代码封装到saveToken方法中。 将如下代码进行封装: 封装成如下代码: @Resource private AuthContextHolder authContextHolder; UserVo...
Java简单实现短信验证登录(Session、Redis)_Big-Peng的博客-CSDN博客
前端设计 <div class="login-form"> <div style="display: flex; justify-content: space-between"> <el-input style="width: 60%" placeholder="请输入手机号" v-model="form.phone" > </el-input> <el-button style="width: 38%" @click="sendCode" type="success" :disabled="disabled">{{codeBtnMsg}}</el-button> </div> <div style="height: 5px"></div> <el-input placeholder="请输入验证码" v-model="form.code"> </el-input> <div style="text-align: center; color: #8c939d;margin: 5px 0">未注册的手机号码验证后自动创建账户</div> <el-button...
基于springboot+Redis的前后端分离项目(一)-【黑马点评】_添砖&JAVA的博客-CSDN博客
黑马点评项目是前后端分离项目,前端部署在nginx服务器上,后端部署在tomcat上,具体将实现以下功能。 短信登录 这一块我们会使用redis共享session来实现。 商户查询缓存 通过学习,我们会理解缓存击穿,缓存穿透,缓存雪崩等问题。 优惠卷秒杀 通过学习,我们可以学会Redis的计数器功能, 结合Lua完成高性能的redis操作,同时学会Redis分布式锁的原理,包括Redis的三种消息队列。 附近的商户 我们利用Redis的GEOHash来完成对于地理坐标的操作。 UV统计 主要是使用Redis来完成统计功能 用户签到 使用Redis的BitMap数据统计功能 好友关注 基于Set集合的关注、取消关注,共同关注等等功能。 达人探店 基于List来完成点赞列表的操作,同时基于SortedSet来完成点赞的排行榜功能。 整个项目需要实现的功能如下图。 start nginx.exe 1.基于Session实现登录的方式 发送验证码: 用户在提交手机号后,会校验手机号是否合法,如果不合法,则要求用户重新输入手机号...
一、阿里云oss_加贝力口贝的博客-CSDN博客
用户认证需要上传证件图片、首页轮播也需要上传图片,因此我们要做文件服务,阿里云oss是一个很好的分布式文件服务系统,所以我们只需要集成阿里云oss即可 1、开通“对象存储OSS”服务 (1)申请阿里云账号 (2)实名认证 (3)开通“对象存储OSS”服务 (4)进入管理控制台 1.1创建Bucket 选择:标准存储、公共读、不开通 1.2上传默认头像 创建文件夹avatar,上传默认的用户头像 1.3获取用户acesskeys 2、使用SDK文档 3、文件服务实现 3.1搭建service-oss模块 3.1.1 搭建service-oss模块 搭建过程参考service-user模块 3.1.2 修改配置 1、修改pom.xml,引入阿里云oss依赖 <dependencies> <dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> </dependency> <dependency> <groupId>joda-time</groupId>...
基于数据库实现乐观锁_数据库乐观锁_伏加特遇上西柚的博客-CSDN博客
悲观锁: 悲观锁可以实现对于数据的串行化执行,比如syn,和lock都是悲观锁的代表,同时,悲观锁中又可以再细分为公平锁,非公平锁,可重入锁,等等 乐观锁: 乐观锁一般会使用版本号机制或 CAS 算法实现,CAS 算法相对来说更多一些,这里需要格外注意。 版本号机制 一般是在数据表中加上一个数据版本号 version 字段,表示数据被修改的次数。当数据被修改时,version 值会加一。当线程 A 要更新数据值时,在读取数据的同时也会读取 version 值,在提交更新时,若刚才读取到的 version 值为当前数据库中的 version 值相等时才更新,否则重试更新操作,直到更新成功。 CAS 算法 乐观锁的典型代表:就是cas,利用cas进行无锁化机制加锁,var5 是操作前读取的内存值,while中的var1+var2 是预估值,如果预估值 == 内存值,则代表中间没有被人修改过,此时就将新值去替换 内存值 其中do while 是为了在操作失败时,再次进行自旋操作,即把之前的逻辑再操作一次。 int var5; do { var5 =...
springboot整合vue2-uploader文件分片上传、秒传、断点续传_染〞夏的博客-CSDN博客
1:vue-simple-uploader介绍 vue-simple-uploader是基于 simple-uploader.js 封装的vue上传插件。它的优点包括且不限于以下几种: 支持文件、多文件、文件夹上传;支持拖拽文件、文件夹上传 可暂停、继续上传 错误处理 支持“秒传”,通过文件判断服务端是否已存在从而实现“秒传” 分片上传 支持进度、预估剩余时间、出错自动重试、重传等操作 2:图片便于理解: 秒传:(将文件使用MD5加密,生成一个串,我们拿到这个串到redis 中查看是否存在) 3:服务端Java代码 3.1 UploaderController package com.xialj.demoend.controller; import com.xialj.demoend.common.RestApiResponse; import com.xialj.demoend.common.Result; import com.xialj.demoend.dto.FileChunkDTO; import...
黑马点评总结_程序员辉code的博客-CSDN博客
此处笔记参考了鱼皮哥还有黑马提供的笔记来实现的。 ⿊马点评是⼀个⼤量使⽤Redis的项⽬,该项⽬的功能类似⼤众点评 界面: 数据库表: 后端代码: config 目录:存放项目依赖相关配置 MvcConfig:配置了登录、自动刷新登录 Token 的拦截器 MybatisConfig:配置 MyBatis Plus 分页插件 RedissonConfig:创建单例 Redisson 客户端,Redisson配置类 WebExceptionAdvice:全局响应拦截器 controller 目录:存放 Restful 风格的 API 接口 dto 目录:存放业务封装类,如 Result 通用响应封装(不推荐学习它的写法) entity 目录:存放和数据库对应的 Java POJO,一般是用 MyBatisX 等插件自动生成 mapper 目录:存放操作数据库的代码,基本没有自定义 SQL,都是复用了 MyBatis Plus 的方法,不做重点学习。 service 目录:存放业务逻辑处理代码,需要重点学习 BlogServiceImpl:基于 Redis...
前后端分离项目中实现业务中常用图形验证码验证功能(详细)_前后端分离验证码实现-CSDN博客
图形验证码的必要性 图形验证码是验证码的一种,有防止黑客对某一特定注册用户用程序暴力破解私人信息、恶意破解密码、刷票、论坛灌水的作用。 图形验证码是一种区分用户是计算机还是人的公共全自动程序。验证码是现在很多网站通行的方式,由计算机生成并评判,但是只有人类才能解答。 在常用的网站业务中我们不难看出很多登录注册业务上都采用了图形验证码的方式。今天记录一个图形验证码以后端的方式实现的逻辑。 实现效果 在登录注册业务上集成图片中验证码后的是效果如下图所示: 工具说明 这里主要推荐Hutool工具中的captcha包中的图形验证码来实现。 验证码功能位于cn.hutool.captcha包中,核心接口为ICaptcha,此接口定义了以下方法: createCode 创建验证码,实现类需同时生成随机验证码字符串和验证码图片 getCode 获取验证码的文字内容 verify 验证验证码是否正确,建议忽略大小写 write 将验证码写出到目标流中 其中write方法只有一个OutputStream,ICaptcha实现类可以根据这个方法封装写出到文件等方法。...
Java+Redis 通过Lua 完成库存扣减,创建消息队列,异步处理消息--实战
需要完成功能 借助redis Stream 数据结构实现消息队列,异步完成订单创建,其中涉及到了缓存(击穿,穿透,雪崩),锁(Redisson),并发处理,异步处理,Lua脚本 IDE:IDEA 2022 1、读取库存数据 【Lua】 2、判断库存 【Lua】 3、扣减库存 【Lua】 4、创建队列和组 【Java】 5、发送队列消息 【Lua】 6、消息读取并处理 【Java】 在完成功能之前 ,需要了解一下redis 中有关stream 数据结构相关的命令 XACK:确认消息已经处理,redis 会在PEL(pending entries List )中移除一个或多个消息。一般情况下 一个消息被 XREADGROUP 或 XCLAIM之后会被写入PEL。 XADD: 把消息(Entry ,key-value)追加到队列,默认如果队列不存在会创建,除非使用 NOMKSTREAM ,之后 可以通过XREAD ,XREANGE 等命令读取或通过XDEL,XTRIM移除消息 XCLAIM,XAUTOCLAIM 改变PEL 中的消息的所有者...
MybatisPlus实现分页效果并解决错误:cant found IPage for args!
前言 早就知道MybatisPlus对分页进行了处理,但是一直没有实战用过,用的是自己封装的一个分页组件,虽不说麻烦吧,但是也不是特别简单。 写起来还是比较复杂,但是最近这个组件有了点小小的bug,我决定是时候放弃它了,毅然加入光荣的进化。 然后我就去摸索使用MybatisPlus封装的分页组件,不用不知道,一用吓一跳。不得不说是真香啊!功能强大且使用简单 吹了这么多,下面就简单下如何使用MybatisPlus实现分页效果 简单说明 核心代码其实就这几行: Page<ProjectBiddVO> page = new Page<>(pageNo,pageSize); IPage<ProjectBiddVO> projectBiddVOS = projectBiddService.queryListInfo(page,projectBiddvo); Page就是根据当前页数和显示条数得到的一个结果集 其中,IPage 是分页的关键,将我们需要分页的条件用Page处理,即可达到分页效果。 可以看到有很多里面方法 代码实现 实现起来特别简单,两行代码即可 下面是相关的代码,供大家参考:...
Show More
loading
Actions
Is this you?
As a journalist, you can create a free Muck Rack account to customize your profile, list your contact preferences, and upload a portfolio of your best work.Get in touch with return
Contact return, search articles and posts on X, monitor coverage, and track replies from one place.
Learn more about Muck Rack