暂无个人介绍
目前越来越多的人已经进入或准备进入区块链领域,过程中不免抱着各样的疑虑和问题。想起自己之前用几年时间,从“略懂”区块链到all in,同样也经历着类似的心路历程,这个领域确实是有一些门槛的,但万事开头难,摸索路上还远不止八十一难,这里梳理几个概要性的困难和感悟,谨作分享。 方向之难 “我是谁”、“我在哪”、“我要去哪儿”,一切都源于这么一个哲学三问。区块链是什么?区块链究竟能做什么?为什么区块链这么火?不用区块链行不行?这些问题都充满了终极拷问的意味。 其实很难彻底回答这些问题,因为,并没有标准答案。所有创新的前沿的事物大抵如此,在质疑和动荡中发展,在黑暗和荒芜中摸索,精华和糟粕齐飞,绿
00 简单回顾 之前写过一篇关于mysql 对表大小写敏感的问题,其实在mysql中字段存储的内容是不区分大小写的,本篇进行简单的总结。 想回顾一下: MySQL在Linux下数据库名、表名、列名、别名大小写规则是这样的: 1、数据库名与表名是严格区分大小写的; 2、表的别名是严格区分大小写的; 3、列名与列的别名在所有的情况下均是忽略大小写的; 4、字段内容默认情况下是大小写不敏感的。 01 一个例子 简单例子: CREATE TABLE `tb_user` ( `id` BIGINT (20) UNSIGNED NOT NULL AUTO_INCREMENT COMM
老式 PC 即将淘汰,其正在被桌面即服务,基于云的 PC 所取代。 据了解, ZDNet 的 Ed Bott 最近指出,十年前人们是如何预测PC 的死亡的,只是为了表明台式 PC 仍然活着而且还很好。事实确实如此,PC 现在仍可以继续使用。但是现如今,幕后知识正在从以用户和 PC 为中心的操作系统转变为基于云的桌面即服务(DaaS)模型。 微软放弃了 PC 上的 Windows,并以其Windows 虚拟桌面(WVD)来取而代之。Windows 虚拟桌面客户端适用于 Windows,Android,Mac,iOS 和HTML5。换句话说,如果用户具有浏览器和PC,就可以将 Windows
有人看了我之前的文章『Swift 语言的设计错误』,问我:“你说 Java 只有引用类型(reference type),但是根据 Java 的官方文档,Java 也有值类型(value type)和引用类型的区别的。比如 int,boolean 等原始类型就是值类型。” 现在我来解释一下这个问题。 Java 有值类型,原始类型 int,boolean 等是值类型,其实是长久以来的一种误解,它混淆了实现和语义的区别。不要以为 Java 的官方文档那样写就是权威定论,就可以说“王垠不懂” :) 当你认为王垠不懂一个初级问题的时候,都需要三思,因为他可能是大智若愚…… 看了我下面的论述,也许你会
我之所以把这一个标题单独列出来,是想纠正现在很多 C/C++ 新人和初学者的一些的不当认识,一般有以下几种观点: linux C++开发就是后台开发,而 Windows C++ 开发就是客户端开发; 后端开发比客户端开发(前端)高级,因此后端开发行业薪资水平比客户端开发薪资要高; 我只学 linux,不学Windows。 我相信对于80和90这一代的开发者来说,当初接触计算机并进入软件行业,都是从接触 Windows 开始的。时至今日,大数据、人工智能等各种新技术方兴未艾,移动互联网如火如荼。但是无论是 linux 还是 Windows,尤其是Windows,还是我们大多数人工作、学习
每一种编程语言都有自己的语法、结构以及自己的风格,这也是每种语言展现各自魅力及众不同的地方。Go也不例外,它简单而优雅,与此同时使用起来也很有趣。在本文中,我们将讨论以下几点: Go程序结构 如何运行Go程序 Go中的注释 分号 代码回顾 Go程序结构 要理解Go程序的结构,首先需要有一个Go程序,让我们重温一下最受欢迎的Hello, World!程序。 package main import "fmt" func main() { fmt.Println("Hello,World!") } 每个源文件(扩展名为.go的文件)必须有一个包声明。
一、快速排序的基本实现 快速排序算法是一种基于交换的高效的排序算法,它采用了分治法的思想: 1、从数列中取出一个数作为基准数(枢轴,pivot)。 2、将数组进行划分(partition),将比基准数大的元素都移至枢轴右边,将小于等于基准数的元素都移至枢轴左边。 3、再对左右的子区间重复第二步的划分操作,直至每个子区间只有一个元素。 快排最重要的一步就是划分了。划分的过程用通俗的语言讲就是“挖坑”和“填坑”。
数据库对象命名规范 数据库对象 命名规范的对象是指数据库SCHEMA、表TABLE、索引INDEX、约束CONSTRAINTS等的命名约定 数据库对象命名原则 1. 命名使用具有意义的英文词汇,词汇中间以下划线分隔 2. 命名只能使用英文字母、数字、下划线 3. 避免用MySQL的保留字如:call、group等 4. 所有数据库对象使用小写字母 数据库命名规范 1. 数据库名不能超过30个字符 2. 数据库命名必须为项目英文名称或有意义的简写 3. 数据库创建时必须添加默认字符集和校对规则子句。默认字符集为UTF8(已迁移dumbo的使用utf8mb4) 4. 命名应
"狼哥,我发现新大陆了,等会发你代码" "咋了,这么激动" "等会..." List<Integer> list0 = new ArrayList<Integer>(); long start0 = System.currentTimeMillis(); for (int i = 0; i < 10000000; i++) { list0.add(i); } System.out.println(System.currentTimeMillis() - start0); long start1 = System.currentTimeMillis(); List<Inte
在之前的文章中,介绍了如何搭建neo4j集群,集群的故障切换和节点恢复,还介绍了如何配置驱动实现自动failover。本文聚焦在neo4j的数据上。聊聊如何从外部数据源将数据导入neo4j,如何对neo4j数据库进行备份和恢复。 数据导入 可以有多种方式将数据导入neo4j。大致分为cypher语句导入、apoc.load函数过程导入和离线import导入。 cypher语句导入 这个最简单,就是直接使用cypher语句的create或merge命令来创建neo4j的节点、边和属性。对比来说,create性能较好,但其不会进行存在与否的检查,可能会导致数据库中出现2个相同的节点等情况,
每周打开一次收藏夹里的个人博客,已经成为了我的人生一大乐趣。 相比各大博客平台,我一直更加偏爱个人博客。在每个人自己的这一亩三分地里,你能看到的,学到的,不仅仅只有知识,还有不一样的生活,不一样的态度。 在这把我收藏的个人博客分享给大家,如果里面有你,不妨点个赞吧 ! 以下排名不分先后。如果一定要有个顺序,大概是按我收藏的顺序。 Trinea 的博客 来自滴滴出行,Android 开发助手 开发者,android-open-project 维护者 ,android-open-project-analysis 维护者。 中二病也要开发 ANDROID 挺喜欢的一位作者,遗憾的是已经
对于一个Java开发来说,编程技能毋庸置疑是很重要的。 但是,除了基本的编程开发能力,其他方面的能力也是体现一个程序员的能力的很重要因素。 比如,问题排查能力、线上运维能力、项目管理能力、协调沟通能力等。 本文,主要来简单介绍一下,作为一个合格的Java开发,除了自身技术成长之外,还有哪些方面可以提升。 类开发技能 第一类,并不是纯coding技能,但是也和开发相关,我称之为类开发技能。 Linux系统 很多人的开发机器是windows,所以平时也基本都是图形化开发界面。但是,这并不意味着你就不需要基本的Linux技巧。 因为,你开发出来的应用可能部署在一台Linux机器上,很
在我们的博客侧边栏有分类列表和标签列表,显示博客已有的全部文章分类。现在想在分类名和标签名后显示该分类或者标签下有多少篇文章,该怎么做呢?最优雅的方式就是使用 django 的 annotate 方法。 Model 回顾 回顾一下我们的 model 代码,django 博客有一个 Post 和 Category 模型,分别表示文章和分类: blog/models.py class Post(models.Model): title = models.CharField('标题', max_length=70) body = models.TextField('正文')
问题概述 使用阿里云rds for MySQL数据库(就是MySQL5.6版本),有个用户上网记录表6个月的数据量近2000万,保留最近一年的数据量达到4000万,查询速度极慢,日常卡死。严重影响业务。 问题前提:老系统,当时设计系统的人大概是大学没毕业,表设计和sql语句写的不仅仅是垃圾,简直无法直视。原开发人员都已离职,到我来维护,这就是传说中的维护不了就跑路,然后我就是掉坑的那个!!! 我尝试解决该问题,so,有个这个日志。 方案概述 方案一:优化现有mysql数据库。优点:不影响现有业务,源程序不需要修改代码,成本最低。缺点:有优化瓶颈,数据量过亿就玩完了。 方案二:升级数
1. 前言 好久没写文了。最近在搞一些好玩的技术用到了 Python 。我原以为要花些时日,谁知道第一天入门之后便没有再刻意地去学习它了。这里就写写其中的一些关键点吧。如果我去学一门语言不是因为它火了而是我用到它了。曾经闲着没事干的时候把 Kotlin 、Vue、React 学了,但是从来没有实践中用到它们,以至于现在几乎快要忘了。所以这是个惨痛的教训:有可能用不到的东西不要去学。有这个时间泡妞打游戏它不香吗? 2. 为什么选择Python "玩蛇"其实我是拒绝的,我要搞个爬虫以及数据清洗,包括机器学习的一些东西。而这些方面 Python 具有先天性优势,所以 Python 成了不二的选择。
一、前戏 前后端分离已成为互联网项目开发的业界标准使用方式,通过nginx+tomcat的方式(也可以中间加一个nodejs)有效的进行解耦,并且前后端分离会为以后的大型分布式架构、弹性计算架构、微服务架构、多端化服务(多种客户端,例如:浏览器,车载终端,安卓,IOS等等)打下坚实的基础。这个步骤是系统架构从猿进化成人的必经之路。 核心思想是前端html页面通过ajax调用后端的restuful api接口并使用json数据进行交互。 在互联网架构中,名词解释: Web服务器:一般指像nginx,apache这类的服务器,他们一般只能解析静态资源。 应用服务器:一般指像tomcat,
我们是学习软件开发的,必然离不开计算机,所以在进行学习之前,首先要了解一些必要的计算机基础知识. 一. 计算机基础 1. 计算机 电子计算机,也就是我们俗称的电脑,是一种能够按照程序自动运行,自动、高速处理海量数据的现代化智能电子设备,它由硬件和软件所组成,而一台没有安装任何软件的计算机被称为裸机. 2. 硬件 在一台计算机中,有如下几个核心硬件. ①.CPU: 是一台计算机的运算核心和控制核心,其功能主要是解释计算机指令以及处理计算机软件中的数据. CPU由运算器、控制器、寄存器、高速缓存及实现它们之间联系的数据、控制及状态的总线构成. 作为整个系统的核心, CPU 也是整个系统最高
写在前面: C语言中交换两个变量值的操作经常会用到,也有不少人提问诸如不用临时变量怎么交换两个变量值的问题,今天在这里做一个总结,也算是对这个问题的统一回复,一共总结了5种方法(名字都是我自己取的,不当之处还请批评指正),希望大家看完有所收获。 1.临时变量法 方法解释:采用临时变量的方法,作为中间过渡,这是最简单也是大家最容易想到的方法,此法在各种场合应用极多,应该熟练掌握。
在探讨 LongAdder 是如何解决伪共享问题之前,我们要先梳理清一个概念,什么是 伪共享 和 共享 ? 共享在 Java 编程里面我们可以这样理解,有一个 Share 类,它有一个 value 的属性。如下: public class Share { int value; }复制代码 我们初始化 Share 的一个实例,然后启动多个线程去操作它的 value 属性,此时的 Share 变量被多个线程操作的这种情况我们称之为 共享。 大家都知道在不添加任何互斥措施的情况,多线程操作这个 Share 变量的 value 属性肯定存在线程安全性的问题。那有什么办法可以解决这个问题呢?
1. 前言 Java 开发中有些逻辑是这样的,完成了A操作,再继续B操作,在继续C操作。这么描述好像有点不清楚。打个比方把,你吃晚饭,通知你老婆(女友)来收碗筷,然后通知你的线上兄弟告诉他们你回来了准备开黑。至于你老婆(女友)来不来收拾无所谓,反正你告诉她了。至于你兄弟你也是通知他们,人家也不一定组你,万一他们正在跟一个一拖三的carry大佬玩的正起劲儿呢。 2. 事件的概念 吃晚饭就是一个所谓的事件。触发了随后的两个操作,他们只存在因果关系。但是它们互不干扰,各自为政。一个完整的事件由 事件源、事件发布、事件监听 组成。 接下来我们聊聊 Spring 中的事件。 3. Spring 中的
1. 概述 今天带你了解一下 Spring 框架中的 @Qualifier 注解,它解决了哪些问题,以及如何使用它。我们还将了解它与 @Primary 注解的不同之处。更多的技术解析请访问 felord.cn 2. 痛点 使用 @Autowired 注解是 Spring 依赖注入的绝好方法。但是有些场景下仅仅靠这个注解不足以让Spring知道到底要注入哪个 bean。 默认情况下,@Autowired 按类型装配 Spring Bean。 如果容器中有多个相同类型的 bean,则框架将抛出 NoUniqueBeanDefinitionException, 以提示有多个满足条件的 bean 进
文中所涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库 博客提供 RSS 订阅应该是标配,这样读者就可以通过一些聚合阅读工具订阅你的博客,时时查看是否有文章更新,而不必每次都跳转到博客上来查看。现在我们就来为博客添加 RSS 订阅功能。 RSS 简介 RSS(Really Simple Syndication)是一种描述和同步网站内容的格式,它采用 XML 作为内容传递的格式。简单来说就是网站可以把内容包装成符合 RSS 标准的 XML 格式文档。一旦网站内容符合一个统一的规范,那么人们就可以开发一种读取这种规范化的 XML 文档的工具来聚合各大网站的内容。例如一个读者
1. 前言 昨天在 Collection移除元素操作 相关的文章中提到了 Collectors 。相信很多同学对这个比较感兴趣,那我们今天就来研究一下 Collectors 。 2. Collectors 的作用 Collectors 是 Java 8 加入的操作类,位于 java.util.stream 包下。它会根据不同的策略将元素收集归纳起来,比如最简单常用的是将元素装入Map、Set、List 等可变容器中。特别对于 Java 8 Stream Api 来说非常有用。它提供了collect() 方法来对 Stream 流进行终结操作派生出基于各种策略的结果集。我们就借助于 Strea
如果是OLTP系统,存在正大量的删除和更新操作的系统中,日积月累,索引将会千疮百孔,使用索引用来检索数据的效率会急转直下。因此要求我们定期的对索引进行维护,我们可以使用DROP/CREATE方式或REBUILD方式完成索引的重建,恢复索引应该有的效率。 问题来了,什么时候需要重建?重建索引的依据是什么呢? 有两个依据可供参考。第一个是,查看索引的“高度”,如果索引树高超过了4我们就需要重点关注;另外一个参考依据是,索引条目被删除的数据占总索引条目的百分比如果超过了20%,一般在这种情况下就要考虑重建索引。 如果获得这两个参考依据?方法其实很简单,我们仅需对索引进行一下分析,然后通过IND
本文给出使用视图协助我们快速构造闪回查询内容,通过视图可以方便的检索“历史上的数据”。 1.构造闪回查询视图需求描述 1)准备员工表和工资表 2)删除工资表中雇佣年限在1994年之前的记录 3)创建视图可以查询工资表删除之前的记录 2.准备环境 1)准备员工表和工资表 sec@ora10g> create table emp (id number,name varchar2(20), e_date date); Table created. sec@ora10g> create table salary (id number, salary number); Table create
对SQL*Plus情有独钟的朋友一定遇到过这样的问题:突然忘记了表的全名(或者其他数据库对象名),仅依稀记得它包含几个字母,怎么可以最快速知道具体的名字呢? 最快速的回答:使用数据字典视图可以达到提示自己的目的。 例如使用如下的SQL语句遍可获得当前用户下所有包含“TMP”关键字的数据库对象信息。 select * from obj where object_name like '%TMP%'; 完全正确,但是没有达到我们“快速”的目的。我这里给出一个非常简单的脚本(以obj为基础进行了简单的格式化),以便达到快速获得提示信息的目的。 1.脚本内容如下,有兴趣的朋友可以在这个基础上进一步
前言:作为一名DBA,在创建Oracle数据库的过程中一般要使用dbca和netca图像化进行建库和创建监听(如果使用脚本建库另说),如果您身体好估计可以在瑟瑟发抖的机房中完成数据库的创建过程,由于本人对寒冷比较敏感,又不想通过这样的方式锻炼身体,所以更愿意在舒适的房间内一边品味着咖啡的浓香,顺便度过相对枯燥的数据库安装和配置的过程,So,图形化操作工具是必不可少的,在Linux操作系统最流行的图形化操作软件莫过于VNC,俺本着总结、共享及提醒的目的完成了这个详细的小文儿,希望大家喜欢。 1.确认VNC是否安装 默认情况下,Red Hat Enterprise Linux安装程序会将VNC
当SYS和SYSTEM用户中出现重复数据库对象的时候会对数据库的使用带来很多的问题。系统一旦使用到这些重复对象的时候将会报错。 什么情况下会出现这种重复现象呢? 一般情况下SYS和SYSTEM用户下的数据库对象都是在数据库安装的过程中完成的。不过个别情况下为了部署新特性需要手工执行创建脚本。一般规律是这样的:但凡涉及到手工操作的部分,就潜在出错因素,一旦可能出错,便一定会出错。这便是“墨菲定律”。 本文给出这类故障的模拟和处理方法。 1.确认系统SYS和SYSTEM用户中是否存在重复数据库对象 sys@ora10g> show user USER is "SYS" sys@
1.有关Freelist的描述 数据库读取的单位是数据块(block),一个block是否允许写入数据是基于一定的空闲度--PCTFREE和PCTUSED存储参数设置。 Freelists就是一个指定了所有可以用于insert操作的数据块的列表。 存在于这个列表中的数据块才能用于insert操作,一旦一个数据块无法用于insert(达到了PCTFREE参数指定的限度)则立刻从这个列表中摘除。 Freelists的作用就在于管理高水位标志(HWM)以下的空闲空间,实际上一个segment可用的空闲空间包括两种类型: 1)已经分配给这个segment但是从来未被使用过的位于高水位标志之上的bloc
高可用架构 导读:在程序员面试过程中Redis相关的知识是常被问到的话题。作为一名在互联网技术行业打击过成百上千名的资深技术面试官,本文作者总结了面试过程中经常问到的问题。十分值得一读。 作者简介:钱文品(老钱),互联网分布式高并发技术十年老兵,目前任掌阅科技资深后端工程师。熟练使用 Java、Python、Golang 等多种计算机语言,开发过游戏,制作过网站,写过消息推送系统和MySQL 中间件,实现过开源的 ORM 框架、Web 框架、RPC 框架等 Redis在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在Redis的使用和原理方面对小伙伴们进行各种刁难。作为一名
1.总原则 一些正确但稍显废话的原则,但能指导后面每个章节的优化,所以还是要啰嗦一次。 可扩展性架构,堆机器能不能解决问题是最最优先考虑的问题 去中心化的点对点通信,优于通过中心代理的通信 池化的长连接,优于短连接 二进制数据,优于文本数据 尽量减少交互,一次调用的粗粒度聚合接口 优于 多次调用的细粒度接口 尽量减少交互,批量接口优于循环调用 尽量只交互必要的数据 尽量就近访问 尽量使用缓存 总是设定超时 在合适的场景,并行化执行 在合适的场景,异步化执行 2.环境准备 保证符合自家各种规范(没有的话赶紧回家写一个),尤其线下压测服务器的配置要与生产环境一致。 2.1 操作系统 自家
理解expdp各个选项的含义最好的途径就是逐一的进行测试,这样可以在感性上有一个真实的体验。 1.数据泵expdp导出工具与传统的exp导出工具的区别 1)exp是客户端程序,既可以在客户端使用,也可以在服务器端使用; 2)expdp是服务器端工具,只能在ORACLE服务器端使用,不能在客户端使用; 3)这两个工具生成的备份文件不能被对方与之对应的导入工具使用; 4)expdp在灵活性和功能性上与exp相比,有质上的飞跃。 2.expdp命令行选项列表 使用“-help”选项获得expdp命令可用的选项列表和简单的注释信息。 ora10g@linux5 /expdp$ expdp help
本章主要目标完成Spring Boot基础项目的构建,并且实现一个简单的Http请求处理,通过这个例子对Spring Boot有一个初步的了解,并体验其结构简单、开发快速的特性。 系统要求: Java 7及以上 Spring Framework 4.1.5及以上 本文采用Java 1.8.0_73、Spring Boot 1.3.2调试通过。 使用Maven构建项目 通过SPRING INITIALIZR工具产生基础项目 访问:http://start.spring.io/ 选择构建工具Maven Project、Spring Boot版本1.3.2以及一些工程基本信息,可参考下图所示SP
首先,什么是类数组(Array Like)? 一个简单的定义,如果一个对象有 length 属性值,则它就是类数组 那常见的类数组有哪些呢? 这在 DOM 中甚为常见,如各种元素检索 API 返回的都是类数组,如 document.getElementsByTagName,document.querySelectorAll 等等。除了 DOM API 中,常见的 function 中的 arguments 也是类数组 那如何把类数组转化为数组呢?这是类数组操作时一个典型的场景,也是一个典型的面试题 以下我们将以 { length: 3 } 来指代类数组,来作为演示 节选自 日文 【
一、前言介绍 在前面一篇分析了 mybatis 源码,从它为什么之后接口但是没有实现类就能执行数据库操作为入口,整个源码核心流程完全解释了一遍。对于一个3年以上的程序员来说,新知识的学习过程应该是从最开始 helloworld 到熟练使用 api 完成业务功能。下一步为了深入了解就需要阅读部分核心源码,从而在出问题后可以快速定位,迅速排查。从而减少线上事故的持续时长,提升个人影响力。但!这不是学习终点,因为无论是任何一个框架的源码,如果只是看那么就很难学习到它的实用技术。纸上得来终觉浅,唯有实战和操练。 那么,本章节我们去简单实现一个基于jdbc的demo版本Mybatis,从而更加清楚这样
涉及的示例代码和历史文章,已同步更新到 HelloGitHub-Team 仓库 一、前言 在前面三篇介绍 fire 的文章中,我们全面了解了 fire 强大而不失简洁的能力。按照惯例,我们要像使用 argparse、docopt 和 click 一样使用 fire 来实现 git 命令。 本文的关注点并不在 git 的各种命令是如何实现的,而是怎么使用 fire 去打造一个实用命令行程序,代码结构是怎样的。因此,和 git 相关的操作,将会使用 gitpython 库来简单实现。 为了让没读过 使用 xxx 实现 git 命令(xxx 指 argparse、docopt 和 click)
GaussDB 200中可以使用Database和Schema实现业务的隔离,区别在于Database的隔离更加彻底,各个Database之间共享资源极少,可实现连接隔离、权限隔离等,Database之间无法直接互访。Schema隔离的方式共用资源较多,可以通过grant与revoke语法便捷地控制不同用户对各Schema及其下属对象的权限。 从便捷性和资源共享效率上考虑,推荐使用Schema进行业务隔离。 建议系统管理员创建Schema和Database,再赋予相关用户对应的权限。 Database设计建议 【建议】在实际业务中,根据需要创建新的Database,不建议直接使用集群默认的p
Java和Docker不是天然的朋友。 Docker可以设置内存和CPU限制,而Java不能自动检测到。使用Java的Xmx标识(繁琐/重复)或新的实验性JVM标识,我们可以解决这个问题。 虚拟化中的不匹配 Java和Docker的结合并不是完美匹配的,最初的时候离完美匹配有相当大的距离。对于初学者来说,JVM的全部设想就是,虚拟机可以让程序与底层硬件无关。 那么,把我们的Java应用打包到JVM中,然后整个再塞进Docker容器中,能给我们带来什么好处呢?大多数情况下,你只是在复制JVMs和Linux容器,除了浪费更多的内存,没任何好处。感觉这样子挺傻的。 不过,Docker可以把
导读:在程序员面试过程中Redis相关的知识是常被问到的话题。作为一名在互联网技术行业打击过成百上千名的资深技术面试官,本文作者总结了面试过程中经常问到的问题。十分值得一读。 作者简介:钱文品(老钱),互联网分布式高并发技术十年老兵,目前任掌阅科技资深后端工程师。熟练使用 Java、Python、Golang 等多种计算机语言,开发过游戏,制作过网站,写过消息推送系统和MySQL 中间件,实现过开源的 ORM 框架、Web 框架、RPC 框架等 Redis在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在Redis的使用和原理方面对小伙伴们进行各种刁难。作为一名在互联网技术行
1.总原则 一些正确但稍显废话的原则,但能指导后面每个章节的优化,所以还是要啰嗦一次。 可扩展性架构,堆机器能不能解决问题是最最优先考虑的问题 去中心化的点对点通信,优于通过中心代理的通信 池化的长连接,优于短连接 二进制数据,优于文本数据 尽量减少交互,一次调用的粗粒度聚合接口 优于 多次调用的细粒度接口 尽量减少交互,批量接口优于循环调用 尽量只交互必要的数据 尽量就近访问 尽量使用缓存 总是设定超时 在合适的场景,并行化执行 在合适的场景,异步化执行 2.环境准备 保证符合自家各种规范(没有的话赶紧回家写一个),尤其线下压测服务器的配置要与生产环境一致。 2.1 操作系统 自家
setNX,是set if not exists 的缩写,也就是只有不存在的时候才设置, 设置成功时返回 1 , 设置失败时返回 0 。可以利用它来实现锁的效果,但是很多人在使用的过程中都有一些问题没有考虑到。 例如某个查询数据库的接口因为请求量比较大所以加了缓存,并设定缓存过期后刷新。当并发量比较大并且缓存过期的瞬间,大量并发请求会直接查询数据库导致雪崩。如果使用锁机制来控制只有一个请求去更新缓存就能避免雪崩的问题。下面是很多人下意识想到的加锁方法 <?php $rs = $redis->setNX($key, $value); if ($rs) { //处理更新缓存逻辑
如果你不是工程师,你应该享受不到加班调试的乐趣吧,我记得在大学的时候,我第一次调试I2C时序,当时用的芯片是24C02的存储芯片,用51单片机模拟I2C时序,怎么整也整不出来,时序这个东西,一通百通,一不通那就是几个通宵熬夜都有可能。 先量电压,量电压了看波形,波形反反复复的看了之后,就是没有从设备的应答信号,再去看看硬件设计,该上拉电阻的地方有没有接上上拉电阻。 关于上拉电阻和下拉电阻这个自行百度,可以理解为一个默认的能力把,就像弹簧默认是有一个力的,你需要一个>弹簧的默认力才能驾驭弹簧,上拉和下拉就是保持它的默认能力。 作为一个电子工程师,调试通信时序应该是基本操作,就好
GIN索引的接口实现了一个高层次的抽象,要求访问用户仅需要实现被访问数据类型的语义。GIN层自身可以处理并发操作、记录日志、搜索树结构的任务。 定义GIN索引的访问方式所要做的事情就是实现多个用户定义的方法,这些方法定义了键在树中的行为、键与键之间的关系、需要索引的item、能够使用索引的查询。简而言之,GIN索引将扩展性与普遍性、代码重用、清晰的接口结合在了一起。 实现GIN索引的操作符类有如下四个方法: int compare(Datum a, Datum b) 比较两个key(不是索引的item)然后返回一个小于零、零或大于零的值,分别表示第一个key小于、等于或大于第二个key。
要在应用程序中使用这些功能,只需将其构建为依赖于spring-cloud-config-client的Spring引导应用程序(例如,查看配置客户端或示例应用程序的测试用例)。添加依赖关系的最方便的方法是通过Spring Boot启动器org.springframework.cloud:spring-cloud-starter-config。
一,单元测试/测试运行器 1,Jest 知名度的Java单元测试工具,由Facebook开源,开箱即用。它在最基础的被设计为快速,简单地编写地道的Java测试,能自动模拟()返回的CommonJS模块,并提供了包括内置的测试环境Dom API支持,合理的转换值,重新编码和交替执行并行测试内部的特性。通过在并行进程中同时运行测试,让测试重新进行地结束。 2,AVA 号称“未来的测试运行器”,利用Java的在Node.js的里使得IO可以并行的优点,让你的测试可以并发执行,这对于IO繁重的测试特别有用。另外,测试文件可以在不同的进程里并行运行,让每个一个测试文件可以获得更好的性能和独立的环境
常见的磁盘故障是磁盘空间不足、磁盘出现坏块、磁盘未挂载等。 磁盘故障有的会导致文件系统损坏,比如磁盘未挂载,集群管理自动定期做磁盘检测时会识别故障并将实例停止,查看集群状态时对应实例状态异常;有的不会导致文件系统损坏,比如磁盘空间不足,集群管理无法检测到,服务进程访问到故障磁盘会异常退出,比如:数据库无法启动、checksum校验不对、页面读写失败、页面校验错误等。 对于会导致文件系统损坏的故障,查看集群状态会显示对应实例状态持续为Unknown,定位方法如下: 查看cm_agent日志,日志保存在mpp/omm/cm/cm_agent,日志中会有类似“data path disc wri
昨天,一位分析界的老前辈对我很无奈地摇摇头,“这帮程序员,不食人间烟火哪!” 我也深有感触,全世界的码农都一个鸟样。 这让我想起了,同样也是他,在多年之前,对我提了警醒——要重视业务。 从那之后,我一直狂奔在技术+业务的双修道路上。 放在以前,码农这个族群一定是稀罕动物。但在今天,这个世界最不缺的应该就是码农了,未来最廉价的也将是码农。
mybatis使用注解替代xml配置时,遇到判断条件是否为null或者为空时,@Select很难搞定,不知道怎么办? mybatis3中增加了使用注解来配置Mapper的新特性,使用 SelectProvider来动态生成sql。 典型的使用场景 1. 无参数@SelectProvide方法 在Mapper接口方法上和@SelectProvide指定类方法上,均无参数: UserMapper.java: 1 @SelectProvider(type = SqlProvider.class, method = "selectAllUser") 2 @ResultMap("
对于只有 Python 语言经验的朋友,也许会不太理解声明这个词,在 Python 中直接拿来就用,也不用声明类型啥的。 Go 语言是静态类型语言,由于编译时,编译器会检查变量的类型,所以要求所有的变量都要有明确的类型。 变量在使用前,需要先声明。声明类型,就约定了你这个变量只能赋该类型的值。 声明一般有以下四种方法,其中前面两种同样也可用于定义常量,只需把关键字 var 变成 const 即可。 第一种 :一行声明一个变量 var <name> <type> 复制代码 其中 var 是关键字(固定不变),name 是变量名,type 是类型。 使用 var ,虽然只指定了类型,但
数据库读取的单位是数据块(block),一个block是否允许写入数据是基于一定的空闲度--PCTFREE和PCTUSED存储参数设置。 Freelists就是一个指定了所有可以用于insert操作的数据块的列表。 存在于这个列表中的数据块才能用于insert操作,一旦一个数据块无法用于insert(达到了PCTFREE参数指定的限度)则立刻从这个列表中被摘除。 Freelists的作用就在于管理高水位标志(HWM)以下的空闲空间。 Freelist只是管理高水位标志以下的空闲空间,而实际上一个segment可用的空闲空间包括两种类型: 1.已经分配给这个segment但是从来未被使用过的位