显卡信息 ################
在很久很久以前,我们写代码时要慎重的考虑变量的数据类型,比如下面这些:枚举:尽管在 JDK 5 中增加了枚举类型,但是 Class 文件常量池的 CONSTANT_Class_info 类型常量并没有发生任何语义变化,仍然是代表一个类或接口的符号引用,没有加入枚举,也没有增加过“CONSTANT_Enum_info”之类的“枚举符号引用”常量。所以使用 enum 关键字定义常量,尽管从 Java
最近在学习MySQL优化方面的知识。本文就数据类型和schema方面的优化进行介绍。1. 选择优化的数据类型MySQL支持的数据类型有很多,而如何选择出正确的数据类型,对于性能是至关重要的。以下几个原则能够帮助确定数据类型:更小的通常更好应尽可能使用可以正确存储数据的最小数据类型,够用就好。这样将占用更少的磁盘、内存和缓存,而在处理时也会耗时更少。简单就好当两种数据类型都能胜任一个字段的存储工作时
在面试、并发编程、一些开源框架中总是会遇到 volatile 与 synchronized。synchronized 如何保证并发安全?volatile 语义的内存可见性指的是什么?这其中又跟 JMM 有什么关系,在并发编程中 JMM 的作用是什么,为什么需要 JMM?与 JVM 内存结构有什么区别?总结出里面的核心知识点以及面试重点,图文并茂无畏面试与并发编程,全面提升并发编程内功!JMM 与
工作中使用了一点ELK,偶尔使用Kibana拼接ES DSL简直要命。如果你和我一样「熟悉SQL,但不咋会写DSL」 or 「想要用SQL简化查询」,本文会介绍一下官方对ES SQL的支持,希望对你有所帮助~ES7.x版本的x-pack自带ElasticSearch SQL,我们可以直接通过SQL REST API、SQL CLI等方式使用SQL查询。SQL REST API在Kibana Con
在互联网后端日常开发接口的时候中,不管你使用的是C、Java、PHP还是Golang,都避免不了需要调用mysql、redis等组件来获取数据,可能还需要执行一些rpc远程调用,或者再调用一些其它restful api。 在这些调用的底层,基本都是在使用TCP协议进行传输。这是因为在传输层协议中,TCP协议具备可靠的连接,错误重传,拥塞控制等优点,所以目前应用比UDP更广泛一些。相信你也一定听闻过
这篇文章,我们来看Redis是如何实现故障自动恢复的,它的实现正是要基于之前所讲的数据持久化和数据多副本而做的。Redis作为非常火热的内存数据库,其除了具有非常高的性能之外,还需要保证高可用,在故障发生时,尽可能地降低故障带来的影响,Redis也提供了完善的故障恢复机制:哨兵。下面就来具体来看看Redis的故障恢复是如何做的,以及其中的原理。部署模式Redis在部署时,可以采用多种方式部署,每种
当我们在做数据库与缓存数据同步时,究竟更新缓存,还是删除缓存,究竟是先操作数据库,还是先操作缓存?本文带大家深度分析数据库与缓存的双写问题,以供大家参考。本篇文章主要内容数据缓存为何要使用缓存哪类数据适合缓存缓存的利与弊如何保证缓存和数据库一致性不更新缓存,而是删除缓存先操作缓存,还是先操作数据库非要保证数据库和缓存数据强一致该怎么办缓存和数据库一致性实战实战:先删除缓存,再更新数据库实战:先更新
前言Redis 作为当前最流行的 NoSQL 之一,想必很多人都用过。Redis 有五种常见的数据类型:string、list、hash、set、zset。讲真,我以前只用过 Redis 的 string 类型。由于业务需求,用到了 Redis 的集合 set。这不,一上来就踩到坑了。前几天有个需求提测,测试小哥提了个 bug,并给了我一个日志截图:问题排查从堆栈信息定位到了项目的代码,大致如下:
对 Linux 稍有了解的人都知道,Linux 会将物理的随机读取内存(Random Access Memory、RAM)按页分割成 4KB 大小的内存块,而今天要介绍的 Swapping 机制就与内存息息相关,它是操作系统将物理内存页中的内容拷贝到硬盘上交换空间(Swap Space)以释放内存的过程,物理内存和硬盘上的交换分区组成了操作系统上可用的虚拟内存,而这些交换空间都是系统管理员预先配置
MySQL作为互联网行业使用最多的关系型数据库之一,与其免费、开源的特性是密不可分的。然而,很多小伙伴工作了很多年,只知道使用MySQL进行CRUD操作,这也导致很多小伙伴工作多年后,想跳槽进入大厂,却在面试的时候屡屡碰壁。问个简单的问题:select语句是如何在MySQL中执行的? 这也是很多面试官喜欢问的问题,如果你连这个简单的问题都不能回答的话,那就要好好规划下自己的职业生涯了。好了,今天我
过去,系统的软件设计是以数据库设计为核心,当需求确定下来以后,团队首先开始进行数据库设计。因为数据库是各个模块唯一的接口,当整个团队将数据库设计确定下来以后,就可以按照模块各自独立地进行开发了,如下图所示。在上面的过程中,为了提高团队开发速度,尽量让各个模块不要交互,从而达到各自独立开发的效果。但是,随着系统规模越来越大,业务逻辑越来越复杂,我们越来越难于保证各个模块独立不交互了。随着软件业的不断
Kubernetes 是今天容器编排领域的事实标准,而 Docker 从诞生之日到今天都在容器中扮演着举足轻重的地位,也都是 Kubernetes 中的默认容器引擎。然而在 2020 年 12 月,Kubernetes 社区决定着手移除仓库中 Dockershim 相关代码[^1],这对于 Kubernetes 和 Docker 两个社区来说都意义重大。kubelet-and-containers
本篇文章则着重分析 ElasticSearch 在全文搜索前如何使用 ik 进行分词,让大家对 ElasticSearch 的全文搜索和 ik 中文分词原理有一个全面且深入的了解。全文搜索和精确匹配ElasticSearch 支持对文本类型数据进行全文搜索和精确搜索,但是必须提前为其设置对应的类型:keyword 类型,存储时不会做分词处理,支持精确查询和分词匹配查询;text 类型,存储时会进行
索引是存储引擎用于快速找到记录的一种数据结构。尤其是当表的数据量越来越大的时候,正确的索引对查询性能的提升尤为明显。但在日常工作中,索引却常常被忽略,甚至被误解。本文将为大家简单介绍下Mysql索引优化的原理与注意事项。一、索引的类型1)B-Tree索引B-Tree索引是用的最多的索引类型了,而且大多数存储引擎都支持B-Tree索引。B-Tree本身是一种数据结构,其是为磁盘或其他直接存取的辅助设
HTTP协议本身是无状态的,无状态的意思是浏览器发起的每个HTTP请求,对于服务端而言都是彼此独立的,即服务端无法直接通过HTTP协议将用户的多次HTTP请求联系在一起。这就好比顾客跟自动售货机的关系一样,无论你在一台自动售货机上购买了多少次商品,自动售货机都没法“记住”你,也就是说你每一次在该售货机上购买商品的时候,自动售货机都会把你当成一个陌生的顾客来对待。然而在Web应用的很多场景下需要维护
前言无论你有没有意识到,日常生活中我们几乎每天都在跟密码学打交道。只要你接触过互联网,那么基本上离不开密码学。举个最简单的例子,现在的很多网站都是通过HTTPS协议进行通信的,而支撑着HTTPS协议正常运行的正是密码学这一理论基础。作为程序员,我们更是有必要了解下密码学的一些基本理论及其背后的原理。本文将通过通俗易懂的语言为大家介绍下密码学的概念,希望大家看完能够对密码学有初步的认识。一、加密在介
前言在之前的文章《深入浅出密码学(上)》中,笔者为大家简要介绍了密码学中的加密跟单向散列函数的概念与应用。在这里先简单回顾下,由于网络通信过程中存在信息被窃听的风险,因此需要通过加密来防止窃听以保护信息安全。此外,在网络通信中数据还存在被篡改的风险,因此我们还需要有一种机制能够识别数据是否被篡改,而单向散列函数正是能够识别数据一致性或完整性的一种机制。然而单向散列函数不能解决的一个问题是不能确认消
前言单例模式应该是设计模式中最容易理解也是用得最多的一种模式了,同时也是面试的时候最常被问到的模式。单例模式的作用就是确保在任何情况下都只有一个实例对象,并提供一个全局的访问点,理解起来并不难,但是要实现一个接近“完美”的单例模式却绝非易事。本文将介绍在Java中如何优雅地实现单例模式,并对比各种实现方式的优缺点,希望诸位在看完之后能对单例模式有更深入的理解。一、单例模式的基础单例模式的定义是确保
前言在之前的文章《聊聊设计模式之单例模式(上)》中,笔者为大家介绍了单例模式的几种常见的实现方式,并列举了各种实现方式的优缺点。在该文章的最后,笔者指出传统的“双重校验”实现“懒汉模式”的方式中存在的问题,由于篇幅所限,未能详述,因此本文将对这个问题继续深入探讨,并为大家介绍单例模式更优雅的实现方式。“双重校验”的陷阱在《聊聊设计模式之单例模式(上)》中,我们讲到因为指令重排序的原因,使得传统的“
前言在之前的文章《深入浅出密码学(上)》与《深入浅出密码学(中)》,笔者为大家介绍了密码学中的加密、单向散列函数与消息认证码的概念与应用。这里带大家简单回顾一下,在网络通信中,消息存在被窃听的风险,因此我们需要对消息进行加密来防止消息被窃听。而如果我们需要保证消息的完整性或一致性,则可以使用单向散列函数。而单向散列函数的局限性是无法对通信双方进行认证,即无法证明某条消息是某个人发出的,因此我们还需
导语模板方法模式是指在父类中定义好算法的骨架,而把具体的算法步骤交给子类去实现的一种设计模式。模板方式模式可以在不改变算法整体骨架的情况下,对算法的某些步骤进行定制或者对算法的某些步骤进行复用。背景在详细介绍模板方法模式之前,我们先引入一个背景进行说明。相信大家都使用过JDBC操作过关系型数据库,我们先回忆一下使用JDBC的大致步骤是什么。首先,我们需要先创建connection,或者从连接池中获
前言代理模式的目的是提供一个代理来控制对一个对象的访问。那么,我们为什么需要控制对一个对象的访问呢?或者说控制对一个对象的访问有什么好处呢?在日常工作中,大家应该会遇到过以下这些问题:一个对象的加载时间太长或者太耗费资源,因此我们需要在必要的时候再加载它;一个对象运行在其他计算机上,而我们需要调用该对象的某些方法;我们可能还需要拦截一个对象的某些方法,并在该方法前后加入一些业务逻辑……以上问题就非
前言在介绍Unix IO模型之前,我们先来说说什么是IO。根据维基百科的定义,IO 指的是输入输出,通常指数据在内部存储器和外部存储器或其他周边设备之间的输入和输出。简而言之,从硬盘中读写数据或者从网络上收发数据,都属于IO行为。以数据输入为例,一个输入操作,通常可以分为2个阶段:等待操作系统内核把数据准备好将数据从操作系统内核复制到用户进程空间这里有一个问题就是,假如操作系统内核还没把数据准备好
前言在之前的文章《深入浅出密码学(上)》、《深入浅出密码学(中)》与《深入浅出密码学(下)》中,沉思君为大家介绍了密码学中一些重要的概念,例如:加密、单向散列函数、消息认证码与数字签名等,如果不太清楚的朋友可以点击文章链接进行阅读。今天我们要讲的是密码学的一个非常广泛且重要的应用——HTTPS。在讲解HTTPS前,我们先来讲下HTTP。HTTP的名称是超文本传输协议,其特点是无状态性、不安全、单向
前言这几天大部分同学应该都过完年陆陆续续回到工作岗位了,说到过年,最开心的莫过于与家人团聚了,当然除了与家人团聚,最令人振奋的事情就是发年终奖了。说到发年终奖,那可真是几家欢喜几家愁啊。今天我们要谈的不是年终奖的多少,说多了都是泪啊,我们来聊聊年终奖怎么算。年终奖怎么算,相信每个人心里都比较清楚,因为入职的时候一般都会跟HR谈好年终奖的细节。但是对于财务部的人来说就比较头疼了,毕竟他们要算的可是整
前言在之前的文章《聊聊设计模式之代理模式》中,笔者为大家介绍了代理模式,在这里简单回顾一下。代理模式的作用是提供一个代理来控制对一个对象的访问,因此我们可以很方便地实现对一个对象的延迟加载,或者在调用一个对象的方法时加入一些业务逻辑。然而之前介绍的代理模式属于静态代理,其缺点是如果目标接口改变了,则目标类跟代理类都会受影响,不太灵活。不过在Java中还有一种代理模式叫动态代理,可以弥补静态代理的缺
前言业界对系统的高可用有着基本的要求,简单的说,这些要求可以总结为如下所示。系统架构中不存在单点问题。可以最大限度的保障服务的可用性。一般情况下系统的高可用可以用几个9来评估。所谓的几个9就是系统可以保证对外提供的服务的时间达到总时间的百分比。例如如果需要达到99.99的高可用,则系统全年发生故障的总时间不能超过52分钟。系统高可用架构我们既然需要实现系统的高可用架构,那么,我们到底需要搭建一个什
数据案例原本的数据库有3张表。t_user :用户表,存放用户的基本信息。t_role :角色表,存放角色信息。t_role_user:存放角色与用户的对应关系。因为业务逻辑的改变,现在要把它们合并为一张表,把t_role中的角色信息插入到t_user中。首先获取到所有用户对应的角色,以用户ID分组,合并角色地到一行,以逗号分隔。SELECT t_user.id,GROUP_CONCAT(t_ro
Redis 字符串底层用的是 sds 结构,该结构同 c 语言的字符串相比,其优点是可以节省内存分配的次数,还可以...这样写是不是读起来很无聊?这些都是别人咀嚼过后,经过一轮两轮三轮的再次咀嚼,吐出来的精华,这就是为什么好多文章你觉得干货满满,但就是记不住说了什么。我希望把这个咀嚼的过程,也讲给你,希望以后再提到 Redis 字符串时,它是活的。前置知识:本篇文章的阅读需要你了解 Redis 的
Copyright © 2005-2025 51CTO.COM 版权所有 京ICP证060544号