Fork me on GitHub

分布式ID

分布式ID

前言

  • 在说分布式ID的具体实现之前,我们来简单分析一下为什么用分布式ID?分布式ID应该满足哪些特征?

1、什么是分布式ID?

拿MySQL数据库举个栗子:

  • 在我们业务数据量不大的时候,单库单表完全可以支撑现有业务,数据再大一点搞个MySQL主从同步读写分离也能对付。
  • 但随着数据日渐增长,主从同步也扛不住了,就需要对数据库进行分库分表,但分库分表后需要有一个唯一ID来标识一条数据,数据库的自增ID显然不能满足需求;特别一点的如订单、优惠券也都需要有唯一ID做标识。此时一个能够生成全局唯一ID的系统是非常必要的。那么这个全局唯一ID就叫分布式ID

2、那么分布式ID需要满足那些条件?

  • 全局唯一:必须保证ID是全局性唯一的,基本要求
  • 高性能:高可用低延时,ID生成响应要快,否则反倒会成为业务瓶颈
  • 高可用:100%的可用性是骗人的,但是也要无限接近于100%的可用性
  • 好接入:要秉着拿来即用的设计原则,在系统设计和实现上要尽可能的简单
  • 趋势递增:最好趋势递增,这个要求就得看具体业务场景了,一般不严格要求
阅读更多...

Linux-03-PV

Linux-03-PV

1. 疑惑解答

  • 进程通常分为就绪、运行和阻塞三个工作状态。三种状态在某些条件下可以转换,三者之间的转换关系如下:

mark

进程三个状态之间的转换就是靠PV操作来控制的。

PV操作主要就是P操作、V操作和信号量。其中信号量起到了至关重要的作用。

阅读更多...

Linux-04-僵尸进程,孤儿进程

Linux-04-僵尸进程,孤儿进程

前言

  • 正常情况下,子进程是通过父进程创建的,子进程再创建新的进程。子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程 到底什么时候结束。 当一个 进程完成它的工作终止之后,它的父进程需要调用wait()或者waitpid()系统调用取得子进程的终止状态

  孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。

  僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵死进程。

阅读更多...

Leetcode-459-重复的子字符串

Leecode-459. 重复的子字符串

题目描述

给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
示例 1:

输入: "abab"

输出: True

解释: 可由子字符串 "ab" 重复两次构成。
示例 2:

输入: "aba"

输出: False
示例 3:

输入: "abcabcabcabc"

输出: True

解释: 可由子字符串 "abc" 重复四次构成。 (或者子字符串 "abcabc" 重复两次构成。)

思路

如果您的字符串 S 包含一个重复的子字符串,那么这意味着您可以多次 “移位和换行”`您的字符串,并使其与原始字符串匹配。

1
2
3
4
5
例如:abcabc

移位一次:cabcab
移位两次:bcabca
移位三次:abcabc

现在字符串和原字符串匹配了,所以可以得出结论存在重复的子串。

基于这个思想,可以每次移动k个字符,直到匹配移动 length - 1 次。但是这样对于重复字符串很长的字符串,效率会非常低。在 LeetCode 中执行时间超时了。

为了避免这种无用的环绕,可以创建一个新的字符串 str,它等于原来的字符串 S 再加上 S 自身,这样其实就包含了所有移动的字符串。

比如字符串:S = acd,那么 str = S + S = acdacd

acd 移动的可能:dac、cda。其实都包含在了 str 中了。就像一个滑动窗口

一开始 acd (acd) ,移动一次 ac(dac)d,移动两次 a(cda)cd。循环结束

所以可以直接判断 str 中去除首尾元素之后,是否包含自身元素。如果包含。则表明存在重复子串。

1
2
3
4
5
6
class Solution {
public boolean repeatedSubstringPattern(String s) {
String str = s + s;
return str.substring(1, str.length() - 1).contains(s);
}
}

Java-基础-Integer和int

Java-基础-Integer和int

概要

int和Integer的区别

  • Integer的默认值是null,int的默认值是0

  • Integer是int的包装类(引用数据类型 ),int则是java的一种基本数据类型

  • Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值

  • Integer变量必须实例化后才能使用,而int变量不需要

阅读更多...

Redis-15-mysql和redis缓存不一致

Redis-15-mysql和redis缓存不一致

前言

  • 这实际上是个“如果要做的足够精致是非常难的“问题。缓存失效被称为计算机科学里最难的两个问题之一(另外一个是起名字)。

  • 先对本题一致性做个说明。这里的不一致是指:假如一个数据访问者同时读取Redis和DB,他能在一段时间里发现二者不一样。

  • 不错,如果一份数据放在DB,然后copy到Redis,然后改DB,那么Redis是不会自己魔幻般同步变更的。

  • 必须有某种机制告诉Redis该变了。这些机制包括(但不仅仅限于):

阅读更多...

Redis-16-Redis分布式

Redis-16-Redis分布式

1. 为什么用Redis?

  1. 单线程的redis为什么这么快??

分析:这个问题其实是对redis内部机制的一个考察。

回答:主要是以下三点
(一)纯内存操作
(二)单线程操作,避免了频繁的上下文切换
(三)采用了非阻塞I/O多路复用机制

关于Redis的 I/O多路复用:

mark

  • 参照上图,简单来说,就是。我们的redis-client在操作的时候,会产生具有不同事件类型的socket。在服务端,有一段I/0多路复用程序,将其置入队列之中。然后,文件事件分派器,依次去队列中取,转发到不同的事件处理器中。
  • 需要说明的是,这个I/O多路复用机制,redis还提供了select、epoll、evport、kqueue等多路复用函数库
阅读更多...
  • © 2019-2022 Zhuuu
  • PV: UV:

请我喝杯咖啡吧~

支付宝
微信