对知识做总结
在学校呢,走过了非常多的坑,参加了一些比赛,但是也没有学到什么(含金量高的比赛可以参加,但是需参加之前先沉淀好自己的技术,不要报名了才去准备,得在准备中去报名),学校教的知识都是理论化,对于不考研的我用处不大。保证不挂科,成绩不难看就好了。我觉得沉淀编程技术,思路非常重要,并不用死记代码,现在有大模型ai,死的东西是不用花过多精力的,混个眼熟就好了。重要的是怎么实现的思路,以及怎么优化,问题如何解决。
Redis 删除策略:
Redis 作为内存数据库,其数据都存储在内存中,因此对于数据的删除策略尤为重要,以确保内存的有效利用。Redis 主要采用三种数据删除策略:定时删除、惰性删除和定期删除。
定时删除
定时删除策略是指为每个设置了过期时间的 key 创建一个定时器,在 key 到达过期时间时,由定时器任务立即执行删除操作。这种策略的优点在于能够及时释放内存,但缺点是会给 CPU 带来较大压力,特别是当有大量 key 需要删除时,可能会影响 Redis 服务器的响应时间和指令吞吐量。
惰性删除
惰性删除策略则是在 key 到达过期时间后不立即进行处理,而是等到下次访问该 key 时,再检查其是否过期,如果过期则进行删除。这种策略对 CPU 友好,因为它只在 key 被访问时才进行过期检查,但对内存不友好,因为过期的 key 如果长时间不被访问,就会一直占用内存。
定期删除
定期删除策略是每隔一段时间对一些 key 进行检查,删除其中过期的 key。这种策略既可以减少对 CPU 的影响,又能有效释放过期 key 占用的内存。但是,确定合适的删除操作执行时长和频率比较困难,如果执行太频繁,就会变得像定时删除一样对 CPU 不友好;执行太少,则又像惰性删除一样,过期 key 占用的内存不会及时释放。
Redis 实际上采用的是惰性删除和定期删除的组合策略。惰性删除由 db.c/expireIfNeeded 函数实现,所有键读写命令执行之前都会调用此函数进行检查。定期删除则由 redis.c/activeExpireCycle 函数实现,该函数以一定的频率运行,每次运行时都从一定数量的数据库中取出一定数量的随机键进行检查,并删除其中的过期键。
内存淘汰策略
当 Redis 的内存使用接近设定的最大值时,就需要内存淘汰策略来释放内存。Redis 提供了多种内存淘汰策略,如 volatile-lru、allkeys-lru、volatile-random、allkeys-random、volatile-ttl 和 noeviction 等。其中 allkeys-lru 是常用的策略,它会根据最近最少使用算法(LRU)删除任何 key。配置内存淘汰策略时,需要根据实际业务情况进行选择。
通过上述的删除策略和内存淘汰策略,Redis 能够在保证数据访问正确性的同时,有效管理内存使用,避免内存泄漏,确保数据库性能。对于具体的配置,可以通过修改 Redis 配置文件 redis.conf 中的相关参数来实现,
为什么要用分布式锁
因为在分布式环境下,有多个实例,每一个实例都有自己的jvm机,一个jvm机只能监视自己本地的锁。
线程创建的几种方式
其实我觉得就只有一种就是继承thread 然后new thread,其他的比如实现runnable接口等,都是封装其实就是设计模式
java容器/set list map hashmap linklist hashset arraylist 区别
HashMap 是基于哈希表的 Map 接口实现。
它允许空键和空值。
它不保证元素的顺序,但通常迭代顺序是插入顺序。
HashSet 是基于哈希表的 Set 接口实现。
它不允许重复的元素。
它不保证元素的顺序,但通常迭代顺序是插入顺序
LinkedList 是基于双向链表的 List 接口实现。
它允许重复的元素。
它支持高效的元素插入和删除操作。
ArrayList:基于动态数组实现的List接口,支持随机访问,但插入和删除效率较低
list和数组的相互转换
一个内置函数 aslist 和 toarray
注意
Spring中的AOP切面有很多,会按照0rder排序,按照Order值从小到大依次执行。
Spring事务AOF的order值是Integer.MAX VALsUE,优先级最低。
分布式锁(这里指的基于redisson的分布式锁组件,使用了aop)一定要先于事务执行,因此,我们的切面一定要实现0rdered接口,指定order值小于Integer.MAX VALUE即可,
乐观锁
ABA场景,乐观锁会出现问题 解决——》加时间搓
String不可变
不可变的含义:
字符串的不可变性意味着一旦创建,字符串的值就不能被改变。每当对字符串执行操作(例如拼接或替换)时,都会生成一个新的字符串对象。
为什么不可变:
String的内部数据是一个char数组,是对字符串数组的封装,并且是被final修饰的,创建后不可改变
数据库的事务隔离
看这个
https://www.cnblogs.com/crazymakercircle/p/13917517.html#autoid-h2-5-1-5
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律