分库分表

文章整理于网上内容, 更多详细内容参考底部[相关资料]

水平分表、垂直分表、水平分库分表、垂直分库

为什么要分库分表? 需要解决什么问题?

业务量高速增长后, 之前的数据表数据读写开始不适应, 响应系统效率及用户体验. 解决I/O问题.

垂直分表

通俗讲”大表拆小表”, 拆表便于开发和维护但是改写以前的查询语句, 会额外带来一定的成本和风险. 拆分字段的操作建议在数据库设计阶段做好.

垂直分库

垂直分库在”微服务”非常普及了, 按照业务模块划分出不同的数据库, 而不是所有的表都放在同一个数据库中.

水平分表

水平分表也叫横向分表, 将表中不同的数据行按照一定规律分布到不同的数据库表中, 降低单表数量, 优化查询性能. 常见方式通过主键或时间等字段进行Hash和取模后拆分. 分表后还是在同一个数据库中还是会有I/O瓶顶.

水平分库分表

思路和水平分表一样, 不同的是分的表在不同的数据库中, 很多大型互联网公司选择的做法.

跨库Join问题

全局表: 类似”数据字典”, 每个库都保留一份.

字段冗余: 需要关联查询的字段做冗余(空间换时间), 避免join.

数据同步: ETLI工具实施

系统层组装: 详见[分库分表的几种常见形式以及可能遇到的难]

跨库事务问题

以往在代码中通过spring注解简单配置就能实现事务的, 现在则需要花很大的成本去保证一致性.

相关资料

分库分表的几种常见形式以及可能遇到的难
大众点评订单系统分库分表实践

Memcached使用记录

Memcached是一个自由开源的,高性能,分布式内存对象缓存系统。
Memcached是以LiveJournal旗下Danga Interactive公司的Brad Fitzpatric为首开发的一款软件。现在已成为mixi、hatena、Facebook、Vox、LiveJournal等众多服务中提高Web应用扩展性的重要因素。
Memcached是一种基于内存的key-value存储,用来存储小块的任意数据(字符串、对象)。这些数据可以是数据库调用、API调用或者是页面渲染的结果。
Memcached简洁而强大。它的简洁设计便于快速开发,减轻开发难度,解决了大数据量缓存的很多问题。它的API兼容大部分流行的开发语言。

继续阅读

[转]数据库外键

外键是否采用看业务应用场景,以及开发成本的,大致列下什么时候适合,什么时候不适合使用:

  1. 互联网行业应用不推荐使用外键: 用户量大,并发度高,为此数据库服务器很容易成为性能瓶颈,尤其受IO能力限制,且不能轻易地水平扩展;若是把数据一致性的控制放到事务中,也即让应用服务器承担此部分的压力,而引用服务器一般都是可以做到轻松地水平的伸缩;

2.传统行业
1>.软件应用的人数有限,换句话说是可控的;
2>.数据库服务器的数据量也一般不会超大,且活跃数据有限;

综合上述2句话描述,也即数据库服务器的性能不是问题,所以不用过多考虑性能的问题;另外,使用外键可以降低开发成本,借助数据库产品自身的触发器可以实现表与关联表之间的数据一致性和更新;
最后一点,使用外键的方式,还可以做到开发人员和数据库设计人员的分工,可以为程序员承担更多的工作量;

为何说外键有性能问题:
1.数据库需要维护外键的内部管理;
2.外键等于把数据的一致性事务实现,全部交给数据库服务器完成;
3.有了外键,当做一些涉及外键字段的增,删,更新操作之后,需要触发相关操作去检查,而不得不消耗资源;
4.外键还会因为需要请求对其他表内部加锁而容易出现死锁情况;

数据库的诸多设计,帐号,权限,约束,触发器,都是为 C/S 结构设计的,是以 C 端不可信做为假设前提的。B/S 模式安全边界前移到 web 服务层,应用与数据库之间是可信的,应用自行完成这些功能更加灵活。所以能不用就不用。

以上内容转自知乎-大家设计数据库时使用外键吗

redis使用记录

基础

REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统。

Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

Redis 与其他 key – value 缓存产品有以下三个特点:

  • Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
  • Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
  • Redis支持数据的备份,即master-slave模式的数据备份。

更多>>reids中文简介

数据类型

类型 描述 类型 描述
string 字符串 hash 哈希
list 列表 set 集合
zset sorted set 有序列表

命令操作

自增: INCR [key]

read

获取自增值: get [key]
获取所有的key: keys * eg: keys imf:* 模式: ? * [] 更多>>
取出值: get [key_name]
值类型: type [key_name]
hash取值字段值: hget [key] [字段] eg:hget imf:1 uid

create

update

更新值: set [key_name] [val]

delete

删除值: del [key_name]
清空数据: flushall

更多>> 常用 | 官方全部 | laravel

cmd 中用 set zz 中文 get 会出现乱码

如何在get时取到它的中文呢?只需要在redis-cli 后面加上 –raw

redis配置密码

通过配置文件进行配置: yum方式安装的redis配置文件通常在/etc/redis.conf中,打开配置文件找到

#requirepass foobared

去掉行前的注释,并修改密码为所需的密码,保存文件

requirepass myRedis

重启redis: sudo service redis restart

或者

sudo service redis stop
sudo redis-server /etc/redis.conf
这个时候尝试登录redis,发现可以登上,但是执行具体命令是提示操作不允许

redis-cli -h 127.0.0.1 -p 6379
redis 127.0.0.1:6379>
redis 127.0.0.1:6379> keys *
(error) ERR operation not permitted
redis 127.0.0.1:6379> select 1
(error) ERR operation not permitted
redis 127.0.0.1:6379[1]>

尝试用密码登录并执行具体的命令看到可以成功执行

redis-cli -h 127.0.0.1 -p 6379 -a myRedis
redis 127.0.0.1:6379> keys *
1) “myset”
2) “mysortset”
redis 127.0.0.1:6379> select 1
OK
redis 127.0.0.1:6379[1]> config get requirepass
1) “requirepass”
2) “myRedis”

更多>>>redis配置认证密码

如何在windows下开机自启

将CMD运行启用的命令,写到BAT文件中, 然后把这个BAT文件放到系统“启动”的文件夹中。

查阅资料

redis官网
菜鸟教程-中文redis手册
laravel-redis方法 概要: src/ClientInterface.php
php-redis做mysql的缓存,怎么异步redis同步到mysql数据库 概要: 讨论里的思路不错.
Redis缓存数据提高访问性能并同步到mysql永久保存 概要: Linux的contrab定时任务机制. 已有同步基本概念.
Redis可以用来做数据库吗
怎么将关系型数据库转移到kv数据库-表设计 概要: redis中对应关系数据库中增加数据
redis实现关系型数据库表设计 概要: redis中的自增