- 博客(25)
- 收藏
- 关注
原创 用Go写一个缓存工具
在项目发开过程中,一直有用到本地缓存和分布式本地缓存,最近从Java转到Go,也需要在Go里面重新实现下这个缓存工具。本地缓存:堆内缓存,访问速度快,系统重启后缓存清除。分布式本地缓存:分布式本地缓存本质上还是本地缓存,只有在分布式环境下,本地缓存数据不同步,但是有时候为了快速访问做了这样的一个缓存工具,就是在某个节点缓存变化之后,立即通知其他节点清除其他节点的缓存key,重新从数据库同步缓存数据。
2023-12-08 18:20:46 1493 2
原创 Go操作MongoDB的一些问题
最近项目中从Java转到Go,项目数据库使用的是MongoDB,在go项目中操作MongoDB发现一些的一些问题,在这里和大家分享一下。
2023-11-16 19:21:20 317
原创 Go实现ThreadLocal功能
做Java开发的同学应该都比较熟悉ThreadLocal的使用,在项目开发过程中经常需要用到。ThreadLocal用来维护线程变量,可以保证变量在当前线程中存储和传递,常见的场景比如传递用户的登录信息等,那么换到Go中又该如何实现类似的功能呢?今天介绍两种实现方法。
2023-11-14 19:48:14 842 1
原创 Arthas性能定位工具
Arthas 是一款开源的 Java 诊断工具,它可以帮助开发人员进行 Java 应用的实时诊断和故障排查。它提供了丰富的命令和功能,可以用于监控应用程序的运行状态、查看线程堆栈、跟踪方法调用、修改变量值等。在日常性能测试过程中,用来排查性能耗时问题必不可少。
2023-11-09 19:48:34 445 1
原创 Go并发编程#协程
Go的并发编程是通过协程(goroutine)来实现的,所以了解协程是掌握Go并发编程的第一步。协程是更加轻量级的线程,当我们需要异步执行一段代码的时候,直接创建一个协程来运行接口,Go的协程是通过运行时(runtime)来管理的,所以开发人员不需要关心协程的调度以及销毁等过程。创建协程方法:go + 匿名函数//创建一个协程异步执行任务}()Go协程的并发高性能主要还是得益于高效的调度策略,也就是我们这里要讲到的GPM模型,了解了这个模型的工作原理,我们也就掌握了Go中协程并发运行的原理。
2023-10-27 18:00:23 210 1
原创 Go是面向对象吗?
关于Go是否是面向对象编程语言,这个问题在GO的社区也有很多讨论,众说纷纭,而GO的官方给出的答案是:YES OR NO,是也不是。针对这个答案,我们可以从面向对象的一些特性来进行剖析一下。
2023-10-26 19:17:59 752
原创 Guava常用工具# Cache本地缓存
构造 LoadingCache 的关键在于实现 load 方法,也就是在需要访问的缓存项不存在的时候 Cache 会自动调用 load 方法将数据加载到 Cache中,除了实现 load 方法之外还可以配置缓存相关的一些性质,比如过期加载策略、刷新策略。在构建Cache对象的时候我们可以设置可容纳的最大缓存数量,当超过一定最大数量的时候,Cache会淘汰一部分已有的数据,这里采用的是LRU淘汰策略,即访问频率最低的被淘汰。通过get方法当缓存不存在的时候,加载缓存数据到缓存中。:使用弱引用存储值。
2023-09-07 10:33:34 930 1
原创 微服务网关哪家强
随着微服务时代的到来,关于服务的访问也变得尤其重要,而微服务网关作为流量和服务之间的桥梁,也占据着举足轻重的地位。近年来伴随着微服务架构的盛行,微服务网关的技术也是日新月异,今天小编就选取几个最常用的几个网关选型,从部署、使用到特性讲解,一步步剖析。1、网关的概念传统的单体架构中只需要开放一个服务给客户端调用,但是微服务架构中是将一个系统拆分成多个微服务,如果没有网关,客户端只能在本地记录每个微服务的调用地址,当需要调用的微服务数量很多时,它需要了解每个服务的接口,这个工作量很大。
2023-09-07 09:58:15 224 1
原创 灵活的Spel表达式
对于任何表达式的执行我们都需要考虑安全性问题,表达式是动态解析执行的,像Spel这种表达式还可以对类型、函数等进行操作,其实跟我们自己的代码是一样了,如果恶意用户在表达式里面嵌入一个恶意代码随着表达式执行那就麻烦了,所以我们这里需要考虑安全性问题。字面量表达式、关系,逻辑与算数运算表达式、字符串连接及截取表达式、三目运算及Elivis表达式、正则表达式、括号优先级表达式。“EQ” 、“NE”、 “GT”、“GE”、 “LT” 、“LE”来表示等于、不等于、大于、大于等于、小于、小于等于。
2023-09-06 20:33:43 628 1
原创 多租户架构设计
除了计算资源的隔离,在存储上也需要做到合理,上面说到我们大部分情况都是使用的共享模式,对于客户来说租户区分的概念是要弱化的,也就是让客户感觉就只有自己在使用,那么就要求做到存储资源的隔离,说的简单一点就是不同租户操作的数据不能串了,A租户创建的订单在B租户那里展示出来了,这种肯定是不行的。多租户是SaaS领域的特有产物,在SaaS服务中,租户是指使用SaaS系统的客户,租户不同于用户,例如,B端SaaS产品,用户可能是某个组织下的员工,但整个企业组织是SaaS系统的租户。
2023-09-06 20:09:29 1346 1
原创 ThreadLocal的多种实现详解
在创建子线程时,子线程会调用父线程的 inheritableThreadLocals 的 childValue() 方法,该方法会创建一个新的 InheritableThreadLocal 实例,并使用父线程中存储的 InheritableThreadLocal 的值作为初始值。这样就实现了每个线程都独立存储和获取自己的数据。当子线程修改自己的 InheritableThreadLocal 的值时,并不会影响到其他线程,因为每个线程都有自己独立的 InheritableThreadLocal 对象。
2023-09-06 19:48:48 314 1
原创 Disruptor:一个高性能内存缓冲队列
Disruptor是由LMAX Exchange开发的开源库,旨在解决高性能、低延迟的并发编程需求。它基于环形缓冲区和无锁并发算法,通过最小化锁竞争和线程阻塞,实现高效的事件处理核心组件RingBuffer(环形缓冲区): 环形缓冲区是Disruptor的核心数据结构,用于存储事件。它采用固定大小的数组,每个元素存储一个事件对象。环形缓冲区支持并发读写,并且没有锁竞争。Sequence(序号): 序号表示每个消费者对事件的处理进度。
2023-09-06 18:56:26 582 1
原创 聊聊IM系统的设计
IM系统实体组成实体即为系统的元素,通过实体的特性以及实体之间的交互,组成了系统的功能链同时也使系统呈现出一定的特性。IM系统的实体大致可以分为:账号、联系人、关系、消息、会话。账号:登录IM系统需要有一个账号,是用户的身份标识,账号除了包含基本的用户名/密码等信息,还可以包含头像、昵称等关系:账号和账号之间通过加好友/互粉操作形成好友关系联系人:好友列表或者联系人列表,统称为联系人消息:不同账号之间发生聊天行为产生了消息会话:同聊天对象的聊天记录组成了会话IM系统的特性实时性。
2023-09-06 18:21:24 970 1
原创 kubernetes# kubectl管理多个集群环境
在使用k8s集群过程中,针对多个集群的情况,每次都是需要SSH到指定的master节点,然后执行对应的kubectl命令来操作集群,多个集群的情况下过于繁琐。我们可以通过本地的kubectl工具管理多个k8s集群,只需要将多个集群的链接信息配置在本地,就可以在本地随意切换k8s集群环境进行操作。
2023-09-06 17:29:44 422
原创 kubernetes# 核心组件篇
在上文中,作者介绍了kubernets内部的一些资源对象,那么本篇就来介绍下这些资源在内部如何工作,本文是在上篇基础上的升华,主要是探究kubernetes是如何工作的?有哪些组件?组件之间又是如何相互协作从而完成各自的使命的?
2023-09-06 17:03:23 124
原创 Kubernetes# 基础概念篇
最近公司在开发云原生相关的产品,项目里面对kubernetes使用甚多,从集群部署到基于API的自主开发,也算是重新把kubernetest撸了一遍,所以想着接着这个机会写一写k8s的专栏,希望和同行们互相交流,话不多少,直接上货。本篇作为Kubernetes专栏的开篇同时也是基础概念篇,主要是针对k8s的一些基本知识,对于一些刚接入k8s的同学可以了解一下。
2023-09-06 15:59:00 258
原创 一文讲透Java的List集合
List是Java中比较常用的集合类,关于List接口有很多实现类,本文就来简单介绍下其中几个重点的实现ArrayList、LinkedList和Vector之间的关系和区别。Vector和ArrayList一样,都是通过数组实现的,其中的很多方法都通过同步(synchronized)处理来保证线程安全,所以我们重点讲解ArrayList和LinkedList这两种数据结构的区别。
2023-09-06 15:28:49 88
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人