- 博客(20)
- 收藏
- 关注
原创 Redis高可用
等网络恢复,旧的主节点会降级为从节点,再与新的主节点进行同步复制,此时由于会进行全量同步,会清空自己的缓冲区,这样前面客户端写入的数据就会丢失。的哨兵才能成为候选人,候选人在Leader选举的时候会先给自己投一个赞成票,随后会发送命令给其他的哨兵,投票哨兵会给先收到的命令投赞成票,一轮投票中一个哨兵只有1票,所以后来的命令就只能投反对票了。哨兵只要和主库建立起来了连接,就可以将自己的信息(IP和端口)发布在主库上,同时可以从主库上订阅消息,获取到其他哨兵的信息,这样所有的哨兵就彼此知道IP和端口了。
2023-12-19 20:26:36 968 1
原创 Redis数据持久化
开启混合持久化之后,当触发AOF重写的时候,fork出来的重写子进程会先将共享内存中的数据以RDB日志的格式写入到新的AOF日志文件中,当写入完成之后,会将AOF重写缓冲区中的数据以AOF日志的格式继续追加写入到AOF日志之后,然后再用新的AOF日志替换旧的AOF日志。重写AOF日志的时候,不会复用原本的AOF日志文件,而是新建一个新的AOF日志文件,在新的AOF文件重写完成之后覆盖老的AOF文件,防止AOF重写失败的情况下污染老的文件,导致数据无法恢复。内存快照,内存中的数据在某一时刻的状态记录。
2023-12-18 21:52:39 946
原创 IO多路复用
多路复用API返回的事件并不一定是可读写的,比如当数据到达后,但经检查后发现有错误的校验和被丢弃时,就会导致后续的读取块缺失,这种情况下如果使用阻塞IO,那么在调用read/write时就会发生程序阻塞,所以多路复用最好是跟。poll改变了select中的BitsMap来表示文件描述符集合,采用链表的形式来组织,突破了select的文件描述符的个数限制,但仍然会受到系统文件描述符的限制。,一次在内核中进行遍历,检查是否由对应的事件发生,一次在用户态中进行遍历,找到需要处理的Socket;
2023-12-16 13:16:35 811 1
原创 Redis数据结构
相比于数组,压缩列表减少了不必要的内存,普通数组每个元素的大小相同,统一按照最大的元素大小来分配内存,而压缩列表则化整为零,压缩掉没有用到的空间来使空间变得紧凑,通过offset来控制元素访问;Redis会对全局哈希表去做rehash操作,也就是增加现有的哈希桶的数量,让逐渐增多的元素可以在更多的桶里分散保存,减少单个桶里的元素数据,从而减少单个桶中的元素数量。在Redis的全局哈希表中,在哈希桶里存储的是指向值的指针,而不是具体的值。对Rehash的第二步的数据拷贝环节进行优化,不是。
2023-12-14 22:25:26 927 1
原创 自定义starter
简单来说,自动装配就是自动将Bean装配到IoC容器中。自动装配在Spring Boot中通过注解来开启,在启动类注解中就自动注入了这个注解。注解的作用就是把相关组件的Bean装配到IoC容器中。使用注解后,Spring会解析到倒入的配置类,从而根据这个配置类中的描述来实现Bean的装配。作用是把使用了该注解的类所在的包以及子包下所有组件扫描到IoC容器中。中有一个抽象方法,返回一个String数组,在这个数组中可以指定需要装配到IoC容器的类,当在中导入一个的实现类后,会把该实现类中返回的Class名称都
2022-07-04 22:56:19 120
原创 使用long类型时js的精度丢失问题
在后端和前端联调的时候,后端使用雪花算法生成了一个20位的id,使用postman调用接口的时候接口返回的id没有问题,但是前端在使用的时候发现从接口拿到的id和postman中的id是不一致的。经过观察发现,js中Number类型只能接收16位以内的数字,如果超过16位,会导致一个四舍五入的精度丢失。解决办法:后端可以在序列化的通用配置的时候将long类型统一序列化成String,但是要注意这种配置同样会影响其他long类型的数据。...
2022-06-22 23:22:45 1745
原创 关于Feign的Decoder配置影响接口性能
项目中使用了Feign来调用第三方的接口,但是发现请求量增加之后,接口的响应速度变慢,一开始怀疑是第三方接口的响应速度比较慢,但是排查看第三方接口的响应情况,发现响应速度是正常的。经过排查之后发现是Feign的自定义Decoder配置存在问题导致了接口能支撑的并发降低。项目中的错误Decoder配置问题就在于红线框起来的一行,因为匿名函数的写法会导致每次请求都会新建一个对象(新建的时候会有大量的反射操作),导致并发增加之后CPU占用越来越高,导致性能下降。我们可以看到使用上面错误的Decoder的配置时,接
2022-06-22 23:14:35 1448
原创 Java中关于除0的那些事
我们从小就知道在做除法运算的时候,除数是不能为0的。在Java中如果除数是0,我们有一个大家都知道的异常,那就是,但是如果除数为0就一定会抛出这个异常么?那可不一定。
2022-06-05 22:14:52 2945 1
原创 JWT令牌刷新机制
JWT令牌刷新机制问题来源JWT令牌保存在客户端,会存在过期时间,那么如果令牌一直没有变化,那么过期时间也不会发生变化。假设一个JWT令牌的过期时间是5天,但是用户在这5天内一直在使用本系统,那么理论上当到了第五天的时候就应该是自动对这个令牌进行续期操作,而不是让用户重新登录。解决办法双令牌机制设置长短日期的两个令牌,两个令牌都传给客户端,客户端每次携带两个令牌请求当两个令牌都没有过期的时候,服务端正常验证逻辑如果短令牌过期,长令牌没有过期,那么服务端重新生成两个新的令牌返回给客户端,客户端
2022-03-28 00:17:35 4604 1
原创 Redis读取数据将复杂对象的List读取为Map
Redis读取数据将复杂对象的List读取为Map问题来源将一个List转换成json字符串存入Redis之后,从Redis中读取后的结果是将List中的内容解析成了Map,而不是存入时的对象,此时如果进行类型强转会报错。Redis的配置:测试代码:报错信息:此时在Redis中存储的就是一个正常的Json字符串通过增加配置解决问题将配置中注释的那一行解除注释,也就是添加这一行: objectMapper.activateDefaultTyping(LaissezFaireSubTy
2021-10-26 22:40:35 967
原创 对配置文件中的敏感信息进行加密
对配置文件中的敏感信息进行加密使用jasypt引入依赖<dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-spring-boot-starter</artifactId> <version>3.0.2</version> <
2021-10-14 22:43:25 136
原创 Feign请求接口返回一直是null
Feign请求接口返回一直是null问题来源通过Feign去访问一个接口,使用Object接收返回值,每次都是null问题定位返回值的编码问题通过浏览器访问接口,可以看到接口返回的数据的charset是GBK,所以第一步要保证Feign的解析器是使用的fastjson使其可以解析这种数据。具体配置可以参照https://blog.csdn.net/weixin_43080383/article/details/120681105尝试使用RestTamplate直接调用接口也需要配置解析器,
2021-10-14 22:33:40 10557
原创 关于Integer的空指针异常
关于Integer的空指针异常问题来源当用Integer来接收数据后,需要将数据与0进行比较,看是不是0,但是如果Integer接收的数据是null的时候,就会报空指针异常。public static void main(String[] args) { Integer a = null; System.out.println(0 == a); }原因分析Integer是包装类型,而我们直接写的0是int类型,属于基本类型,所以在比较的时候会自动进行拆箱
2021-10-11 19:24:31 5294
原创 Feign设置使用fastjson解析数据
Feign设置使用fastjson解析数据问题来源当使用Feign来调用第三方接口时,需要使用一个对象来接收第三方接口的返回,第三方返回的数据Content-Type是text/json,此时在使用Object接收数据的时候,框架会报错,提示说HttpMessageConverter不能将数据进行转换。其原因在于Feign并不共用Spring MVC的消息转换器链,默认使用的是Jackson Json解析库此时我们就需要将Feign设置成使用fastjson来解析得到的响应数据。具体配置impo
2021-10-09 23:55:18 2006
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人