- 博客(29)
- 收藏
- 关注
原创 实现Redis高可用(集群)
把整个数据库被分为16384个slot(槽),每个进入Redis的键值对,根据key进行散列,分配到这16384插槽中的一个。使用的哈希映射也比较简单,用CRC16算法。从节点向主节点发送请求携带replacationid和offset,判断id是否相同,不同则做全量同步且将id更改为Redis生成的心的id,相同则做增量同步。出一个16 位的值,再对16384取模。数据库中的每个键都属于这16384个槽的其中一个,集群中的每个节点都可以处理这16384个槽。,Cluster集群使用的。
2024-11-24 11:13:44
983
原创 Redis持久化机制
RDB:快照持久化,恢复速度快,适合备份和灾难恢复,但数据丢失风险较高。AOF:日志持久化,数据安全性高,但恢复速度较慢,文件体积较大。混合持久化:结合RDB和AOF的优点,既保证了数据的安全性,又提高了恢复速度。通过合理配置和选择合适的持久化策略,可以确保Redis在高可用性和性能之间找到最佳的平衡点。
2024-11-24 10:47:37
961
原创 Redis 过期策略和内存淘汰策略
过期策略:Redis通过定时删除和惰性删除相结合的方式来处理过期键,确保数据的时效性,同时尽量减少对性能的影响。内存淘汰策略:当内存使用达到上限时,Redis会根据配置的策略来释放内存,确保系统的稳定运行。常见的策略包括LRU、LFU、随机删除等,适用于不同的应用场景。通过合理配置这些策略,可以有效地管理和优化Redis的内存使用,确保系统的高性能和稳定性。
2024-11-24 10:39:45
1032
原创 redis为什么这么快
传统的做法是为每个客户端分配一个单独的线程或进程,但这会消耗大量的系统资源。IO多路复用技术允许一个线程同时管理多个客户端的连接,当任何一个客户端有数据可读或可写时,服务器能够立即知道并处理。假设你家有一个智能门铃,可以连接多个房间的门。每个房间的门都有一个传感器,当有人敲门时,传感器会发送信号给智能门铃。多线程模型中,线程之间的上下文切换会消耗大量的CPU资源。我们都知道内存读写是比在磁盘快很多的,Redis是基于内存存储实现的数据库,相对于数据存在磁盘的MySQL数据库,省去磁盘I/O的消耗。
2024-11-24 10:28:51
287
原创 redis的大key和热key问题解决方案
数据分片:将数据分布在多个 Redis 实例上,减轻单个实例的负载。使用 Redis 的原子递增操作来实现限流。
2024-11-23 18:28:06
814
1
原创 redis数据类型详解
redis是基于键值对来存储一系列信息的非关系型数据库,也就是说每条信息都一定有一个key。使用的工具是StringRedisTemplate增加和减少数值追加值获取哈希表所有字段和值删除哈希表字段移除并返回列表的第一个和最后一个元素获取列表中指定范围的元素获取集合中的所有成员检查成员是否存在于集合中获取有序集合中指定范围的成员获取成员的排名检查键是否存在设置键的
2024-11-23 18:26:00
902
原创 5.26软考中级(软件设计师)考后总结
由于一开始也没重视这个考试,基本上没有准备,考试前一天才看题目,学了几个小时把大纲过了一遍就去参加考试了。还是建议大家提前去备考,科班的同学提前半个月时间备考是完全没问题的,每天学习3-4小时,大纲内容挺多但是考的都不难。选择题去微信上找一个小程序刷题就完事了,大题就c语言算法和java比较难,java必须把面向对象的重要知识掌握,比如封装、继承、多态、抽象在题目中都会有体现。还有就是方法的调用,谁调谁的方法等等,c语言算法考的无非就是那几种算法(选择,冒泡,插入,快速,归并等等)。
2024-05-26 23:11:38
662
原创 Java中HashMap底层原理、ConcurrentHashMap
当我们使用put(key, value)方法向HashMap中添加元素时,会首先计算key的哈希值,然后使用这个哈希值对数组长度取模,得到的结果就是该元素在数组中的下标位置。这意味着在进行读写操作时,只要操作的数据分布在一个Segment中,就只需要锁定这个Segment,其他Segment可以同时被其他线程访问,大大提高了并发效率。要注意的是,HashMap只允许有一条记录的键为null,但允许多条记录的值为null。是Java中一个线程安全且高效的哈希表实现,它是从Java 5开始引入的,作为。
2024-05-24 23:39:02
811
1
原创 java中wait()和sleep()的区别
总结:wait()和sleep()虽然都用于控制线程的行为,但它们在用途、是否需要持有锁、释放锁的行为、响应中断的方式以及唤醒方式上都有显著的差异。在Java中,wait()和sleep()都是用于控制线程行为的方法,但它们之间有着显著的差异。
2024-05-23 14:08:05
323
1
原创 Java访问修饰符
在编写代码时,选择正确的访问修饰符是非常重要的,因为它有助于封装和隐藏类的内部状态,从而提供更高的安全性并减少代码之间的耦合度。一般来说,你应该尽可能地将变量和方法设置为最低的(Java提供了四种访问修饰符:private、default(没有关键字,也称为包级私有)、protected和public。)访问级别,以满足你的需求。
2024-05-23 00:01:40
257
原创 包装类的自动拆装箱与自动装箱
在Java中,包装类(如Integer、Double、Boolean等)是基本数据类型(如int、double、boolean等)的对应类。这些类提供了许多有用的方法来操作这些基本数据类型,并且允许你在需要对象的地方(例如在集合中)使用基本数据类型。Java 5引入了自动装箱(autoboxing)和自动拆箱(autounboxing)的功能,这两个功能大大简化了基本数据类型与包装类之间的转换。
2024-05-22 13:17:54
641
原创 抽象类和接口的区别
先仔细看看分割线上的内容,这部分更加细致,分割线下的是精华总结。抽象类和接口在Java中都是用于实现抽象概念的工具,但它们之间存在一些重要的区别。
2024-05-22 13:16:37
507
原创 Java基本数据类型和引用类型
在Java中,数据类型主要分为两大类:基本数据类型(Primitive Data Types)和引用类型(Reference Types)。这两类数据类型在内存中的存储方式和操作方式上有所不同。
2024-05-22 13:15:21
484
原创 Java中Volatile关键字及其原理
volatile关键字在Java中是一种轻量级的同步机制,主要用于解决多线程环境下的变量可见性和指令重排序问题。
2024-05-21 16:33:53
962
原创 Java多线程编程是什么?在实际开发场景中用来干什么?
Java多线程编程是指在一个Java程序中同时运行多个线程,每个线程都可以执行不同的任务。多线程编程可以显著提高程序的性能和响应能力,尤其是在处理大量并发请求或执行需要等待的操作(如I/O操作)时。
2024-05-20 15:29:31
484
1
原创 redis序列化和java序列化的区别
但是,在Java中使用Redis时,你可能会使用像Jedis或Lettuce这样的库,这些库提供了序列化和反序列化的工具或钩子,以便你可以更容易地在Java对象和Redis字符串之间转换。当你想在Redis中存储Java对象时,你需要将这些对象序列化为某种格式(如JSON、XML、二进制等),然后将这些序列化后的数据作为字符串存储在Redis中。Java序列化是将一个Java对象的状态转换为字节流,以便它可以被写入到持久化存储中(如文件或数据库)或者在网络中传输到另一个运行Java的虚拟机上。
2024-05-20 14:58:39
457
1
原创 一篇看懂Java中String、StringBuffer 和 StringBuilder的含义和区别
String 是不可变的,这意味着每次当你对 String 进行修改操作(如拼接)时,都会创建一个新的 String 对象(创建新的对象在意味着在内存空间中消耗一定的内存,在开发大型项目时,需要尽量避免消耗内存空间的操作)。由于没有同步开销,因此在单线程应用中通常比 StringBuffer 更快。StringBuilder 与 StringBuffer 非常相似,但它是。它提供了修改字符串内容的方法,而。
2024-05-19 00:18:56
379
原创 一篇明白什么是Java 重写(Override)与重载(Overload)
先认真阅读重载和重写的意思和区别,再看下面的代码,很容易理解的。Java中的重写(Override)和重载(Overload)是面向对象编程中实现多态性的两种重要机制,但它们的作用和应用场景有所不同。
2024-05-19 00:17:07
1037
原创 Java 的集合类简述
ArrayList类型:List接口的实现类。特点:ArrayList底层使用可变大小的数组实现,这意味着它提供了快速的随机访问(通过索引访问元素),但是插入和删除元素(尤其是中间的元素)可能相对较慢,因为它可能需要移动后续的元素来保持数组的连续性。适用场景:当你需要频繁地访问元素,而插入和删除操作相对较少时,ArrayList是一个很好的选择。LinkedList类型:List接口的实现类。特点:LinkedList采用双向链表结构,每个节点包含对前后节点的引用。
2024-05-18 14:35:57
934
原创 为什么出现 4.0 - 3.6 = 0.40000001 这种现象?
这两种类型都遵循IEEE 754标准来表示浮点数,这是一种二进制浮点数表示法。在二进制系统中,许多十进制的小数无法精确表示为有限位的二进制小数,就像十进制系统中1/3无法精确表示一样。这种表示上的近似性导致了浮点运算时可能出现微小的误差。的现象,是因为浮点数在计算机中的表示方式和运算过程中引入的精度误差。的二进制浮点数相减,其结果也是一个接近但不完全等于。进行计算时,实际上是两个接近但不完全等于。在二进制中不能精确表示,所以当你用。的浮点数,这就解释了为何结果会是。在Java中,浮点数运算出现如。
2024-05-18 12:12:27
319
原创 final关键字有哪些作用?
在Java中,final关键字是一个非常重要的修饰符,它有以下几个主要作用:finalfinalfinalStringfinalfinalfinal。
2024-05-17 15:39:00
445
原创 == 和 equals 比较的区别
用途差异:==主要用来比较基本类型的值或者判断两个引用是否指向同一对象。equals()则更多地用于比较两个对象的内容是否相等。可重写性:equals()方法可以被重写以提供特定于类的比较逻辑,从而比较对象的内在属性是否相等。而==的操作符是固定的,不能被重写。使用建议:在比较对象内容是否相等时,优先考虑使用equals()方法,特别是当你处理的是已经重写了equals()方法的类(如String)的实例时。而对于基本类型的值比较或者确切地需要比较对象引用是否相同时,使用==。
2024-05-17 12:29:54
403
原创 Java中static关键字的作用
由于静态成员(变量和方法)属于类本身,而不是类的实例,因此过度使用static可能会导致程序的设计变得复杂和难以维护。在设计程序时,应该谨慎考虑何时使用static关键字。
2024-05-16 16:29:32
469
1
原创 为什么重写equals方法时还要重写hashCode方法?
当您重写equals()方法来定义对象间的相等性时(即根据业务逻辑判断两个对象是否“相等”),如果没有同时重写hashCode()方法,可能会导致违反上述原则,尤其是在使用哈希表的集合类中出现问题。因为需要保持equals()和hashCode()之间的约定一致,以确保类在哈希表(如HashMap、HashSet等)中的正确行为。
2024-05-16 15:45:33
414
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人