rd

变量级别:

  1. mysql 架构环境:jsp->action->service->dao->mysql(应用 ->dao-> 数据库)
  2. memcached(缓存)+mysql+ 垂直拆分(如买家、卖家)(dao-> 缓存)
  3. mysql 主从复制读写分离(master->slave)
  4. 分库分表(分库:业务相关的一个库,变化少的一个库;)+ 水平拆分 +mysql 集群
  5. mysql 的扩展瓶颈
  6. 今天是什么样子
  7. 为什么用 nosql:传统的数据库难以支撑业务

mysql 引擎 innodb 的行锁

非关系数据经典公式:ACID,原则一直,独立隔离,不需要固定格式,无需多余操作就可以横向扩展

特点:易扩展、大数据量高性能、多样灵活的数据模型、传统 RDBMS VS NOSQL

NOSQL:redis(数据类型丰富,如:淘宝的 tair)、memcache(高速缓存)、mongdb

redis 的理解就是:KV+cache+persistence

大数据时代的(海量、多样、实时以及高并发、高可扩、高性能)

NOSQL 的应用场景:数据结构的日益复杂

(spring 源码、arraylist 底层)

(如果有 VR,支付接口的工程师)

(多数据源多数据类型的存储问题)-- 历史的文件记录

栈内搜索引擎

 

淘宝架构

  99:Perl、CGI、oracle

  00:java、servlet

  01-04:EJB

  05-07:去 EJB:spring、ibatis、webx、antx,底层架构:isearch、mq+esb,数据挖掘、CMS

  08-09:海量数据:Memcached 集群、mysql+ 数据切分 =Cobar、分布式存储、hadoop、KV、CDN

  10:安全、镜像:安全、镜像、应用服务器升级、秒杀、nosql、SSD

  11:敏捷、开发、体验

 

支付接口的重要性

 

