自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 redis是单线程模型,为何能如此之快???

1.redis访问的是内存,而关系型数据库访问的是硬盘。2.redis的核心功能比关系型数据库的核心功能要简单。(数据库对于增删改查都有更复杂的功能支持,这样的功能肯定需要更多的资源花销,比如针对插入删除,关系型数据库中有着各种各样的约束,都会使关系型数据库做额外的工作,导致效率变慢) 3.redis的单线程模型避免了一些不必要的线程竞争开销。

2025-04-09 11:56:15 184

原创 redis中的key的过期策略是如何实现的

1.定期删除:每次抽取部分key,进行验证过期时间(要保证抽取检查的时间要迅速),如果过期了就要删除。(为什么会对时间有要求?原因:因为redis是单线程的程序,如果扫描key的时间过长,就可能会导致正常处理请求的命令出现阻塞)2.惰性删除:假设一个key已经到达了过期时间,但是redis的服务器并没有对其进行删除,而是等到下一次程序访问到这个key时再对其进行删除,然后redis服务器再返回一个nil。虽然有了这两种删除key的策略,但是还是会存在个别的key过期了还没有删除掉。

2025-04-03 15:27:11 217

原创 单例模式(java)

相比于线程不安全的懒汉模式来说,多了一个锁对象,在准备创建实例之前加上了锁,保证了线程安全,在加锁之前还进行了对对象是否为空进行了一个判定,因为在多线程中,可能判断完之后,符合要求了,但是另一个线程偷偷的修改了对象的值,从而会引发线程安全问题。单例模式分为饿汉、懒汉模式,饿汉模式和懒汉模式中的饿汉、懒汉都是一个比喻。饿汉指的是很迫切创建,而懒汉指的是你不需要我就不创建,等你需要的时候我才创建。缺点:1.在多线程的环境下是线程不安全的,因为涉及到创建实例。懒汉的优点:1.不会造成资源的浪费。

2025-01-20 20:24:44 294

原创 关于java中的锁策略

(使用自旋锁的前提是预估当前线程中的锁冲突的概率不大,其他线程释放锁可以第一时间拿到锁,如果当前加锁的线程特别多,自旋的意义就不大,就会白白浪费cpu资源)挂起等待锁:挂起等待锁是重量级锁(进行挂起等待时就需要内核调度器介入,这样完成的操作就会变多,真正取到锁花的时间也更多了)的典型实现。而我们java中的synchronized是一个自适应锁,它具有自适应能力,当线程的锁冲突较大时它可以时悲观锁/重量级锁/挂起等待锁,当线程冲突比较小时,他也可以时乐观锁/轻量级锁/自旋锁。第一组锁策略:乐观锁与悲观锁。

2025-01-20 19:52:02 342

原创 关于MyBatis中的「#」和「$」符号

因为在数据库中对于Varchar的赋值是需要用到单引号来概括的,而#{ }会对我们需要传参的数据加上‘ ’,这样就不会报错了例如:select*from userinfo where name =#{username};3.#{ }可以防止sql的注入,而${ }存在着sql注入的风险,所以能使用#{ }就尽量使用#{ }。但并不是所有的场景都适用于使用#{ },例如 排序功能、表名、字段名作为参数时,就不适合使用#{ }来进行传参了,因为#{ }为给他们都加上‘ ’,在这些情况就需要使用${ }了。

2024-10-17 13:00:28 1060

原创 IP协议的基本工作原理

这个时候我们发送的数据经过路由器,想进一步的转发,就会将IP报头中的源IP进行替换,把IP换成了WAN口IP,而服务器是无法感知到我的局域网IP的。路由器(集成NAT),一般一个路由器都会带有两个IP地址,一个LAN口IP,一般是局域网IP,一个WAN口IP,可能是局域网IP,也可能是广域网IP,路由器的核心就是把这两个局域网连接起来。比如现在我的IP数据报为170kb,按照IP协议的载荷64kb的限制,那么我需要将其拆分为三份,以三个数据报的形式发给数据链路层,每一份数据报都装载着这份数据的内容。

2024-10-12 08:58:52 492

原创 关于volatile关键字

如果一个线程修改了变量的值,其他的线程可能无法立即的感知到这个变量的变化。使用volatile关键字修饰的变量,可以保证线程每次都会从主内存中读取到最新的值,而不是从缓存中读取,从而保证了内存的可见性。对于一个volatile变量的写操作会在该写操作之前的所有普通读写操作完成之后进行,对一个volatile变量的读操作会在所有普通读写操作开始之前进行。在java中,volatile是一种轻量级的同步机制,用来确保一个变量的更新能被及时的被其他线程看见,保证了变量的可见性。volatile的使用场景。

2024-09-19 14:37:42 329

原创 java死锁

互斥是指某些资源在同一时间时只能被一个进程/线程所拥有,其他进程/线程想要获取这个资源必须等拥有资源的进程/线程释放资源后才能获取。某个进程/线程已经占有了一部分的资源后还在等待其他的资源。死锁的发生是因为多个进程/线程在相互等待对方释放资源从而获取对方的锁,结果大家都会进入死锁的状态。4.如果进程/线程等待资源的时间太久,就自动释放资源再重新尝试获取资源。5.如果进程/线程拿不到其他资源,就先释放已有的资源,等待下一次的申请。t1线程会无休止的等待lock2而t2线程会无休止的等待lock1。

2024-09-19 13:47:20 485

原创 关于tcp的一些重要特性

我们在学习和工作中用到最多的传输层协议就是:tcp。那么为什么我们在学习的工程中用到的最多的传输层协议是tcp呢?他有哪些优点? 首先 tcp是有连接,可靠传输(这里的可靠并不是说一定可以传输到对端,而是说可以知道对端是否可以收到我们的信息),面向字节流,全双工的通信协议。而udp是无连接,不可靠传输,面向数据报,全双工的通信协议。tcp的优缺点:tcp的传输可靠性高,对端更容易收到我们要传输的信息。我们引入了一些其他特性来保障了tcp的可靠性,由于其他的特性的一些机制从而

2024-09-19 12:59:08 662

原创 关于java的进程与线程的关系

(在这里给大家解释一下匿名内部类 匿名内部类的特征:1.没有名字 2.只能创建一次,不能复用3.可以实现接口或继承类 主要用于简化代码,不用显式的创建一个新的类文件 还能达到一定的封装效果。我推荐大家使用lambda表达式(匿名函数)来创建线程,因为代码结构简洁 清晰明了,减少了代码的冗余,提高了代码的可读性。System.out.println("我是main线程!System.out.println("我是main线程!System.out.println("我是main线程");

2024-09-09 10:32:11 620 1

空空如也

空空如也

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

TA关注的人

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