分库分表设计方案
一、背景介绍系统数据库主要分为两个数据库,一个是主要的业务数据存储库,在该库下进行了分表操作;另一个是业务关联性较小的数据库,未进行分表。在当前业务场景下,系统每天的消息发送量基本分布在100万 ~ 3000万之间。消息下发后,用户可以查看消息发送记录,及用户接受状态。系统采用了按天分表的策略,提前为存储消息记录的表按天创建分表,每个大表将会按天创建366个分表,分表以月日为后缀。
1.1 按天分表的优点
用户可以以发送日期为时间限度,查询、导出当天的发送记录及用户接受状态。
可以通过日期条件,限定事务范围,简化分表事务问题。
分表规则简单,方便基于数据库各类连表查询操作。
1.2 分库分表遇到的问题
在开发新业务的过程中,分表数量急速增长,目前系统的分表数量已达7000多。
分表数据分布不均匀,有些表的数据库只有几十万或更少,而有的表的量超过了千万。
分表数量超过千万级,客户查询时会影响数据库性能,当前的分表机制无法做动态扩容。
二、分库分表方案分库分表的采用的常见方案垂直拆分和水平拆分。
2.1 垂直拆分垂直分表垂直分表主要主要针对数据列较多的宽表,一般是表中的字段较多,将不常 ...
动态规划之零一背包问题
一、题目有 NN 件物品和一个容量为 VV 的背包,每件物品有各自的价值,要求在有限的背包容量下,装入的物品总价值最大。
「0-1 背包」是较为简单的动态规划问题,也是其余背包问题的基础。
动态规划是不断决策求最优解的过程,「0-1 背包」即是不断对第 ii 个物品的做出决策,「0-1」正好代表不选与选两种决定。
二、题目分析
关于动态算法,了解的人可能需要2~3分钟,不懂的人可能需要2 ~ 3天,了解动态算法的思想很重要。
2.1 二维数据解法(1)状态f[i][j]定义:前 i 个物品,背包容量 j 下的最优解(最大价值):
当前的状态依赖于之前的状态,可以理解为从初始状态f[0][0] = 0开始决策,有 N 件物品,则需要 N 次决 策,每一次对第 i 件物品的决策,状态f[i][j]不断由之前的状态更新而来。(2)当前背包容量不够(j < v[i]),没得选,因此前 i 个物品最优解即为前 i−1 个物品最优解:
对应代码:f[i][j] = f[i - 1][j]。(3)当前背包容量够,可以选,因此需要决策选与不选第 i 个物品:
选:f[i][j] = f[i - ...
Java中锁分类
一、Java中主流锁
上图摘自:美团技术团队:不可不说的Java“锁”事
1.1 乐观锁 VS 悲观锁乐观锁与悲观锁是一种广义上的概念,体现了看待线程同步的不同角度。在Java和数据库中都有此概念对应的实际应用。
先说概念。对于同一个数据的并发操作,悲观锁认为自己在使用数据的时候一定有别的线程来修改数据,因此在获取数据的时候会先加锁,确保数据不会被别的线程修改。Java中,synchronized关键字和Lock的实现类都是悲观锁。
而乐观锁认为自己在使用数据时不会有别的线程修改数据,所以不会添加锁,只是在更新数据的时候去判断之前有没有别的线程更新了这个数据。如果这个数据没有被更新,当前线程将自己修改的数据成功写入。如果数据已经被其他线程更新,则根据不同的实现方式执行不同的操作(例如报错或者自动重试)。
乐观锁在Java中是通过使用无锁编程来实现,最常采用的是CAS算法,Java原子类中的递增操作就通过CAS自旋实现的。
特点:
悲观锁适合写操作多的场景,先加锁可以保证写操作时数据正确。
乐观锁适合读操作多的场景,不加锁的特点能够使其读操作的性能大幅提升
问题:(1) ABA问题 ...
《极简主义》
简介《极简主义》—— 活出生命真意
[美]乔舒亚·菲尔茨·米尔本 瑞安·尼科迪默斯 —— 著李紫 —— 译
书序极简主义不是要你一无所有,而是要你穿越物质的海洋,找到真正重要的东西。在《极简主义》一书中,放弃高薪主管工作、转身成为美国极简主义生活先锋的乔舒亚和瑞安,分享了他们自己的人生故事和极简主义的生活理念。通过舍弃生活中多余的东西,我们得以超越物质,集中精力追求生命中最重要的 五种价值:健康、人际关系、热情、成长和奉献。
精彩内容幸福源自内部,源自内心,源自充满意义的生活。
不是转瞬即逝的欢愉,而是长久的满足,来自自律、专注、觉知、目的明确的生活。快乐只是一个副产品而已。
快乐是我们专注于某个事情时的副产品,如果直接去寻求快乐,反而难以找到。
我们在这世上只有有限的时间,这些时间可以用来积攒金钱财富,也可以花在有意义的事情上——后者不一定会妨碍人们追求前者,但对财富永无止境的追求并不能将我们带向有意义的生活。
生命是有限的,我们应该先去寻找有意义的事情上。金钱只是在我们寻找有意义事情路上的一种重要工具,而不是我们最终的目标。
我们不打算练得像个健美运动员。我们关心 ...
《可爱的诅咒》
简介《可爱的诅咒》—— 圣母型人格心里自助手册
[英]雅基·马森 —— 著王丽 —— 译
书序生活中总会有一些这样的人,他(她)们将大部分精力都花在家人、朋友和同事身上,甚至对陌生人也有求必应,一旦停止这样做,就会觉得非常内疚,仿佛受了一场”可爱的诅咒”。在他们看来,很多事情的优先级都高于自己的身心健康,结果,支持了所有人,却让自己崩溃。
精彩段落第一章 期望的牢笼我们通常都会觉得自己被淹没在别人的期望中,而且完全不知道该如何以其它方式生活。事实上,就连想到改变,比如拒绝某个请求,都会觉得害怕。
第四章 身体的感受与情绪的觉察我们不敢说出我们与别人不同的意见。这还是”害怕冲突”的问题:当你能够忽略自己的真实想法并享受和睦时,你又何必冒险引起愤怒与不和呢?但是,这是需要我们自己付出代价的。再次重申,我们不敢显露真实的自己,包括我们的价值观、信仰、品味及意见,所以其他人也就永远无法了解真实的我们是什么样子。这种情况下维持的关系会有问题,因为它并非百分百真实。我们的自我感知也会有问题,因为我们并不相信别人是因为我们自身的样子而喜欢我们,而是以为他们喜欢我们只是因为我们与他们的意见一致。 ...
《原生家庭》
简介《原生家庭》 —— 如何修补自己的性格缺陷
[美]苏珊·福沃德 克雷格·巴克 —— 著黄姝 王婷 —— 译
书序 你的所有的感受都是有道理的,尤其是那些灰暗的感受。内心充满痛苦的人,只要能发现这样一个简单的道理,他们的痛苦就会减轻很多。并且这个道理的核心是,你那些灰暗的、一直以来难以被别人和自己理解接纳、似乎无处安放的感受,其实就是来自你的家庭,而且主要是来自你与父母的关系。这是一个真相,我们必须尊重的真相。 —— 武志红 [心里学家、作家]
《被讨厌的勇气》
简介《被讨厌的勇气》 —— “自我启发之父”阿德勒的哲学课
[日]案见一郎, 古贺史健渠海霞 —— 译
书序小心检视,你的成功是否只是以害怕被他人讨厌而换来的。若是如此,那你的成功不幸只代表”你为他人活了一辈子” —— 陈文茜
心里创伤并不存在阿德勒在否定心理创伤学说的时候说了下面这段话:“任何经历本身并不是成功或者失败的原因。我们并非因为自身经历中的刺激——所谓的心理创伤——而痛苦,事实上我们会从经历中发现符合自己目的的因素。决定我们自身的不是过去的经历,而是我们自己赋予经历的意义。”
阿德勒说,决定我们自己的不是“经验本身”而是“赋予经验的意义”。请你注意这一点。并不是说遭遇大的灾害或者幼年受到虐待之类的事件对人格形成毫无影响。相反,影响会很大。但关键是经历本身不会决定什么。我们给过去的经历“赋予了什么样的意义”,这直接决定了我们的生活。人生不是由别人赋予的,而是由自己选择的,是自己选择自己如何生活。
一切烦恼都来自人际关系在人际关系中根本不可能不受伤。只要涉入人际关系就会或大或小地受伤,也会伤害别人。阿德勒曾说“要想消除烦恼,只有一个人在宇宙中生存”。但是,那种事情根本就无 ...
为什么Redis集群使用16384个哈希槽
一、Redis集群特点1.1 Redis集群拓扑结构Redis集群是一个网状结构,每个节点都通过TCP连接跟其它每个节点连接。
在一个有N个节点的集群中,每个节点都有N-1个流出的TCP连接和N-1个流入的TCP连接,这些TCP连接会永久保持,并不是按需创建的。
1.2 Redis集群数据分片Redis集群的实现方案:
客户端分区,代表为 Redis Sharding
代理分区方案,主流实现的有方案有 Twemproxy 和 Codis
查询路由方案,Redis默认实现方案。
1.3 Redis 集群没有使用一致性hash, 而是引入了 哈希槽的概念.Redis 集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽.集群的每个节点负责一部分hash槽,举个例子,比如当前集群有3个节点,那么:
节点 A 包含 0 到 5500号哈希槽.节点 B 包含5501 到 11000 号哈希槽.节点 C 包含11001 到 16384号哈希槽.这种结构很容易添加或者删除节点. 比如如果我想新添加个节点D, 我需要从节点 A, B, C中得部分槽到D上. ...
Redis哨兵模式和集群模式
一、Redis哨兵模式搭建1.1 Redis 的 主从复制模式 和 Sentinel 高可用架构 的示意图
1.2 基于Docker换件搭建Redis哨兵模式本次搭建Redis哨兵模式仅为测试使用,且因资源有限,在一台云主机上安装docker引擎,通过docker容器搭建哨兵模式。
1.2.1 安装环境云主机配置:1核2G
所需软件及环境:docker, docker-compose, redis镜像
1.2.2 Redis主从复制创建docker-compose.yml配置文件:
docker-compose.yml
version: '3'
services:
master:
image: redis
container_name: redis-master
command: redis-server --requirepass redis_hyk --masterauth redis_hyk
ports:
- 6379:6379
slave1:
image: redis
container_ ...
Maven Resources Plugin 二进制文件filtering
一、问题背景Maven项目中打包使用Maven Resources Plugin拷贝配置文件,使用Filtering来处理项目配置文件中的变量,POM文件如下所示:
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<testResources>
<testResource>
<directory>src/test/resources</directory>
<filtering>true</filtering>
</testRe ...