分库分表框架ShardingSphere入门学习1
背景传统的将数据集中存储至单一数据节点的解决方案,在性能、可用性和运维成本这三方面已经难于满足互联网的海量数据场景。 从性能方面来说,由于关系型数据库大多采用 B+ 树类型的索引,在数据量超过阈值的情况下,索引深度的增加也将使得磁盘访问的 IO 次数增加,进而导致查询性能的下降;同时,高并发访问请求也使得集中式数据库成为系统的最大瓶颈。 从可用性的方面来讲,服务化的无状态型,能够达到较小成本的随意扩容,这必然导致系统的最终压力都落在数据库之上。而单一的数据节点,或者简单的主从架构,已经越来越难以承担。数据库的可用性,已成为整个系统的关键。 从运维成本方面考虑,当一个数据库实例中的数据达到阈值以上,对于 DBA 的运维压力就会增大。数据备份和恢复的时间成本都将随着数据量的大小而愈发不可控。一般来讲,单一数据库实例的数据的阈值在 1TB 之内,是比较合理的范围。 在传统的关系型数据库无法满足互联网场景需要的情况下,将数据存储至原生支持分布式的 NoSQL 的尝试越来越多。 但 NoSQL 对 SQL 的不兼容性以及生态圈的不完善,使得它们在与关系型数据库的博弈中始终无法完成致命一击,而关 ...
OAuth2.0理解和用法
现在网络的资料到处都是,很容易搜索到自己想要的答案。但答案通常只能解决自己一部分的问题。如果自己想要有一套自己的解决方案,还得重新撸一遍靠谱。 我需要学下OAuth2.0吗? 没看之前以为OAuth2.0是登录认证授权的东西,自己的项目里应该是需要的。实际上OAuth是为了第三方应用访问我们资源用的,大多数开发者基本不会用到这个东西。对于自己应用的认证授权,还是基于拦截器的token,SpringSecurity即可。只有做平台级别,像微信,微博,github这种级别才会用到。而真到那个时候,再看也行,也通常不会是你来做。简而言之,非必须。 接下来,我将从几个方面了解和学习使用OAuth2.0。对不对就不管了,反正我也几乎不会用到。ps.有个项目用到了,所以才会有本文。 OAuth2.0介绍和功能 微信开放平台和github的OAuth2.0接入应用 自己写一个OAuth2.0服务 Springboot OAuth2.0集成 快速了解OAuth2.0资源很多,看起来比较麻烦,可以直接看Authorization Code授权码流程,以微信登录为例子的介绍。 OAuth2.0是什么 ...
LRU算法实现
链表经常见到的另一个算法是LRU(Last Recently Used)缓存淘汰算法。 我们一说到高性能,就会使用各种缓存。页面缓存,浏览器缓存,nginx缓存,接口数据缓存。缓存可以大大提高数据获取的速度。然而,缓存减少耗时的同时需要介质存储对应的数据,介质容量是有限的,所以缓存的数据必然有限。当缓存容量满的时候,我们需要淘汰一些数据,插入新的数据。常见的策略有三种:先进先出策略 FIFO(First In,First Out)、最少使用策略 LFU(Least Frequently Used)、最近最少使用策略 LRU(Least Recently Used)。ps. Redis内存满了是怎么淘汰数据的? 简单的,我们可以使用双向链表来实现LRU。 假设要缓存的数据为obj,我们维护一个双向链表,链表的数据就是obj。每次访问了数据,我们需要将这个数据obj缓存到我们的双向链表中。 遍历我们的缓存链表 如果数据已经存在链表了,取下来,插入链表头部; 如果数据不在链表中: 如果链表容量没满,则将我们的obj插入链表头部; 如果链表容量已经满了,把链表结尾的节点删除,把我们的obj ...
单链表和反转
数据结构第一节就是链表。链表由多个node节点组成,每个node节点包含数据和一个指针。指针指向下一个节点。 组装链表经常问单链表的算法,那你首先要定下来链表的结构,而不是直接思考算法。为了方便使用,我们固定一个哨兵作为头节点。数据节点都在头节点之后。 12345678910/** * @author Ryan Miao */@Datastatic class Node { //是否是head节点。 true-YES private Boolean head; private Integer data; private Node next;} 那么,我们创建的一个节点是这样的 1234567Node head = new Node();head.setData(-1);head.setHead(true);Node node = new Node();node.setData(123);node.setHead(false); 所以,我们首先要创建一个数组1 2 3 4 5 6 7 8 9。 1234567891011121314151 ...
Java基础之Synchronized原理
思维导图svg: https://note.youdao.com/ynoteshare1/index.html?id=eb05fdceddd07759b8b82c5b9094021a&type=note 在多线程使用共享资源的时候, 我们可以使用synchronized来锁定共享资源,使得同一时刻,只有一个线程可以访问和修改它,修改完毕后,其他线程才可以使用。这种方式叫做互斥锁。 当一个共享数据被当前正在访问到线程添加了互斥锁之后,在同一时刻,其他线程只能等待,直到当前线程释放该锁。 synchronized可以添加互斥锁,并且保证被其他线程看到。 synchronized的三种应用方式synchronized关键字最主要有以下3种应用方式,下面分别介绍 修饰实例方法,作用于当前实例加锁,进入同步代码钱要获得当前实例的锁 修饰静态方法,作用于当前类对象加锁,进入同步代码前要获得当前类对象的锁 修饰代码块,指定加锁对象,对给定对象加锁,进入同步代码块前要获得给定对象的锁 synchronized作用于实例方法我们设置类变量static为共享资源, 然后多个线程去修改。修改 ...
Java复习3-类的继承
前言本次学习面向对象设计的另外一个基本概念:继承(inheritance)。这是Java程序设计中的一项核心技术。另外,还要学习反射(reflection)的概念。 继承类、超类、子类123public class Manager extends Employee{ //...} 关键字extends表明正在构造的新类派生于一个已存在的类。已存在的类称为超类(superclass)**、基类(base class)或父类(parent class); 新类称为子类(sbclass)、派生类(derived class)、孩子类(childe class)**. 覆盖方法子类继承父类的字段和方法,但有些方法子类想要修改,可以使用**覆盖(override)**。 12345678910111213141516171819202122232425262728293031323334353637383940414243public class Employee { private String name; private int sal ...
Java复习2-对象与类
回顾基础知识过程中遇到的感觉需要记录一下的知识点。 封装我们设计的class应当尽可能的高内聚,体现为封装的程度。一个class的属性应该只能自己修改,其他class都只是与本class沟通,而不应该有能力修改。比较常见的一个问题是Date属性。 业务开发中经常需要设计class的日期属性,比如birthday, createDate等。 12345678public class User { private String name; private Date birth; public Date getBirth() { return this.birth; }} 我经常设计一个entity,填入字段,然后就直接getter, setter出去,尤其使用lombok后,更是连生成都改自动了。按照封装的要求,这样的做法是不合适的。因为其他class可以获取Date对象,Date对象是可变的。那么,就有可能会产生日期被修改的可能。 如果项目有引入Findbugs的扫描,这个class肯定会被扫描出来的 ...
Java复习1-数据类型
数据类型整形 type 存储 取值范围 int 4字节 -2 147 483 648 ~ 2 147 483 647 (超过20亿) short 2字节 -32 768 ~ 32 7677 long 8字节 -9 223 372 036 854 775 808 ~ 9 223 372 036 854 775 807 byte 1字节 -128 ~ 127 关于范围的计算,1字节=8位。 1byte 即8个1和0的组合范围。 需要记住int是4个字节,32位。 浮点类型 type 存储 范围 float 4字节 -2^128 ~ +2^127 有效位6~7位 double 8字节 -2^1024 ~ +2^1023 有效位 15位 double数值精度是float的两倍,绝大部分都应该采用double而不是float。 字符charchar用来表示单个字符,Java中采用16位来表示,即2个字节。但现在unicode字符长度已经超过了65536,一个char并不能完全覆盖所有的字符。所以,通常不要用char,而是string,否则会有 ...
SpringCloud学习6-如何创建一个服务消费者consumer
上一节如何创建一个服务提供者provider已经启动了一个provider的server,提供用户信息查询接口。接下来,我们启动另一个provider,由于是同一台机器本地测试,我们换一个端口 1--server.port=8084 通过启动传参数覆盖port。这样,我们就有两个provider实例了。接下来,可以使用我们consumer负载均衡的消费这两个provider。 升级eureka依赖eureka之前的pom依赖过期了,需要修改为 1spring-cloud-starter-netflix-eureka-server 同样的,所有的client都要修改为 1spring-cloud-starter-netflix-eureka-client 创建一个consumer工程创建一个子模块。 https://github.com/Ryan-Miao/spring-cloud-Edgware-demo/tree/master/consumer-demo 配置基本和provider一致 12345678910111213141516171819202122 ...
SpringCloud学习5-如何创建一个服务提供者provider
前几篇主要集中在注册中心eureka的使用上,接下来可以创建服务提供者provider来注册到eureka。 demo源码见: https://github.com/Ryan-Miao/spring-cloud-Edgware-demo/tree/master/provider-demo 为了方便版本控制,接下来的项目都是基于https://github.com/Ryan-Miao/spring-cloud-Edgware-demo 这个parent配置的。 创建子moudle provider-demo创建一个子module,项目名叫provider-demo. 填充springboot和springcloud依赖 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455<dependencies> <!--springboot 依赖start--> <dependency> <gro ...