多数据源多数据类型的存储问题

  冷数据 --> 关系型数据库(淘宝的 mysql 是改造过的),去 IOE:工业化企业才使用 oracle(去掉 IBM 的小型机,去 oracle,去 EMC 的存储设备)

  数据量大 -->mon/*gdb

  图片:分布式的文件系统 --> 淘宝、腾讯的 TFS,Google 的 GFS 和 Hadoop 的 HDFS

  关键字:ISearch

    阿里支付倪行军,阿里多隆(ISearch,tier)

  波段性的热点高频词汇:tair、redis、memcache

  商品的交易、价格计算、积分:第三方支付、支付宝

 

淘宝中的 UDSL:映射、API 和热点缓存

 

nosql 的经典应用:以一个电商客户、订单、订购。地址模型来对比关系型和非关系型:建表

 

bson 是一种类 json 的二进制形式的存储格式

分布式忌讳关联查询,有的使用冗余数据规避关联查询,分布式支持不了太多的并发

网状关系的数据的处理

 

nosql 的四大分类:

  1.   KV 键值
    1. 新浪:/berkeletdb+redis
    2. 美团:redis+tair
    3. 阿里、百度:memcache+redis
  2.   文档型数据库:bson 较多:mongodb,更像关系型数据库
  3.   列存储
    1. cassandra、HBase
    2. 分布式文件系统
  4.   图关系
    1.   社交网络、推荐系统、网状图
    2. neo4j、infogrid

分布式系统中 CAP 原理:CAP+BASE

  传统的 ACID

  C(强一致性)A(高可用性)P(分布式容忍性) 理论的核心:一个分布式系统最多满足其中的两个属性:一致性、可用性和分区容错性

    CA:单点集群,可扩展性不大(RDBMS 传统数据库)

    CP:mongodb、HBase、Redis

    AP:一致性要求低,大多数网站构架(couchDB)

 

BASE:(基本可用、软状态、最终一致)系统通过某一时刻数据一致性的要求来延伸系统整体伸缩性和性能上的改观

分布式 + 集群:不同的服务器部署不同的服务模块,他们之间通过 RPC/RMI 调用,集群是不同的服务器部署相同的服务模块,通过分布式调度软件进行统一的调度

替代 memchched 的原因:持久化、多样性、数据备份

用处:持久化数据、取最新数据的操作、模拟 httpsession 设定过期时间的功能、发布订阅消息系统、定时器、计数器

怎么用:数据类型的基本操作和配置、持久化和复制,RDB/AOF、事务的控制、复制

tar -zxvf

redis 目录下 make 命令出错(缺少 gcc)

  能上网:yum install gcc-c++

  不能上网:光驱的 rpm -ivh

再次 make 的时候会有问题,由于之前安装的时候产生的多余文件,使用 make distclean

wget 是网址的下载方式

********tplinks******

 

etc 更多的是安装文件的配置文件,usr 中放置的是程序和应用,类似 windows 的 program files,安装文件之后在 /usr/local/bin,opt 是额外安装软件的目录

  启动:redis-sercer /myredis/redis.conf

    redis-cli -p 6379

  使用 ping 命令可查看是否启动成功

 

启动后的杂项基础知识:

  测试性能:redis-benchmark

  单进程模型处理客户端请求,对读写事件的响应是通过 epoll 函数的包装做到的,速度完全依靠主进程的执行效率,epoll 是内核为处理大批量文件描述符而作为改进的 poll,是 linux 下多路复用 IO 接口 select/poll 的增强版本,显著提升程序在大并发连接中只有少数活跃的情况下的系统的 CPU 的利用率

  默认 16 个库,使用 select num 切换数据库

  Dbsize 查找 key 的数量

  keys *

  flushdb 是当前库的数据,flushall 是所有库

  统一密码管理,16 个库都是同样密码

  默认端口 6379(意大利的女歌手 merz)

 

常用五大类型数据:(string、hash、set、list(1.6 的是 entry,1.7 的是 node 节点对象,后面有一个泛型的 value)、zset)

  键:

  字符串:二进制安全的,最大 512M

  列表:

  集合:

  哈希:类似 map<string,object>

  有序集合(zset):前面关联一个 double 的分数

  常见的命令:

    大:redisdoc.com

    中:

del key,删除 key

dump key,序列化

exists key,是否存在

expire key second,过期时间

expireat key timestamp,过期时间 - 时间戳

pexpire key millisecond,毫秒计

pexpireat key millisecond-timestamp,时间戳以毫秒计

keys pattern,符合给定模式的 key

move key db,移动 key 到某个 db

persist key,移除 key 的过期时间

pttl key,返回 key 剩余的过期时间       毫秒

ttl key,返回 key 剩余的过期时间       秒

randomkey,当前数据库随机返回一个 key

rename key newkey,修改 key 名

renamenx key newkey,仅当 key 不存在时修改

type key,key 值的类型

    小:

string:set、get、del、append、strlen

  incr、decr、incrby、decrby(增减)

  getrange、setrange(获取范围的值)

  setex(set with expire)、setnx(set if not exist)

  mset、mget、msetnx(m=more)

  getset

list:blpop key timeout,brpop key timeout,brpoplpush source destination timeout

  lindex key index(从上到下获得元素),linsert key before|after pivot value(在某个值的后面插入)

  llen key

  lpop(rpop) key(出栈),lpush(rpush) key values,lpushx key value,lrange key start stop

  rpop key,rpoplpush source destination,rpush key values,rpushx key value

  lrem key(删除 n 个值)
  ltrim key start end(修剪),lset key index value

  

set:sadd key values,scard key(元素个数)

  sdiff key1 key2,sdiffstore destination key1 key2(差集)

  sinter key,sinterstore destination key(交集)

  sunion key(并集)

  sismember key value,smembers key(不需要 start 和 end),smove source destination value(移动)

  spop key(随机出栈)

  srandmember key(随机抽取几个数据),srem key value(删除),sunion key,sunionstore destination key

  sscan key cursor [match pattern] [count count]

hash:hset、hget、hmset、hmget、hsetall、hdel

  hlen、hexists key、hkeys、hvals

  hincreby、hincrebyfloat

  hsetnx

 zset:zadd key score member、zcard key,zcount key min max,

  zincrby key increment member,zinterstore destination numkeys

  zlexcount key min max,zrange key start end,zrangebylex key min max,zrangebyscore key min max(withscores、( 不包含 、limit),

  zcard、zcount(范围)、zrank(下标)、zscore(值),zrem member(删除)

  zrevrank key values(逆转),zrevrangebyscore key min max(withscores、( 不包含 、limit) 

https://wenku.baidu.com/view/2f22944669eae009581bec2a.html

 

配置文件(在 linux 编码,配置大于编码)

  include:包含其他的配置文件

  general(通用):

    daemonize yes(后台运行)

    pidfile:(进程管道 id 文件)

    tcp-backlog 511(未完成三次握手 + 完成三次握手)(除非用 apache jemter 模拟)

    bind:绑定网卡

    tcp-keepalive 0

  security

  limits

    maxclients

    maxmemory

    maxmemory-policy(6 种,是否设置过期时间的、是使用 LRU 还是 random 算法清楚,还是针对时间的 TTL 方式移除,以及最后的 noeviction 永不过期)

    maxmemory-samples(LRU 和 TTL 不是精确的算法,需要样本)

 

redis 的持久化(RDB(redis database)、AOF(append only file))

  RDB:时间段将内存的保存到磁盘,也就是行话的 snapshot 快照,恢复是将快照文件直接读到内存中

    会单独创建一个子进程进行持久化,先写入一个临时文件,持久化结束后用这个文件替换上一次持久化好的文件。(对数据的完整性不是非常敏感的时候)

  Fork:复制一个完全相同的进程

  保存的是 dump.rdb

  配置文件的位置:snapshotting

    save seconds changes(after xxx seconds if at least changes keys change)

      默认:1min 10000

       5min 10

       15min 1

    stop-writes-on-bgsave-error:配置成 no 就是不在乎数据的一致性

    rdbcompression:采用 LZF 算法进行压缩

    rdbchecksum:使用 CRC64 算法进行数据校验

    rdbfilename

    dir

  触发 RDB 的方法:冷拷贝

    save,bgsave(前面的是阻塞操作,后面的是后台异步),flushall

  如何恢复:dump.rdb 移动到安装目录

  优势:适合大规模的数据恢复

  劣势:最后一次有可能丢失

判断启动的方式:

  ps -ef|grep redis

  lsof -i:6379

  

  AOF:日志的形式记录写操作,只许追加,不可改写

    appendonly on

    appendfilename

    appendfsync:always、everysec、no

    rewrite:把文件压缩,fork 一个新的进程,记录上次重写时候 aof 的大小,默认配置是当 aof 文件大小是上次 rewrite 后大小的一倍且文件大于 64M 时

      no-appendfsync-on-rewrite

      auto-aof-rewrite-min-size

      auto-aof-rewrite-percenttage

    aof 的优势:数据同步;劣势:aof 的文件远大于 rdb,恢复慢

 

事务(2.2 后支持 CAS:check and set):一个队列中,一次性、顺序性和排他性

  常用命令:discard(取消事务)、exec、multi(标记事务块)、unwatch(取消全部监视)、watch key

  case1:正常执行:multi--------exec

  case2:放弃事务:multi--------discard

  case3:全体连坐:原子性

  case4:冤头债主

  case5:watch 监控:悲观锁、乐观锁、CAS

 

主从复制(读写分离、容灾恢复)

  只配置从库

  从库配置:slaveof 主库 ip 主库端口(每次启动都需要使用,除非配置到配置文件)

  修改配置文件细节操作:拷贝多个 conf 文件,开启 daemonize yes,pid 文件名字,指定端口,log 文件名字,dump.rdb 名字

  常用:一主二仆(读写分离)

      首先看一下信息:info replication

     薪火相传:master-->slave-->slave

     反客为主:slave no one

  复制原理:第一次是全量,之后是增量:发送 sync 命令,重新连接也要全量

  哨兵模式:监控,反客为主的自动版

    新建 sentinel.conf 文件

    sentinel monitor host6379 ip count(票数)

    之后挂掉的 master 启动后,成为 slave

  复制的缺点:复制的延时