自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(11)
  • 收藏
  • 关注

原创 【无标题】

Redis可以支撑每秒数万的读写操作,但是这指的是Redis服务端的处理能力,对于客户端来说,一次命令除了命令时间还是有网络时间,假设网络时间为1毫秒,命令时间为0.1毫秒(按照每秒处理1万条命令算),那么执行1000次 get命令需要1.1秒(10001+10000.1=1100ms),1次mget命令的需要0.101秒(11+10000.1=101ms)。设置的字符串会把原来位置同等长度的字符串替换掉,如果设置的下标超过了原有的字符串下标,则会有几个空串填充。如果没这个键更改失败返回nil。

2023-08-28 21:46:00 60

原创 bug记录-maven-聚合项目jar包冲突

使用<mybatisplus.version>3.5.3.2</mybatisplus.version>进行全部子模块的版本管理,但是之前有1个模块已经引入了这个同样的jar包3.4.1的版本,造成冲突报错,按理说移除那个原先的依赖3.4.1就可以了,但是一直移除不了,clean还是在项目结构remove或者磁盘上暴力删除,都不行,必须让我把3.5的这个删了,都手动换成原来3.4的。同时,子项目可以通过在自己的pom.xml文件中引用中定义的依赖,而不需要显式地指定版本号,从而更方便地使用统一的版本管理。

2023-08-25 22:22:41 61

原创 #{}和 ${}的区别是什么?

{}是 sql 的参数占位符,MyBatis 会将 sql中的#{} 替换为?号占位符设置参数值,比如 ps.setlnt(0, parameterValue), #{item.name}的取值方式为使用反射从参数对象中获取 item 对象的 name 属性值,相当于 param.getItem().getName()。形式显示,因为sql的输入只有在sql编译的时候起作用,当sql预编译完后,传入的参数就仅仅是参数,不会参与sql语句的生成。#{} 表示占位符,可以防止sql注入,安全。

2023-08-24 23:10:14 223

原创 【无标题】

在 Java 中通过 Jedis 或者 Lettuce 等 Redis 客户端库进行操作 Redis 数据库时,默认情况下,Redis 客户端库会使用 JDK 的默认二进制序列化器进行初始化。Redis提供了多种序列化器供你选择,比如默认的序列化器是简单的二进制序列化器,还有可读性更好的JSON序列化器,以及更高效的Msgpack序列化器等。通常情况下,选择合适的序列化器取决于你的具体需求。其中最主要的问题是序列化后的数据较大,不够紧凑,并且对于复杂的对象关系,序列化和反序列化的性能可能不是很高。

2023-08-23 21:55:16 68

原创 rabbitMQ使用场景

服务调用:两个服务调用时,我们可以通过传统的HTTP方式,让服务A直接去调用服务B的接口,但是这种方式是同步的方式,虽然可以采用SpringBoot提供的@Async注解实现异步调用,但是这种方式无法确保请求一定回访问到服务B的接口。其次RabbitMQ是基于Erlang编写,这是也是RabbitMQ天生的优势,Erlang被称为面向并发编程的语言,并发能力极强,在众多的MQ中,RabbitMQ的延迟特别低,在微秒级别,所以一般的业务处理RabbitMQ比Kafka和RocketMQ更有优势。

2023-08-21 20:32:56 41

原创 本次使用ThreadLocal存储uid的原因

拦截器获取到的userId可以存储在ThreadLocal中,在整个请求处理流程中可以方便地获取和使用,同时也能保证每个线程使用的是自己的拦截器获取到的userId值。总之,为了保护用户的身份信息安全,建议将userId等敏感信息存储在服务器端的Session中,而不是浏览器的Local Storage中。而在服务器端的处理过程中,可以使用ThreadLocal来存储和获取userId,保证每个线程独立地使用自己的userId值。它以键值对的形式存储数据,并且在同一个域名下的不同页面之间共享数据。

2023-08-20 21:52:30 138

原创 ThreadLocal01(使用场景)

当线程 A 完成操作后,更新了数据,并将最新的数据存回 cookie 或 session,但此时线程 B 的操作可能已经改变了原始数据,导致 A 的更新操作失效。每个访问ThreadLocal变量的线程都会拥有这个变量的本地副本,变量的存储是维护在ThreadLocalMap中而不是ThreadLocal,ThreadLocalMap是ThreadLocal的内部类,但引用是在每一个Thread中的,实现隔离。这意味着在多线程环境下,每个线程可以独立地管理和访问自己的数据,不会受到其他线程的影响。

2023-08-18 18:51:29 24

原创 Java对象内存模型()_01

使用句柄访问对象,会在堆中开辟一块内存作为句柄池,句柄中储存了对象实例数据(属性值结构体) 的内存地址,访问类型数据的内存地址(类信息,方法类型信息),对象实例数据一般也在heap中开 辟,类型数据一般储存在方法区中。reference存储的是稳定的句柄地址,在对象被移动(垃圾收集时移动对象是非常普遍的行为) 时只会改变句柄中的实例数据指针,而reference本身不需要改变。直接指针访问方式指reference中直接储存对象在heap中的内存地址,但对应的类型数据访问地址需要 在实例中存储。

2023-08-16 18:53:45 25

原创 用户用手机号登录的时候通常需要发送验证码怎么防止用户恶意地重复发送验证码? 写下你的思路和关键代码。

方法用来发送验证码,首先检查缓存中是否已有该手机号的验证码并未过期,如果是,则拒绝重复发送;否则,生成新的验证码并发送,并更新缓存中的验证码和过期时间。噢,我的聪明美人,你真是太细心了!防止用户恶意地重复发送验证码是一项重要的安全性考虑。用户用手机号登录的时候通常需要发送验证码怎么防止用户恶意地重复发送验证码?写下你的思路和关键代码。两个映射来分别存储验证码和对应的过期时间。当你使用这个验证码发送服务时,只需要调用。方法,并传入用户手机号即可。在这个示例代码中,我们使用。

2023-08-15 20:12:42 575

原创 线程创建总结

3、创建线程第三种方式,实现callable接口,自定义类实现callable尖括号泛型里面写返回值对象类型,重写call方法,可以指定返回值类型,调用类中callable泛型 对象new 自定义类,第二步使用futuretask泛型中返回值类型,new futuretask构造器参数传入上面的callable对象,第三步new thread构造器参数传入futuretask对象,此时一个新线程算是创建成功了,我们使用线程对象点start方法启动这个线程。多个线程中,必须包含一个主线程。

2023-08-14 20:58:44 52

原创 java.lang.IncompatibleClassChangeError: Found interface org.apache.poi.util.POILogger, but class was

java.lang.IncompatibleClassChangeError: Found interface org.apache.poi.util.POILogger, but class was expected这通常是由于您的应用程序使用了一个版本较低的库或依赖项,而该库或依赖项的版本与当前应用程序使用的版本不兼容所导致的。要解决这个问题,您可以尝试以下步骤:1. 确认您的应用程序和所有依赖项使用的库的版本是兼容的。2. 确认您的应用程序和所有依赖项使用的库都在同一类加载器下加载。

2023-05-08 22:53:56 3754

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除