- 博客(23)
- 收藏
- 关注
原创 设计模式-工厂设计模式
4.无法解决多维度问题,比如同一个产品但是不同厂商,像是华为的手机和小米的手机,都是手机,但是要用工厂设计模式要写两个工厂类,目前还没问题,但是一旦产品多了起来,华为的有手机,笔记本,小米的有吹风机,手机,笔记本,这就是五个工厂,两个手机厂,两个电脑厂,一个吹风机厂,随着产品越来越多,扩展也越多,这就会导致代码堆叠的毫无章法.其中使用最多的是工厂设计模式,其次是抽象工厂模式,简单工厂模式因为其扩展性较差,而且工厂设计模式是简单工厂模式的升级,简单设计模式存在的意义就是更好的理解工厂设计模式。
2024-11-06 15:17:20
381
原创 设计模式-迭代器
应用场景 1 ,3,4 是利用了迭代器的特点,要完成第2个应用场景需要能够自定义迭代器,只需要自定义一个迭代器类来实现Interator接口,覆写hasNext()方法和next()方法。因为迭代器内部会有一个Collertion<T> 来拷贝一份相同的集合,所以迭代器的遍历行为不会对原来的集合造成影响。使用迭代器可以简化代码,特别是在处理复杂的数据结构时,迭代器可以隐藏遍历的复杂性。在多线程环境中,迭代器可以提供一种线程安全的方式来遍历聚合对象。3:迭代器的遍历开始时,不影响对原来的集合做读写操作。
2024-11-06 14:50:16
441
原创 设计模式-构建者
例如一个汽车是一个抽象概念,车会具体到很多种,不同的发动机,车身,轮胎等等构建一个具体的车,所以这个具体对象创建有很多种可能.因此可以使用构建者设计模式。构建者是一种用于创建对象时将对象的构建过程和表示分离的设计模式,适用于构造过程复杂的对象和创建需要多种变化的场景使用.简单的对象创建用不到,强行使用会导致大量的构建者让代码复杂。可以写多个构建者,用不同的方式构建同样的对象。新的构建者不影响已有的代码,符合开闭原则。
2024-11-06 14:39:34
433
原创 redis数据淘汰策略
allkeys-lfu:对全体key,基于lfu算法淘汰 (lfu 是Least Frequently Used) 最少频率使用,会统计每个key的访问频率,值越小淘汰优先级越高。数据淘汰策略:当Redis中的内存不够时,此时再向Redis中添加新的key,那么Redis就会按照某一种规则内存中的数据删除掉,这种数据删除规则被称之为内存的淘汰策略。volatile-ttl:对设置了TTL的key,比较key的剩余TTL值,TTL越小越先被淘汰 (ttl代表生存时间)
2024-10-31 15:13:42
352
原创 redis的数据过期策略
Redis对数据设置了数据的有效时间,数据过期之后,就需要将数据从内存中删除掉.可以按照不同的规则进行删除,这种删除规则就被称之为数据的删除策略(数据过期策略),而这种策略有两种:惰性删除和定期删除。定期删除:每隔一段时间,就会对一些key进行检查,删除里面过期的key(从一定数量的数据中取出一定数量的随机key进行检查),并删除其中的过期key.惰性删除:设置key过期时间后,我们不去管它,当需要该key时,我们在检查其是否过期,如果过期,我们就删掉它,反之返回该key。
2024-10-31 14:55:54
436
原创 redis缓存持久化
需要写入RDB的数据存放在物理内存中,但是linux不能直接从物理内存中取得数据,操作系统会开辟一个虚拟内存,并生成一个页表来存储虚拟内存和物理内存的映射关系,主进程会fork一个子进程,并把页表复制给子进程,这样子进程可以直接从页表中获取数据写一个新的RDB文件替换掉旧的RDB文件,.这时如果主进程执行了写操作,可能会导致脏数据,为了避免这种情况,fork采用copy-on-write技术,物理内存中的数据会拷贝一份,将写数据在拷贝的内存中执行,读数据也会在拷贝的数据中.
2024-10-31 14:31:46
386
原创 redis做缓存,mysql的数据怎么与redis进行同步(双写一致性)
写操作:延迟双删 :先删除缓存,修改数据库,等待延迟(数据库主从节点,读写分离,需要等待主节点数据传给从节点的数据库,从节点负责被其他线程读取,只有从节点的数据正确的时候再被读取才能够保证新的缓存是正确的),再删除缓存,等其他线程读取从节点数据写新的缓存数据到缓存中,但是延迟时间不好掌握,时间短了依然会有脏数据,时间长了性能太差。读操作:缓存命中,直接返回数据,缓存没有命中,查询数据库,写入缓存,设定过期时间。线程2:等待锁,加锁,读缓存未命中,读取数据库,更新缓存,解锁。允许延迟一致:采用异步通知。
2024-10-31 11:14:21
567
1
原创 Redis缓存三兄弟(穿透,击穿,雪崩)
发生情况:redis正常使用情况是当服务器接收一个get请求,请求行携带的id在redis中不存在但是在数据库中存在,就会先查询redis,redis查询不到再查询DB,然后DB返回查询的结果,将返回的数据存储到redis中,但发生穿透时的情况是请求行的id或者其他数据在redis中不存在,在DB中也不存在,这时DB没有返回值,也不能将数据存储在redis中,在这种情况下,当有人恶意发送请求攻击DB,会导致DB崩溃.线程1:查询缓存未命中,获取互斥锁,查询数据库,并重建缓存数据,写入缓存,释放互斥锁。
2024-10-31 10:38:21
408
原创 “TypeError: Cannot set properties of undefined (setting ‘type‘)“
分析得出,这句代码的上下文在axios中, 导致this 代表的是window,而不是当前的数据模型。
2024-07-31 19:21:55
822
原创 学习日志_xx MySQL
范围不同:内连接是取两个表交集的部分 ,比如 有个部门里面有很多员工 ,员工表里有部门表的外键,就可以通过外键 与 部门表连接,这样就能生成一个更大的虚拟表 ,但是如果有员工刚入公司,没有分配部门 ,那么这个员工就会在员工表中也在交集之外,这个内连接的表中没有他的信息,同理 ,一个部门刚刚成立 也没有员工 ,就会在交集之外。子查询就是在查询的SQL语句中再次插入一个新的查询语句(select ... from ...),可以存在在 select 后面的 字段列表里 ,可以在条件语句里参与大小比较。
2024-07-17 16:41:10
949
原创 学习日志_07 集合
List特性:有序可重复有序:添加顺序和取出顺序一致可重复:可以保存相同的数据ArrayList:底层是一个Object数组,查询和修改效率极高,随机性添加和删除效率较低,适合二分法查找LinkedList:底层是一个双向链表,随机性添加和删除效率较高,但是查询和修改效率较低特性:无序不可重复无序:不保证有序,存入顺序会被打乱,但是因为在随机的顺序中可能与存入的顺序一致,因此这里的无序又是不保证有序。不可重复:无法保存相同的数据。HashSet:底层是HashMap,本质上是散列表。
2024-07-10 15:52:41
797
原创 学习日志_04 面向对象
this:是每个对象中第一个成员变量,用于保存当前对象的内存地址this只能出现在构造方法和成员方法中,不能在静态上下文中使用abstract 修饰符,表示抽象的修饰的类 是抽象类,抽象类不能创建对象 (专门用来被继承的)修饰的方法 是抽象方法,抽象方法没有方法体(专门用来覆写的,抽象方法只存在在抽象类中)抽象方法必须在抽象类中,而抽象类中,可以没有抽象方法抽象类往往用来表示设计中得出的抽象概念:比如,动物类,自然界没有一个种族叫做动物,不能代表实体,这个时候我们称这个类为抽象类。
2024-06-02 11:35:44
1911
原创 CE制作EXE文件教程
接上文ce修改植物大战僵尸,这里以修改阳光不消耗为例:截止到这里的教程详情请看右键因为种植植物导致的数值改动的值,点击反汇编程序中显示地址左键单击选中改动的目标然后点击工具,选择自动汇编然后点击模板,依次点击CT表框架代码和代码注入向下找到与操作码一致的那一行代码(mov)用空指针nop代替(这一步代表让植物种植不在能改写阳光数)删掉,换成nop。
2024-05-29 04:23:41
1524
原创 Java数组创建中int[] a 和int a[]的区别
都创建了一个包含3个整数的数组,结果相同。它们之间的区别只是语法上的不同,表示相同的含义。这种写法更清晰和易读,因为数组的类型和名称紧密相连,而不是将类型和名称分开。会发现无论哪个创建方式都能编译运行,且运行结果相同,例如。在实际中,更常见和推荐的写法是。
2024-05-28 18:06:17
669
原创 学习日志_03 数组,二维数组,排序 ,查找元素
就是计算机存储和组织数据的一种方式,存储方式不同,带来的操作性能不同,所以合理选择数据结构会有效提高程序的运行效率和存储效率。1.2数组概述及特性连续存储,每个数据都有不同的下标下标从0开始计算数组长度确定后不可改变有length属性保存了数组长度数组是引用类型 :占用两块空间,栈内存一块数组特性:查询修改效率极高,添加删除效率低。
2024-05-18 01:46:28
1470
原创 给出一个整数,判断该数是否为质数(方法封装)
代码依据:给定一个数n,for循环从2到n-1之间取余数,存在一个余数等于0 说明除了1和它本身还有其他数能被整除,不是质数。System.out.println("不是质数");System.out.println("不是质数");System.out.println("是质数");质数定义:除了1之外只能被1和他本身整除的数。
2024-05-10 18:42:33
252
原创 学习日志_02 什么是方法,递归与重载
递归:递归和迭代是等价的,都需要有终止条件,初始值,步长直接递归:方法中调用当前方法(自己调用自己)间接递归:A调用B,B调用A如果没有终止条件,会出现 栈内溢出错误 java.lang.StackOverflowError递归是一种比较消耗内存的一种算法,效率低,因为需要频繁压栈弹栈。循环能做的,递归都能做,能用循环优先用循环,实在解决不了再用递归推荐递归应用场景:树状结构经典问题:阶乘,斐波那契数列。。。
2024-05-10 17:01:44
426
原创 植物大战僵尸杂交版(原版也可)ce实现无冷却,无阳光消耗
第一步先打开ce选择植物大战僵尸,点击打开第二步,进入任意关卡,看到阳光的数量后,数据类型4字节,首次扫描看到的阳光数(这里是500)第三步种植任意植物后,阳光数发生变化(500变成375),输入变化后的阳光数点再次扫描,得到29个数据,再次种植任意植物或者收取阳光使阳光数发生变化再次扫描(如果只有一个数据则直接看第四步)第四步,右键点击,选择找出是什么改写了这个地址然后会打开这个页面,这是没有值是正常的,有值也不要慌(有值是因为你刚刚阳光数又发生了变化)
2024-05-08 23:52:59
20018
18
原创 学习日志_01 for循环与while循环
可以将嵌套比作多维空间,比如二层嵌套for循环,外层比作行,内层循环比作列,嵌套循环完成后形成平面,结果由坐标展示。//换行位置在外层循环中,非内层循环,作用是换行。如果是false,则终止循环执行,如果是true,则执行循环体。嵌套循环:在循环内部还有一个循环,外层循环执行一次,内层循环执行一轮。输出结果为 0 ,执行一次输出后break跳出循环不在执行i++for循环,又称计数循环,在某个次数范围内,重复执行某些代码。表达式1:最先执行并且只执行一次,然后执行表达式2。表达式3 :一般是步长;
2024-05-08 00:30:22
225
1
原创 计算1-100的奇数和
i+=2){ //初始值1为奇数,步长为2,每次增加2依然为奇数,终止条件小于(等于)100。//等价 sum = sum + i;int sum=0;//初始化一个计数器,后面用来计算奇数和。//计算1-100的奇数和。
2024-05-07 21:29:57
238
原创 有三种马,分别是大马,中马,小马,共100匹 // 有100块砖 , 大马 一次驮3块 , 中马 一次驮2块 , 三匹小马一次驮1块 // 三种马个数不能为0, 刚好一次把
/三匹马各一只 100 -3 -2- 1/3 剩94又2/3 不考虑第二条件最多加+284只小马 ,每减六只小马能加一只中马,每减九只小马能加一只大马 因此马匹数区间 [39,286],但是增加第二条件(三种马共100匹)一定取不到边界值,所以大致区间在(39,286)System.out.println("小马数量:"+(100 - big_horse -mid_horse));//小马/3等于100 - 3*big_horse -2*mid_horse。
2024-05-07 21:24:40
555
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人