Redis是一个单线程的服务,所以正常来说redis的命令是会排队执行的。incr/decr命令是redis提供的可以实现递增递减的命令,所以这两个命令也是具有原子性的?是线程安全的?这个也是互联网公司面试的常见题,话不多说,动手实践一下吧,假设这两个命令是线程安全的,既然是线程安全的,那么来模拟实现高并发场景的秒杀减库存业务 软件环境: JDK1.8 SpringBoot2.2.1 Maven3.2+ Mysql8.0.26 spring-boot-starter-data-redis2.2.1 redisson-spring-boot-starter3.1.5.6 开发工具 Int...

在分布锁的实际使用中,可能会遇到一种情况,一个业务执行时间很长,已经超过redis加锁的时间,也就是锁已经释放了,但是业务还没执行完成,这时候其它线程还是可以获取锁,那就没保证线程安全 项目环境: JDK1.8 SpringBoot2.2.1 Maven3.2+ Mysql8.0.26 spring-boot-starter-data-redis2.2.1 jedis3.1.0 开发工具 IntelliJIDEA smartGit 先搭建一个springboot集成jedis的例子工程,参考我之前的博客, 抽象类,实现一些共用的逻辑 packagecom.example.jedis...

  NrKhGdPqPgIO   2023年12月23日   44   0   0 Javaredisjavaidespringspringrediside

Redis系列之基于Jedis实现分布式锁 1、为什么需要分布式锁 在单机环境,我们使用最多的是juc包里的单机锁,但是随着微服务分布式项目的普及,juc里的锁是不能控制分布锁环境的线程安全的,因为单机锁只能控制同个进程里的线程安全,不能控制多节点的线程安全,所以就需要使用分布式锁 2、redis分布式锁原理 学习之前先了解redis的命令,setnx和expire setnx命令SETNX是SETifnotexists的简写,设置key的值,如果key值不存在,则可以设置,否则不可以设置,这个有点像juc中cas锁的原理 setnx命令,相当于set和nx命令一起用 setnxtke...

SpringBoot系列之启动成功后执行业务逻辑。在Springboot项目中经常会遇到需要在项目启动成功后,加一些业务逻辑的,比如缓存的预处理,配置参数的加载等等场景,下面给出一些常有的方法 实验环境 JDK1.8 SpringBoot2.2.1 Maven3.2+ Mysql8.0.26 开发工具 IntelliJIDEA smartGit 动手实践 ApplicationRunner和CommandLineRunner 比较常有的使用Springboot框架提供的ApplicationRunner和CommandLineRunner,这两种Runner可以实现在Spring...

软件环境: JDK1.8 SpringBoot2.2.1 Maven3.2+ Mysql8.0.26 spring-boot-starter-data-redis2.2.1 jedis3.1.0 开发工具 IntelliJIDEA smartGit 实现思路 相对于set来说,sortedset是一种有序的set,排序是根据每个元素的score排序的,score相同时根据key的ASCII码排序 根据ZSET的个性,我们可以实现一个排序,同时有个序号,也可以实现分页的逻辑,下面给出一个例子,看看具体的实现 项目搭建 使用Spring官网的https://start.spring....

项目场景 Redis的keys命令在生产环境是慎用的,特别是一些并发量很大的项目,原因是Redis是单线程的,keys会引发Redis锁,占用reidsCPU,如果key数量很大而且并发是比较大的情况,效率是很慢的,很有可能导致服务雪崩,在Redis官方的文档是这样解释的,官方的推荐是使用scan命令或者集合 解决方案 搭建一个工程来实践一下,项目环境: JDK1.8 SpringBoot2.2.1 Maven3.2+ Mysql8.0.26 spring-boot-starter-data-redis2.2.1 jedis3.1.0 开发工具 IntelliJIDEA smartG...

项目场景: 在项目开发中常常会遇到在一个有数据库操作的方法中,发送MQ消息,如果这种情况消息队列效率比较快,就会出现数据库事务还没提交,消息队列已经执行业务,导致不一致问题。举个应用场景,我们提交一个订单,将流水号放在MQ里,MQ监听到后就会查询订单去做其它业务,如果这时候数据库事务还没提交,也就是没生成订单流水,MQ监听到消息就去执行业务,查询订单,肯定会出现业务不一致问题 问题描述 最近遇到一个业务场景,类似于下单过程,场景是用户注册消息,注册成功后,会发送MQ消息,MQ监听到消息后,会查询用户的信息,如何再做其它业务,但是遇到一个问题,就是mq消费消息的速度是快于数据库事务提交的,就...

