
Linux服务器开发
文章平均质量分 83
Linux服务器开发
C/C++Linux后台服务器开发高级架构师内容包括C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,MongoDB,ZK,流媒体,音视频开发,Linux内核,TCP/IP,协程,DPDK多个高级知识点。
展开
-
详解Redis的主从同步原理
Redis为了保证服务高可用,其中一种实现就是主从模式,即一个Redis服务端作为主节点,若干个Redis服务端作为主节点的从节点,从而实现即使某个服务端不可用时,也不会影响Redis服务的正常使用。本篇文章将对主从模式中为了保证主节点和从节点数据一致而实现的主从同步机制进行学习。Redis主从模式中,一个高可用的Redis服务由一个Redis主节点(Master,后续简称为主节点)和若干Redis从节点(Slave,后续简称为从节点)组成。Redis中采用。原创 2023-03-07 17:03:24 · 1144 阅读 · 1 评论 -
设计模式第八讲:观察者模式和中介者模式详解
(1). 定义指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式模型-视图模式,它是对象行为型模式。PS: 观察者模式是 【1对多】的关系,后面的中介者模式是 【多对多】的关系。(2). 优点:A. 降低了目标与观察者之间的耦合关系,两者之间是抽象耦合关系。B. 目标与观察者之间建立了一套触发机制。(3). 缺点:A. 目标与观察者之间的依赖关系并没有完全解除,而且有可能出现循环引用。原创 2023-02-23 20:36:32 · 673 阅读 · 0 评论 -
设计模式第七讲-外观模式、适配器模式、模板方法模式详解
(1). 定义是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体的细节,这样会大大降低应用程序的复杂度,提高了程序的可维护性。(2). 优点A. 降低了子系统与客户端之间的耦合度,使得子系统的变化不会影响调用它的客户类。B. 对客户屏蔽了子系统组件,减少了客户处理的对象数目,并使得子系统使用起来更加容易。原创 2023-02-17 14:38:49 · 593 阅读 · 0 评论 -
设计模式第六讲:责任链模式和迭代器模式详解
(1). 定义:为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。PS:责任链模式也叫职责链模式。在责任链模式中,客户只需要将请求发送到责任链上即可,无须关心请求的处理细节和请求的传递过程,所以责任链将请求的发送者和请求的处理者解耦了。(2). 优点:A. 降低了对象之间的耦合度。原创 2023-02-15 15:09:54 · 594 阅读 · 0 评论 -
设计模式第五讲-装饰器模式和代理模式详解
(1). 定义:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。(2). 优点:A. 采用装饰模式扩展对象的功能比采用继承方式更加灵活。B.可以设计出多个不同的具体装饰类,创造出多个不同行为的组合。(3). 缺点装饰模式增加了许多子类,如果过度使用会使程序变得很复杂。(1). 定义:由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介。原创 2023-02-14 14:32:37 · 751 阅读 · 0 评论 -
设计模式-值类型与引用类型、深拷贝与浅拷贝、原型模式详解
(1). 分类值类型包括:布尔类型、浮点类型(float、double、decimal、byte)、字符类型(char)、整型(int、long、short等)、枚举(entum)、结构体(struct)。引用类型:数组、字符串(string)、类、接口、委托(delegate)。(2).内存存储值类型数据存放在栈stack中, 引用类型地址存放栈stack中,数据存放在堆heap中。值类型变量声明后,不管是否赋值,都会在在栈中分配内存空间。原创 2023-02-11 17:47:34 · 760 阅读 · 0 评论 -
设计模式-组合模式和建筑者模式详解
(1). 定义:有时又叫作部分-整体模式,它是一种将对象组合成树状的层次结构的模式,用来表示“部分-整体”的关系,使用户对单个对象和组合对象具有一致的访问性。(2). 优点:A. 组合模式使得客户端代码可以一致地处理单个对象和组合对象,无须关心自己处理的是单个对象,还是组合对象,这简化了客户端代码;B. 更容易在组合体内加入新的对象,客户端不会因为加入了新的对象而更改源代码,满足“开闭原则”;(3). 缺点A. 设计较复杂,客户端需要花更多时间理清类之间的层次关系;B. 不容易限制容器中的构件。原创 2023-02-10 20:35:05 · 883 阅读 · 0 评论 -
设计模式-策略模式详解
(1) 定义:该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。(2) 优点:A. 多重条件语句不易维护,而使用策略模式可以避免使用多重条件语句。B. 策略模式提供了一系列的可供重用的算法族,恰当使用继承可以把算法族的公共代码转移到父类里面,从而避免重复的代码。原创 2023-02-09 14:25:23 · 492 阅读 · 1 评论 -
设计模式-工厂方法模式和抽象工厂模式
(1). 定义:定义一个创建产品对象的工厂接口,然后把产品对象的实际创建工作放到具体的子类工厂当中实现。PS:① 我们把被创建的对象成为“产品”,创建产品的对象称为“工厂”。如果创建的产品不多,且基本不会增加新产品,只需要一个工厂类即可,这种模式叫做“简单工厂”,它不属于23种设计模式,它的缺点是违背了开闭原则。② 此处的介绍的‘抽象工厂’,是对简单工厂模式的进一步抽象化,其好处是可以使系统在不修改原来代码的情况下引进新的产品,即满足开闭原则。原创 2023-02-08 17:10:26 · 505 阅读 · 0 评论 -
「AVL平衡树专项」带你领略常用的AVL树与红黑树的奥秘(规则篇)
满足下列条件的二叉搜索树是红黑树每个结点要么是“红色”,要么是“黑色”所有的叶结点都是空结点,并且是“黑色”的。如果一个结点是“红色”的,那么它的两个子结点都是“黑色”的。(注:也就是說,如果結點是黑色的,那么它的子節點可以是紅色或者是黑色的)。结点到其子孙结点的每条简单路径都包含相同数目的“黑色”结点根结点永远是“黑色”的之所以称为红黑树的原因就在于它的每个结点都被“着色”为红色或黑色。这些结点颜色被用来检测树的平衡性。原创 2023-02-04 14:49:53 · 641 阅读 · 0 评论 -
深入浅出学习透析Nginx服务器的架构分析及原理分析「底层技术原理+运作架构机制」
Nginx再次回顾也许你已经忘记了Nginx是做什么的?我来再次给你夯实一下概念。多协议反向代理Nginx是个高性能的Web和反向代理服务器及HTTP服务器,它能反向代理HTTP,HTTPS和邮件相关(SMTP,POP3,IMAP)的协议链接,还可以提供了负载均衡以及HTTP缓存。原创 2023-02-03 15:16:12 · 1309 阅读 · 0 评论 -
宕机了,Redis 如何避免数据丢失?
如果有人问你:"你会把 Redis 用在什么业务场景下?我想你大概率会说:"我会把它当作缓存使用,因为它把后端数据库中的数据存储在内存中,然后直接从内存中读取数据,响应速度会非常快。没错,这确实是 Redis 的一个普遍使用场景,但是,这里也有一个绝对不能忽略的问题:一旦服务器宕机,内存中的数据将全部丢失。目前,Redis 的持久化主要有两大机制,即AOF(Append Only File)日志和 RDB(Redis DataBase) 快照。原创 2023-02-02 14:42:32 · 456 阅读 · 0 评论 -
一文揭晓,我是如何在Linux中查找自如
以上操作我们能够通过 find 命令来查找结果,但更多时候我们真正想做的是对结果执行某些特殊操作。当我们想要删除 /Users/cbuc/testdir/dir2 这个目录时,我们可以通过以上认识到的操作先进行查找然后使用 -delete 命令来删除当前匹配的文件可以发现, /Users/cbuc/testdir/dir2 这个目录已经被删除了除了删除操作,还可以进行以下几种常见的操作:-delete:删除当前匹配的文件-ls:对匹配的文件执行相当于 ls -dils 命令的操作。原创 2023-02-01 16:55:32 · 351 阅读 · 0 评论 -
怎样快速地迁移 MySQL 中的数据?
我们可以看到的是查询数据的时候报了一个 1146 的错误,这是因为 INnoDB 存储引擎中的数据表是需要在 MySQL 数据库的数据字典中注册的,我们直接将数据文件复制过去的时候并没有在数据字典中注册,换句话说就是在把数据复制过去之后,还需要在数据字典中注册数据库系统才能正常识别。更多C++后台开发技术点知识内容包括C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,MongoDB,ZK,流媒体,音视频开发,Linux内核,TCP/IP,协程,DPDK多个高级知识点。原创 2023-01-12 14:37:52 · 627 阅读 · 0 评论 -
TiDB 底层存储结构 LSM 树原理介绍
LSM 树(Log-Structured-Merge-Tree) 日志结构合并树由 Patrick O’Neil 等人在论文《The Log-Structured Merge Tree》(www.cs.umb.edu/~poneil/lsm…LSM 树的核心特点是利用顺序写来提高写性能,代价就是会稍微降低读性能(读放大),写入量增大(写放大)和占用空间增大(空间放大)。原创 2023-01-11 15:02:26 · 428 阅读 · 0 评论 -
从实战出发,聊聊缓存数据库一致性
在云服务中,缓存是极其重要的一点。所谓缓存,其实是一个高速数据存储层。当缓存存在后,日后再次请求该数据就会直接访问缓存,提升数据访问的速度。但是缓存存储的数据通常是短暂性的,这就需要经常对缓存进行更新。而我们操作缓存和数据库,分为读操作和写操作。读操作的详细流程为,请求数据,如缓存中存在数据则直接读取并返回,如不存在则从数据库中读取,成功之后将数据放到缓存中。原创 2023-01-10 15:33:30 · 605 阅读 · 0 评论 -
MySQL字符集和排序规则详解
更多C++后台开发技术点知识内容包括C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,MongoDB,ZK,流媒体,音视频开发,Linux内核,TCP/IP,协程,DPDK多个高级知识点。排序规则的命令通常是以对应的字符集的名字为开头,并以自己的特定属性结尾,比如排序规则utf8_general_ci和latin1_swedish_ci就分别是对应utf8和latin1字符集的排序规则。A. 当仅指定了字符集而没有指定排序规则时,则会使用该字符集的默认排序规则。原创 2023-01-07 14:24:18 · 965 阅读 · 0 评论 -
说透IO多路复用模型
在说IO多路复用模型之前,我们先来大致了解下Linux文件系统。在Linux系统中,不论是你的鼠标,键盘,还是打印机,甚至于连接到本机的socket client端,都是以文件描述符的形式存在于系统中,诸如此类,等等等等,所以可以这么说,一切皆文件。来看一下系统定义的文件描述符说明:从上面的列表可以看到,文件描述符0,1,2都已经被系统占用了,当系统启动的时候,这三个描述符就存在了。其中0代表标准输入,1代表标准输出,2代表错误输出。当我们创建新的文件描述符的时候,就会在2的基础上进行递增。原创 2022-12-29 15:32:04 · 607 阅读 · 0 评论 -
内网穿透你真的了解吗?
本文所介绍的内网穿透技术相关的实现方式其实在我们的日常开发生活中有更多的使用场景,当我们深入了解了当前 IP 地址以及内外网的实现方式后,我们不难发现,当我们将内网穿透的图片稍加修改后就成为了我们常用的另一种功能的实现方式(VPN实现原理):原文作者:内网穿透你真的了解吗?- 掘金。原创 2022-12-28 15:44:25 · 794 阅读 · 0 评论 -
性能优化-内存泄漏、内存溢出、cpu占用高、死锁、栈溢出、FullGC频繁检测手段-总结与分享
含义:内层溢出通俗理解就是内存不够,程序要求的内存超出了系统所能分配的范围。危害:内存溢出错误会导致处理数据的任务失败,甚至会引发平台崩溃等严重后果。应用程序CPU使用率高,甚至超过100%死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。Java 里的 StackOverflowError。抛出这个错误表明应用程序因为深递归导致栈被耗尽了。原创 2022-12-17 14:53:03 · 2225 阅读 · 2 评论 -
介绍四大并发集合类并结合单例模式下的队列来说明线程安全和非安全的场景及补充性能调优问题。
背景:我们目前使用的所有集合都是线程不安全的。:就是利用线程槽来分摊Bag中的所有数据,链表的头插法,0代表移除最后一个插入的值.(等价于同步中的List):线程安全的Stack是使用Interlocked来实现线程安全, 而没有使用内核锁.(等价于同步中的数组): 队列的模式,先进先出(等价于同步中的队列): 字典的模式(等价于同步中的字典)以上四种安全的并发集合类,也可以采用同步版本+Lock锁(或其它锁)来实现。原创 2022-12-16 15:06:11 · 255 阅读 · 0 评论 -
掌握分布式环境缓存更新策略,提高缓存与数据库双写一致性!
三种缓存模式优缺点:Cache Aside 更新模式实现起来比较简单,但是需要维护两个数据存储,一个是缓存(Cache),一个是数据库(Repository)。Read/Write Through 更新模式只需要维护一个数据存储(缓存),但是实现起来要复杂一些。原创 2022-12-13 15:42:01 · 246 阅读 · 0 评论 -
时间复杂度和空间复杂度
算法,即解决问题的方法。同一个问题,使用不同的算法,虽然得到的结果相同,但是耗费的时间和资源是不同的。就比如要拧一个螺母,使用扳手还是钳子是有区别的,虽然使用钳子也能拧螺母,但是没有扳手好用。“条条大路通罗马”,解决问题的算法有多种,这就需要判断哪个算法“更好”。原创 2022-12-12 15:13:06 · 171 阅读 · 0 评论 -
深究用户模式锁的使用场景(异变结构、互锁、旋转锁)
本章节,将结合多线程来介绍锁机制, 那么问题来了,什么是锁呢?为什么需要锁?为什么要结合多线程来介绍锁呢?锁的使用场景又是什么呢?DotNet中又有哪些锁呢?在接下来的几个章节中,将陆续解答这些问题。PS:多个线程对一个共享资源进行使用的时候,会出问题, 比如实际的业务场景,入库和出库操作同时进行,库存量就会存在并发问题。所以锁就是用来解决多线程资源竞用的问题。原创 2022-11-30 15:13:18 · 196 阅读 · 0 评论 -
从多个角度分析顺序表和链表区别和特点
顺序表和链表由于存储结构上的差异,导致他们有不同的特点,从而适用于不同的场景。虽然他们都属于线性表,但他们的存储结构有着本质的不同:1. 线性表存储数据,需要,然后将数据按照次序逐一存储,数据之间紧密贴合,不留一丝空隙, 如下图:2. 链表的存储方式与顺序表截然相反,原创 2022-11-29 14:55:33 · 254 阅读 · 0 评论 -
链表剖析及自己手撸“单链表“实现基本操作(初始化、增、删、改等)
存储数据元素时,除了存储数据元素本身的信息外,还有一个指针,指向他的后继节点,最后一个元素的指针不指向任何元素。:在单链表的基础上加一个前驱指针,指向前一个元素,是链表可以双向查找,这种结构成为双链表。:将链表最后一个节点的指针指向第一个节点,这样就形成了一个环,这种数据结构叫做单向循环列表.另外还有双向循环列表.原创 2022-11-28 16:36:13 · 219 阅读 · 0 评论 -
linux常用服务配置、网络配置 和 基于FTP的上传和下载的几种方式
hostname: 查看主机名hostname xxx: 修改主机名(重启后无效)原创 2022-11-26 14:43:15 · 205 阅读 · 0 评论 -
Nginx负载均衡配置、限流配置、Https配置详解
通过proxy_pass 可以把请求代理至后端服务,但是为了实现更高的负载及性能, 我们的后端服务通常是多个, 这个是时候可以通过upstream 模块实现负载均衡。原创 2022-11-24 15:17:37 · 869 阅读 · 0 评论 -
数据库索引和EFCore的索引映射
索引用于快速找出在某个列中有某一特定值的行,不使用索引,数据库必须从第一条记录开始读完整个表,直到找出相关的行。表越大,查询数据所花费的时间越多, 如果表中查询的列有一个索引,数据库能快速到达一个位置去搜索数据。原创 2022-11-21 15:50:08 · 295 阅读 · 0 评论 -
Linux之用户管理、权限管理、程序安装卸载
Ubuntu 推荐使用 apt 进行下载、安装。会从 ubuntu 官网下载(中国区镜像),如果下载速度慢的话,可以设置从其他镜像下载,具体搜索“Ubuntu apt-get 镜像”,执行某些程序的时候,如果程序没安装,还会提示你,比如执行 vim、tree 等。(2). 指定目录和组名:【sudo useradd -d /home/a a -g mygroup1 -m】,创建一个用户名字叫a,主目录在/home/a,如果主目录不存在,就自动创建主目录,同时用户属于mygroup1组。原创 2022-11-18 16:03:35 · 280 阅读 · 0 评论 -
分布式事务概念、理论、及(2PC、3PC)
在分布式系统中,不同服务之间需要通过网络协作来完成的事务,叫做分布式事务。比如下单业务:先创建订单→扣减库存。1. 访问订单表,创建订单2. 访问库存表:扣减库存 (以上两个表是同一个DB)B. 如果是分布式事务:存在订单微服务和库存微服务,我们请求订单微服务中POrder接口,该接口除了需要调用自身DB创建订单外,还需要调用库存微服务的接口,这就存在网络通信,传统的数据库事务无法满足。1. 订单微服务,创建订单 (本地DB)2. 通过网络调用库存微服务中接口,进行扣减库存。原创 2022-11-14 17:07:22 · 241 阅读 · 0 评论 -
阻塞、非阻塞、多路复用、同步、异步、BIO、NIO、AIO 一文搞定
关于IO会涉及到阻塞、非阻塞、多路复用、同步、异步、BIO、NIO、AIO等几个知识点。知识点虽然不难但平常经常容易搞混,特此Mark下,与君共勉。阻塞IO情况下,当用户调用read后,用户线程会被阻塞,等内核数据准备好并且数据从内核缓冲区拷贝到用户态缓存区后read才会返回。可以看到是阻塞的两个部分。CPU把数据从磁盘读到内核缓冲区。CPU把数据从内核缓冲区拷贝到用户缓冲区。非阻塞IO发出read请求后发现数据没准备好,会继续往下执行,此时应用程序会不断轮询polling内核询问数据是否准备好,当数据没原创 2022-06-23 15:17:09 · 328 阅读 · 0 评论 -
万字攻略,详解腾讯面试(T1-T9)核心技术点,面试题整理
本文以非腾讯在职人的身份,来聊腾讯面试的流程、攻略和建议,但愿能助有缘人。标题涉及的范围很广,对多数面试腾讯的人而言,都有参考价值,看完本文之后,必有所得。退一步来讲,即便是准备面试其他公司,也有很多问题是相通的,亦可借鉴,有所广益。从毕业到现在,被别人面试过,也面试过别人,大大小小的面试,一两百次,也算久经沙场。一. 整体流程腾讯的部门很多,岗位类型有别,职级差异较大,因此,每个面试者的面试流程肯定不尽相同,然而,很多流程基本通用,故值得一看。郭靖(化名)是社招入职腾讯的,面试岗位是后台开发,最近跟郭靖吃原创 2022-06-22 16:23:09 · 1081 阅读 · 0 评论 -
【干货知识】Redis:从应用到底层,一文帮你搞定
用途:底层:C语言中String用char[]数组表示,源码中用SDS(simple dynamic string)封装char[],这是是Redis存储的最小单元,一个SDS最大可以存储512M信息。Redis对SDS再次封装生成了RedisObject,核心有两个作用:说明是5种类型哪一种。里面有指针用来指向 SDS。当你执行set name sowhat的时候,其实Redis会创建两个RedisObject对象,键的RedisObject 和 值的RedisOjbect 其中它们type = R原创 2022-06-21 16:35:47 · 786 阅读 · 0 评论 -
如何保证数据库和缓存双写一致性?
数据库和缓存(比如:redis)双写数据一致性问题,是一个跟开发语言无关的公共问题。尤其在高并发的场景下,这个问题变得更加严重。我很负责的告诉大家,该问题无论在面试,还是工作中遇到的概率非常大,所以非常有必要跟大家一起探讨一下。今天这篇文章我会从浅入深,跟大家一起聊聊,数据库和缓存双写数据一致性问题常见的解决方案,这些方案中可能存在的坑,以及最优方案是什么。通常情况下,我们使用缓存的主要目的是为了提升查询的性能。大多数情况下,我们是这样使用缓存的:用户请求过来之后,先查缓存有没有数据,如果有则直接返回。如果原创 2022-06-20 15:47:53 · 505 阅读 · 0 评论 -
彻底搞懂 select/poll/epoll,就这篇了!
之前已经把网络 I/O 相关要点都盘了,还剩 select/poll/epoll 这几个区别没说,这篇就来搞搞它们,并且是从完全理解原理的角度来区分它们。本来是要上源码的,但是感觉没啥必要,身为应用开发我觉得理解原理就行了,源码反正看了就忘了,理解才是最重要!所以我就尽量避免代码且用大白话来盘一盘这三个玩意。话不多说,发车。首先,我们知道 select/poll/epoll 是用来实现多路复用的,即一个线程利用它们即可 hold 住多个 socket。按照这个思路,线程不可被任何一个被管理的 Socket原创 2022-06-18 14:18:23 · 6195 阅读 · 0 评论 -
Mysql数据库查询好慢,除了索引,还能因为什么?
mysql查询为什么会慢,关于这个问题,在实际开发经常会遇到,而面试中,也是个高频题。遇到这种问题,我们一般也会想到是因为索引。那除开索引之外,还有哪些因素会导致数据库查询变慢呢?有哪些操作,可以提升mysql的查询能力呢?今天这篇文章,我们就来聊聊会导致数据库查询变慢的场景有哪些,并给出原因和解决方案。我们先来看下,一条查询语句下来,会经历哪些流程。比如我们有一张数据库表我们平常写的应用代码(go或C++之类的),这时候就叫客户端了。客户端底层会带着账号密码,尝试向mysql建立一条TCP长链接。m原创 2022-06-17 15:25:22 · 522 阅读 · 0 评论 -
从小白到架构师原来是这样修炼出来的
最近在看一本《架构师的自我修炼》的书籍。断断续续读了一遍,感觉很有启发。我发现,书中的技能类的知识,往往不是最难学的,与之相反,对于我们技术从业者,思维上的一些认识的不同,会逐渐导致人和人之间的差距。书中讲到一个德雷福斯模型:所有专业人员都需要经历 5 个成长阶段。不管是医生还是律师,或者是软件开发,任何专业技能的从业者都需要经历新手、高级新手、胜任者、精通者、专家 5 个阶段。如下如果看完一本书,知识类的东西你没用到过不了几天就忘记了,那么这很正常。但是书中最核心的表达,能在以后时不时的想起来,并且应用原创 2022-06-14 15:22:01 · 250 阅读 · 0 评论 -
你还不懂线程池的设计及原理吗?掰开揉碎了教你设计线程池
大家在学习线程池的时候也曾查阅过各种资料,但是感觉大佬写的很好但是写的不够详细,写的详细的设计思路又很简单,所以我的出发点就是让读者可以清晰明确的看懂整个设计思想和设计过程,可以举一反三,在今后内存池等方面也可以游刃有余的设计出来!好了,正文开始~我们先来打个比方,线程池就好像一个工具箱,我们每次需要拧螺丝的时候都要从工具箱里面取出一个螺丝刀来,有时候需要取出一个来拧,有时候螺丝多的时候需要多个人取出多个来拧,拧完自己的螺丝那么就会把螺丝刀再放回去,然后别人下次用的时候再取出来用。也许我的例子不是太完美,但原创 2022-06-11 15:16:44 · 273 阅读 · 0 评论 -
作为程序员,对于底层原理真的有那么重要吗?
前段时间在工作业务中碰到一个技术问题, 在发现问题,思考问题,解决问题的过程中,突然对底层原理有了一些思考,这里分享一下给大家。在业务中使用到了 Redis 数据库来存储数据,但是在存储大数据量的 string 的时候,监控却发现内存增长异常。string 类型,作为 Redis 中唯一的“键-单值”类型,操作简单,易于理解,按道理只是存一下字符型的数据,怎么会这么消耗内存,这是怎么回事呢?怀着刨根问底的精神,我自己在我的 Mac 机器上动手实战了一番,写了一段 Python 代码,准备数据长度 7 位数,原创 2022-06-10 14:26:23 · 2373 阅读 · 1 评论