- 博客(12)
- 收藏
- 关注
原创 码农杂谈(一)好代码的评判尺度:我们该用什么标准定义 “优质代码”?
文章探讨了优质代码的评价标准,结合实际工作经验分析不同公司(软件外包和自研企业)对代码质量要求的差异。作者提出优质代码应从"人能看懂"、"机器能高效跑"、"团队能维护"三个维度考量,并给出具体建议:命名规范、逻辑扁平、精准注释保证可读性;严谨异常处理、边界校验确保健壮性;低耦合设计、消除技术债务提升可维护性。文章强调好代码应在解决问题的基础上,平衡可读性、性能和团队协作需求,避免过度设计,最终实现"对人友好、对机器高效、对团队负责&quo
2025-08-03 15:18:03
740
原创 redis从入门到熟练 (四) 缓存读写一致性问题
Redis缓存更新策略主要有三种模式:Cache Aside(旁路缓存)适合读多写少场景,通过先更新DB再删缓存来保证一致性;Read/Write Through模式将缓存作为主存储,由缓存系统同步维护DB数据,简化应用逻辑但实现复杂;Write Behind采用异步写入,优先响应请求后批量更新DB,性能高但存在数据丢失风险。为保证最终一致性,可采用延迟双删、消息队列或binlog同步方案。选择策略需权衡一致性需求与性能,强一致性推荐同步双写+锁,最终一致性可结合延迟双删或消息队列实现。
2025-07-31 22:24:37
685
原创 redis从入门到熟练 (二) Zset,Hash,List类型详解
Redis 提供了三种特殊数据结构:Geospatial、HyperLogLog 和 Bitmap。 Geospatial 基于有序集合实现,用于存储和查询地理位置数据,支持距离计算和范围搜索,底层通过 Geohash 将坐标编码为 52 位整数。适合附近地点搜索、配送等场景。 HyperLogLog 是一种概率基数统计算法,仅用约 12KB 内存即可统计上亿级不重复元素,误差约 0.81%。适用于大规模 UV 统计和大数据去重。 Bitmap 底层是字符串,通过位操作高效处理二进制数据,常用于签到统计、用
2025-07-30 23:28:47
462
原创 redis从入门到熟练 (二) Zset,Hash,List类型详解
Redis有序集合(Zset)与哈希(Hash)结构解析 本文深入分析了Redis的两种核心数据结构:有序集合(Zset)和哈希(Hash)。 有序集合(Zset): 在Set基础上增加score字段实现元素排序 适用于排行榜、优先队列、范围查询等场景 底层采用ziplist(小数据量)和skiplist+dict(大数据量)的组合结构 详细解析了跳跃表的多层结构和查询原理 哈希(Hash): 类似HashMap的键值对存储结构 常用于频繁变更的字段存储(如购物车、用户信息) 底层采用ziplist(小数据
2025-07-29 23:30:00
681
原创 redis从入门到熟练 (一) String,Set类型详解
Redis是一个基于内存的键值对NoSQL数据库,支持多种数据类型。本文重点介绍String和Set两种数据类型的特性和底层实现。String类型采用自定义的SDS结构,实现了O(1)复杂度获取长度、缓冲区安全和二进制安全等特性,适用于缓存、计数和分布式锁等场景。Set类型底层采用intset和hashtable两种结构,前者针对小整数集合优化内存,后者支持任意元素和大数据量,适用于唯一数据存储、集合运算和随机推荐等场景。Redis会根据元素类型和数量自动选择最优的底层实现。
2025-07-28 23:22:12
622
原创 开发中常见的String的判空场景总结
本文探讨了Java开发中判空处理的重要性及String类型的判空实现。NullPointerException是常见运行时异常,良好的判空习惯能提升代码健壮性。文章重点介绍了使用Apache Commons Lang3的StringUtils工具类进行字符串判空,包括isEmpty()和isBlank()方法的区别与应用场景。通过代码示例展示了如何安全处理可能为null的字符串,包括长度获取、默认值设置、字符串拼接等操作,有效避免NPE异常。文中还演示了如何正确处理包含空白字符的字符串,以及trim()操作
2025-07-26 11:55:30
303
原创 javaSE中集合的相关知识
1)定义类的说明2)Vector底层也是一个对象数组,protected Object[] elementData3)Vector是线程同步的,即线程安全,Vector类的操作方法都有synchronized4)在开发中需要线程同步安全是,考虑使用Vector。
2022-08-06 12:03:29
215
原创 Java的有关注解(Annotation)的知识点
1)用@Deprecated标记为过时,但是也是可以使用的,如果遇到版本的升级,某些类用不了就可以用这个标记。看源代码这里的@interface不是接口的意思,看到这里就说明这是一个注解的函数。2)如果写了注解,那么编译器就会帮我们检查看有没有重写,如果没有写就会报错。定义表示某个程序元素(方法,类,字段,包,参数)已经过时。定义限定某个方法,是重写父类方法,该注解只能用于方法。1使用注解不是必须,不使用注解也可以运行成功,1@override的使用。定义修饰注解的注解叫做元注解。...
2022-07-15 17:19:01
190
原创 javaSE的抽象类
这里也很复杂,知识点很多abstract 修饰的是 类 方法1)用 abstract 修饰类的时候就是抽象类2)用 abstract 修饰方法的时候就是抽象方法3)抽象类的作用更多是作用设计,是设计者设计好后,让子类去继承(设计模式)4)抽象类可以有任意成员5)抽象方法不能有主体,也不能实例化6)如果一个类继承了抽象类,那么他必须重写抽象类的所有抽象方法,不是抽象方法可以不继承(除非自己也作为抽象类,可以不继承全部的抽象方法)......
2022-07-12 22:50:47
373
原创 javaSE的final类 使用细节
这几个内容真的特别多而且复杂,不理清楚很容易混起来。final的使用细节final修饰的是 类 属性 方法1)当不希望类被继承时,可以用final修饰2)当不希望弗雷德某个方法被子类覆盖(重写)时,可以用,final关键字修饰3)当不希望类的某个属性值被修改,可以用final修饰4)当不希望类的某个局部变量值被修改,可以用final修饰比较复杂的细节1)final修饰的量又叫常量2)final修饰的属性在定义的时候必须设置初始值,并且不能再修改,设置初始值可以在1:定义的时候2:在构造器中3:在代码块里面
2022-07-12 22:38:57
149
原创 javaSE的代码块问题
在学习java代码块的这块,感觉挺复杂,想整理整理,写个文档里面涉及到的知识还是很多的话不多说,先上代码输出的结果Animal 的静态代码块被调用Person 的静态代码块Animal 的代码块被调用Animal 的构造器被调用Person 的代码块被调用Person 的构造器被调用总结一下一共有三个东西1)静态代码块2)代码块3)构造器如果是在同一个类中,没有继承关系,那么执行的顺序就是1 -> 2 -> 3,如果有继承关系1)父类静态的方法和变量(执行顺序看代码写的顺序,优先级一样)2)
2022-07-10 22:43:49
119
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人