项目场景 在生产环境,经常会遇到需要排查一个接口里哪里比较耗时,按照以前的做法,可能是通过打印logger,然后打补丁,重新部署 @Test voidtestNeedTime(){ longstartTime=System.currentTimeMillis(); AtomicIntegernum1=newAtomicInteger(1); IntStream.range(1,10).forEach(i->num1.incrementAndGet()); longendTime1=System.currentTimeMillis(); log.info("耗时:{}",endTi...

  NrKhGdPqPgIO   2023年12月02日   15   0   0 Javajavajar开发语言开发语言jar

开发环境 JDK1.8 SpringBoot2.2.1 Maven3.2+ Mysql5.7.36 开发工具 IntelliJIDEA smartGit 背景 在我之前的博客中,有对Springboot2.0集成MybatisPlus做了比较详细的描述,现在这篇博客介绍,基于开源的jacksonapi来自定义ObjectMapping(对象映射器),实现对实体类中的日期数据,统一格式化处理 问题描述 我们定义一个实体类 @Data publicclassUserDO{ @TableId(type=IdType.ASSIGN_ID) privateLongid; privateSt...

项目场景: 对于后端开发来说,Postman是经常使用的。特别是一些前后端分离的项目,后端开发测试接口就需要一款好用的接口测试工具,postman就是一款使用方便功能比较齐全的测试工具 问题描述 最近使用postman进行接口测试,但是打开时候,postman一直在转圈圈,所以不能进入自己的workspace 原因分析: 出现这种转圈的情况,有多种原因,有可能是因为网络不稳定,也有可能是缓存过多,window操作系统的roaming文件夹里会保存postman的缓存数据,如果测试数据过多,缓存过多的时候,打开postman就会出现转圈的现象 解决方案: 对于网络问题,只能联系网管排查...

文章目录 前言 一、开发环境 二、使用步骤 1.创建Springboot项目 2.引入hutool 3.使用TimeInterval 总结 前言 Hutool是一个小而全的Java工具类库,里面集成了很多实用的工具类,比如文件、流、加密解密、转码、正则、线程、XML等,通过这些工具类就可以快速实现开发。本博客分享HutoolTimeInterval的基本使用,通过这个工具类,以后代码里就不需要为了打印代码执行时间,写了很多System.currentTimeMillis()来计算了 官网:https://hutool.cn/ 一、开发环境 SpringBoot2.2.1...

开发环境 JDK1.8 SpringBoot2.2.1 Maven3.2+ Mysql5.7.36 开发工具 IntelliJIDEA smartGit 项目场景 在项目中经常会遇到需要自动填充数据的情况,比如新增一个DO类,里面可能会有id、create_time、modify_time、create_user等等这些通用的字段,每一个接口我们都要去设置值,不仅代码冗余,而且不能统一管理 解决方案: 针对这种情况,可以使用MybatisPlus来对通用数据的自动填充,在我之前的博客中,已经对怎么在Springboot2.0中集成MybatisPlus做了比较详细的描述,下面给一个...

软件环境 JDK1.8 SpringBoot2.2.1 Maven3.2+ Mysql8.0.26 redis6.2.14 MybatisPlus3.4.3.4 开发工具 IntelliJIDEA smartGit 一、实现原理 使用Redis来实现分布式的主键自增主要是依赖于Redis的INCR命令,调用INCR命令的对应key,其数值是实现递增加一,所以利用这个性质,将redis独立部署起来就可以实现分布式环境的自增ID,如图,使用INCR命令的例子 二、实践 本博客写一个基于redis、mybatis-plus的例子,主要介绍一下redis分布式ID的基本使用 首先,快速新建...

Redisson是一款基于java开发的开源项目,提供了很多企业级实践,比如分布式锁、消息队列、异步执行等功能。本文基于Springboot2版本集成redisson-spring-boot-starter实现redisson的基本应用 软件环境: JDK1.8 SpringBoot2.2.1 Maven3.2+ Mysql8.0.26 redisson-spring-boot-starter3.15.6 开发工具 IntelliJIDEA smartGit 项目搭建: 快速新建一个SpringInitializr项目,serviceurl就选择这个https://start.al...

文章目录 前言 一、cygwin是什么? 二、cygwin安装 Redis源码编译 前言 在学习到redis,经常需要用到一个redis服务端,如果有买服务器或者本机可以支持经常开虚拟机,也是可以的,如果不具备这些条件,还是本机window系统直接安装一个redis服务端方便。 不过新的版本,在微软维护的redis版本库已经很久没更新了,看了一下,最高版本才3.x 所以需要自己进行制作window版本的redis服务端,这里介绍一种方法,可以使用cygwin工具来制作EXE文件 一、cygwin是什么? Cygwin是开源工具的大型集合平台,它提供了可以在window系统运行L...

文章目录 String 简单介绍 常见命令 应用场景 Hash 简单介绍 常见命令 应用场景 List 简单介绍 常见命令 应用场景 Set 简单介绍 常见命令 应用场景 SortedSet(Zset) 简单介绍 常见命令 应用场景 Bitmap 简单介绍 常见命令 应用场景 附录 Redis支持多种数据类型,比如String、hash、list、Set、SortedSet、Streams、Bitmap、Hyperloglog、Geo(物理位置)等等,在 官网也给出了说明,本博客就挑一些比较常有的数据类型说说,本文例子基于Rediss...

Git回退代码版本 在项目的开发中,有时候还是会出现,一些误提交了一些代码,这时候就会想撤回提交的代码,在Git中有两种方法可以使用,现在通过对比方法比较这两种方法的区别,分别适用于哪些情况? 在Git中回退代码,经常使用revert或者reset来做,这两种操作都可以用来回退,但是却有比较大的区别,一般比较安全性的还是使用revert来做,revert是撤回对应的提交记录,然后再提交撤回记录,只是会在Git历史里多一些记录,reset的操作是直接将git历史回退到对应的版本,之后的记录全都撤回了,所以除非情况允许,不然不建议使用 gitrevert操作 gitrevert:revert撤回...

  NrKhGdPqPgIO   2023年11月13日   15   0   0 暂存区git重置暂存区git重置

今天说一下老生常谈的问题,正向代理和反向代理的区别?几年前也看过这个问题,也是一个常见的面试题,不过最近去面试时候,竟然也被问到这个问题。所以本博客整理一下资料,尽量写得通俗易懂一些。 1、定义 正向代理:正向代理是一个位于客户端和目标服务端的代理服务器。客户端向代理服务器发送请求,并且指定目标服务端,然后代理服务器会去帮忙代理请求,向目标服务器请求获取到响应后,将响应内容返回给客户端。 反向代理:反向代理正好相反,对于客户端来说,代理服务器就好像目标服务器一样,客户端是直接访问代理服务器,代理服务器后台会进行转发到对应目标服务器,对客户端来说是看不到的,客户端不知道具体是哪个目标服务器,但...

1.什么是负载均衡? 负载均衡是一种基础的网络服务,它的核心原理是按照指定的负载均衡算法,将请求分配到后端服务集群上,从而为系统提供并行处理和高可用的能力。提到负载均衡,你可能想到nginx。对于负载均衡,一般分为服务端负载均衡和客户端负载均衡 服务端负载均衡:在消费者和服务提供方中间使用独立的代理方式进行负载,有硬件的负载均衡器,比如F5,也有软件,比如Nginx。 在这里插入图片描述 客户端负载均衡:所谓客户端负载均衡,就是客户端根据自己的请求情况做负载,本文介绍的NetflixRibbon就是客户端负载均衡的组件 在这里插入图片描述 2.什么是NetflixRibbon? 在...

@[toc] 1、前言摘要 在网站随便抓个链接来看看: Referer参数: 在这里插入图片描述 referrerpolicy是unsafeurl的,ok,下面介绍一下Referer和referrerpolicy 在这里插入图片描述 2、Referer简介 referer参数是http请求头header里的一个关键参数,表示的意思是链接的来源地址,比如在页面引入图片、JS等资源,或者跳转链接,一般不修改策略,都会带上Referer 3、Referer安全性 Referer这个httpheader的参数应用得当的话,是可以提高安全性的,比如,可以这个参数其实就告诉了链接的请求来源于哪个网站...

  NrKhGdPqPgIO   2023年11月12日   15   0   0 同源策略官网跨域
关注 更多

空空如也 ~ ~

粉丝 更多

空空如也 ~ ~