- 博客(21)
- 收藏
- 关注
原创 典型数据库架构设计
一、用户中心用户中心是一个常见业务,主要提供用户注册、登录、信息查询与修改的服务,其核心元数据为:User(uid, uname, passwd, sex, age,nickname, …)其中:uid为用户ID,主键uname, passwd, sex, age, nickname, …等为用户的属性数据库设计上,一般来说在业务初期,单库单表就能够搞定这个需求。 二、图示说明为了方便大家理解,后...
2018-05-02 13:20:40 19831
原创 MySQL冗余数据的三种方案
一,为什么要冗余数据互联网数据量很大的业务场景,往往数据库需要进行水平切分来降低单库数据量。水平切分会有一个patition key,通过patition key的查询能够直接定位到库,但是非patition key上的查询可能就需要扫描多个库了。此时常见的架构设计方案,是使用数据冗余这种反范式设计来满足分库后不同维度的查询需求。例如:订单业务,对用户和商家都有订单查询需求:Order(oid, ...
2018-05-02 13:10:46 708
原创 冗余表数据一致性
一、需求缘起互联网很多业务场景的数据量很大,此时数据库架构要进行水平切分,水平切分会有一个patition key,通过patition key的查询能够直接定位到库,但是非patition key上的查询可能就需要扫描多个库了。例如订单表,业务上对用户和商家都有订单查询需求:Order(oid, info_detail)T(buyer_id, seller_id, oid)如果用buyer_id...
2018-05-02 13:09:27 236
原创 好接口的设计与实现
一、好接口的特性易读易用,难于误用功能独立容易扩展二、好接口设计的基本原则只做并做好一件事 函数名自解释 不恰当的函数名,往往是不恰当设计的征兆如果没做到上一点,就将函数分解 只增加,永远不要删除函数与接口(你永远不知道这个接口被谁在使用)实现永远不能影响接口 举例:不能假定函数调用者只能使用hash 不能对外暴露实现细节最小化访问 尽量...
2018-05-02 13:08:48 543
原创 索引技巧
花1分钟时间,了解聚集索引,非聚集索引,联合索引,索引覆盖。 举例,业务场景,用户表,表结构为:t_user(uid primary key,login_name unique,passwd,login_time,age,…); 聚集索引(clustered index):聚集索引决定数据在磁盘上的物理排序,一个表只能有一个聚集索引,一般用primary key来约束。 举例:t_user场景中,...
2018-05-02 13:08:04 187
原创 线上操作与线上问题排查实战
一、了解机器连接数情况问题:1.2.3.4的sshd的监听端口是22,如何统计1.2.3.4的sshd服务各种连接状态(TIME_WAIT/ CLOSE_WAIT/ ESTABLISHED)的连接数。 参考答案:netstat -n | grep 1.2.3.4:22 | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’netstat ...
2018-05-02 13:07:27 151
原创 广告系统简易流程与架构
一、业务简述从业务上看 整个智能广告系统,主要分为:1)业务端:广告主的广告后台2)展现端:用户实际访问的页面业务端,广告主主要有两类行为:1)广告设置行为:例如设置投放计划,设置地域,类别,关键字,竞价等2)效果查看行为:例如广告展示次数是多少,广告点击次数是多少等展现端,用户主要也有两类行为:1)站点浏览行为:用户浏览实际的信息,此时广告系统决定出广告主的什么广告2)广告点击行为:此时广...
2018-05-02 13:06:12 11535 1
原创 数据库操作10条SQL技巧
一、一些常见的SQL实践(1)负向条件查询不能使用索引select * from order where status!=0 and stauts!=1not in/not exists都不是好习惯可以优化为in查询:select * from order where status in(2,3) (2)前导模糊查询不能使用索引select * from order where desc like...
2018-05-02 13:05:10 246
原创 MySQL的索引优化
假设订单业务表结构为:order(oid, date, uid, status, money, time, …)其中:oid,订单ID,主键date,下单日期,有普通索引,管理后台经常按照date查询uid,用户ID,有普通索引,用户查询自己订单status,订单状态,有普通索引,管理后台经常按照status查询money/time,订单金额/时间,被查询字段,无索引… 假设订单有三种状态:0已下...
2018-05-02 13:02:35 198
原创 zookeeper 数据源动态配置
一、实现的方式数据源datasource,数据库的连接或者连接池的具体配置都在其中,因此,我们在修改数据库的配置的同时修改datasource 就可以不需要重新启动项目而实现数据库的切换。使用org.apache.commons.dbcp.BasicDataSource 说明:这是一种推荐说明的数据源配置方式,它真正使用了连接池技术<bean id="dataSource" class="...
2018-05-02 13:01:48 1512
原创 秒杀系统架构思路
一、秒杀业务为什么难做1)im系统,例如qq或者微博,每个人都读自己的数据(好友列表、群列表、个人信息);2)微博系统,每个人读你关注的人的数据,一个人读多个人的数据;3)秒杀系统,库存只有一份,所有人会在集中的时间读和写这些数据,多个人读一个数据。 例如:小米手机每周二的秒杀,可能手机只有1万部,但瞬时进入的流量可能是几百几千万。又例如:12306抢票,票是有限的,库存一份,瞬时流量非常多,都读...
2018-05-01 00:10:10 237
原创 NIO笔记9_管道(Pipe)
JavaNIO 管道是2个线程之间的单向数据连接。Pipe有一个source通道和一个sink通道。数据会被写到sink通道,从source通道读取。public class TestPipe { @Test public void test1() throws IOException{ //1. 获取管道 Pipe pipe = Pipe.open(); //2. 将缓冲...
2018-04-30 20:14:33 1254
原创 NIO笔记8_DatagramChannel
Java NIO中的DatagramChannel是一个能收发UDP包的通道。操作步骤:打开DatagramChannel接收/发送数据public class TestNonBlockingNIO2 { @Test public void send() throws IOException{ DatagramChannel dc = DatagramChannel.open()...
2018-04-30 20:13:18 128
原创 NIO笔记7_阻塞与非阻塞(下)
/* * 使用 NIO 完成网络通信的三个核心: * * 1. 通道(Channel):负责连接 * * java.nio.channels.Channel 接口: * |--SelectableChannel * |--SocketChannel * |--ServerSocketChannel * |--DatagramChann...
2018-04-30 20:03:42 127
原创 NIO笔记6_阻塞与非阻塞(上)
传统的IO 流都是阻塞式的。也就是说,当一个线程调用read() 或write() 时,该线程被阻塞,直到有一些数据被读取或写入,该线程在此期间不能执行其他任务。因此,在完成网络通信进行IO 操作时,由于线程会阻塞,所以服务器端必须为每个客户端都提供一个独立的线程进行处理,当服务器端需要处理大量客户端时,性能急剧下降。Java NIO 是非阻塞模式的。当线程从某通道进行读写数据时,若没有数据可用...
2018-04-24 17:22:45 216
原创 NIO笔记5_字符集
Java NIO提供了字符集,实现对文件编码,解码的更好支持,用字符集可以获取系统支持的编码格式,在获取文件时,可以指定解码格式,然后进行输出时,指定编码的格式,避免获取和输出的文件时乱码。 availableCharsets():获取系统可支持的编码格式 canEncode() :通知此 charset 是否支持编码 newDecoder() :为此 charset 构造新的解码器。 ne...
2018-04-24 17:04:32 138
原创 NIO笔记4_分散(Scatter)和聚集(Gather)
分散读取(Scattering Reads)是指从Channel 中读取的数据“分散”到多个Buffer 中。注意:按照缓冲区的顺序,从Channel 中读取的数据依次将Buffer 填满。聚集写入(Gathering Writes)是指将多个Buffer 中的数据“聚集”到Channel。注意:按照缓冲区的顺序,写入position 和limit 之间的数据到Channel 。 //分散和聚集...
2018-04-24 16:47:14 192
原创 NIO笔记3_通道Channel
通道(Channel)通道(Channel):由java.nio.channels 包定义的。Channel 表示IO 源与目标打开的连接。Channel 类似于传统的“流”。只不过Channel 本身不能直接访问数据,Channel 只能与Buffer 进行交互。Java 为Channel 接口提供的最主要实现类如下:•FileChannel:用于读取、写入、映射和操作文件的通道。•Datagr...
2018-04-23 23:24:53 422
原创 NIO笔记2_直接与非直接缓冲区
一、缓冲区(Buffer):在 Java NIO 中负责数据的存取。缓冲区就是数组。用于存储不同数据类型的数据 根据数据类型不同(boolean除外),提供了相应类型的缓冲区: ByteBuffer CharBuffer ShortBuffer IntBuffer LongBuffer FloatBuffer DoubleBuffer 上述缓冲区的管理方式几乎一致,通过 allocate()...
2018-04-23 23:18:53 193
原创 NIO笔记1_NIO简介与缓冲区Buffer
Java NIO 简介Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IOAPI,可以替代标准的Java IO API。NIO与原来的IO有同样的作用和目的,但是使用的方式完全不同,NIO支持面向缓冲区的、基于通道的IO操作。NIO将以更加高效的方式进行文件的读写操作。 Java NIO 与IO 的主要区别 通道和缓冲区Java NIO系统的核心在于:通道(Channel...
2018-04-22 19:36:16 153
原创 数据库垂直拆分
一、缘起当数据库的数据量非常大时,水平切分和垂直拆分是两种常见的降低数据库大小,提升性能的方法。假设有用户表:user(uid bigint,name varchar(16),pass varchar(16),age int,sex tinyint,flag tinyint,sign varchar(64),intro varchar(256)…);水平切分是指,以某个字段为依据(例如uid),按...
2018-04-22 19:13:16 157
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人