NoSQL入门

NoSQL概述

1998年提出,原意是No SQL! 2008年受到重视,因为在2008正式进入Big Data时代。Not Only SQL!互补的关系。

高可用,分区容忍性。

####分类:

  • K-V: 键值对数据库,比如:Redis。以键值对形式保存(存取性能特别好)
  • Document:文档数据库,比如:MongoDB。查找方便,可扩展性强,传统关系型数据库扩容很困难。
  • Graph: 图数据库,网状结构。比如:Neo4j。适合社交性软件,一度二度人脉,类似脉脉。
  • 列簇:列簇数据库,把相关数据放到列里面。比如:HBase.适合分布式存储,数据的规约处理

CAP定理(CAP theorem)http://www.runoob.com/mongodb/nosql.html

在计算机科学中, CAP定理(CAP theorem), 又被称作 布鲁尔定理(Brewer’s theorem), 它指出对于一个分布式计算系统来说,不可能同时满足以下三点:

  • 一致性(Consistency) (所有节点在同一时间具有相同的数据)
  • 可用性(Availability) (保证每个请求不管成功或者失败都有响应)
  • 分隔容忍(Partition tolerance) (系统中任意信息的丢失或失败不会影响系统的继续运作)

CAP理论的核心是:一个分布式系统不可能同时很好的满足一致性,可用性和分区容错性这三个需求,最多只能同时较好的满足两个。

因此,根据 CAP 原理将 NoSQL 数据库分成了满足 CA 原则、满足 CP 原则和满足 AP 原则三 大类:

  • CA - 单点集群,满足一致性,可用性的系统,通常在可扩展性上不太强大。

  • CP - 满足一致性,分区容忍性的系统,通常性能不是特别高。

  • AP - 满足可用性,分区容忍性的系统,通常可能对一致性要求低一些。

    传统应用和金融类应用考虑的是CA,互联网和移动互联网时代的应用更注重AP

主流NoSQL数据库

Redis概述

特点:高速缓存,在内存中运行,持久化才保存到硬盘中

内存的读写速率大概是:G赫兹,一秒2-4G DDR:双倍速通道

​ 机械硬盘:一秒 50兆左右

​ 固态硬盘:几百兆

###Redis入门

查看Linux系统中是否有redis服务器和客户端工具:redis-server –version/redis-cli –version

#####修改redis配置文件:

  • ​ bind 172.16.252.192:绑定内网地址

  • ​ port 6379:端口默认是6379(信息隐藏技术)走的是TCP,端口是0-65535

  • ​ tcp-backlog 511:队列大小

  • ​ daemonize no:改成yes的话开机自启,随系统启动。守护进程(不改)

  • ​ logfile “”:日志文件的位置

  • ​ databases 16:默认开启16个数据库

  • ​ save 900 1

    203 save 300 10
    204 save 60 10000:持久化的机制:
    

​ (含义是:In the example below the behaviour will be to save:
190 # after 900 sec (15 min) if at least 1 key changed
191 # after 300 sec (5 min) if at least 10 keys changed
192 # after 60 sec if at least 10000 keys changed
193 #
194 # Note: you can disable saving completely by commenting out all “save” lines. It is also

​ possible to remove all the previously conf igured save

197 #   points by adding a save directive with a single empty      string argument)
  • ​ requirepass 1qaz2wsx:设置密码,可以通过redis控制你的Linux系统

  • ​ maxclients 10000:最大允许10000客户端连接

  • ​ appendonly yes:AOF持久化机制

#####参考命令:

绑的是内网,连的是公网

  • 开启redis:redis-server redis_628.conf
  • 拿到后台运行:bg %1
  • 查看后台应用:jobs
  • 查看进程:ps -ef | grep redis
  • 查看端口是否被占用:netstat -nap | grep redis
  • 连接客户端:redis-cli -h 172.16.252.192
    ​ auth 1qaz2wsx:认证
  • redis设置过期时间:set username karen ex 30
  • ttl username:time to live查看存活时间

    -1:永不超时
    

    -2:查无此键

  • expire username 120:设置超时时间

  • 手动保存:save
  • 后台保存:bgsave
  • 模糊查找:keys *2
  • 恢复你的数据的方法:

    rdb:保存的数据

    aof:记得你的指令(优选),用你敲过的命令来恢复数据

  • 判断有没有这个键:exists foo

    1有,0没有

  • 退出

    ​ quit

    ​ shutdown /save/nosave:关机,默认保存

  • redis值的类型:字符串,哈希表,列表,集合,有序集合

  • redis也有事务,发布订阅

  • redis-benchmark -h 172.16.252.192 :redis 基准测试(相当于跑分软件)

  • Z:暂停,C:停止

实现对数据的高速访问,经常要用的数据放到内存中,使用redis数据库,因为关系型数据库有锁所以越到后面更新越慢

Redis的数据类型

字符串

单个键对应的数据不能超过512兆

  • append:增加
  • strlen:看长度
  • setrange:字符串的替换,把指定的范围改为你想要的内容

​ 120.79.137.184:6379> get name
“wangwang”
120.79.137.184:6379> strlen name
(integer) 8
120.79.137.184:6379> setrange name 5 hellokitty
(integer) 15
120.79.137.184:6379> get name
“wangwhellokitty”

  • incr :增加1
  • incrby number 50:增加50
  • decr:减少1
  • decrby:减少 量
  • getset:拿到之前的并重置建对应的值
哈希表

最好的用来保存对象,以键值对的形式,在字典中又放了字典

  • hset:见名知意
  • hget:同上
  • hgetall:同上
  • hdel:同上
  • hexists:判断字段是否存在
  • hkeys:看所有的
  • hlen:长度
  • hincrby:加字段的值
  • hincrbyfloat:加字段浮点数
  • hvals:拿一个键对应的所有值
列表

模拟栈和队列

队列:左边取,右边放,

栈:先进后出,后进先出,

受限队列:用ltrim

  • lpush:放东西,从左往右放
  • lpop:取东西,从左往右取,元素已经取走了
  • rpush:从右边放
  • rpop:从右边取
  • lrange:从左边往右边取,元素没有取走

​ lrange mylist 2 5:从左往右取2-5

  • lrange mylist3 0 -1:全部取完
  • ltrim:保留,限定只取某一个范围,截取的部分被保留,其他元素已经取走了
集合

元素是没有下标的,自动去重,可以做交并叉运算

元素是离散的,没有序

  • sadd set1 apple orange orange:放元素
  • scard set1:查看键的大小,多少值
  • smembers set1:取出键,无序的
  • sinter set1 set2:查看交集
  • sunion set1 set2:查看并集
  • sdiff set1 set2:求差集

​ set1里面有,set2里面没有的

​ sdiff set2 set1: 2有1没有

  • spop set1:取元素,默认取一个,顺序不一,根据内部生成的码来取,取走了
  • srandmember set2 2 :随机取两个,没取走
  • sismember set2 grape:判断元素是否在集合中
有序集合(Zset)

跟集合比较可以排序,在放元素进入时,绑定score大小决定他的顺序

用在动态排位,动态榜单应用

  • zadd players 100 zhao 85 qian 200 sun 120 lee 180 zhou:放元素
  • zrange players 0 -1:正向排序取出所有
  • zrevrange players 0 -1:反向排序取出所有
  • zrevrange players 0 -1 withscores:分数也会显示
  • zcard players:有多少元素
  • zcount players 150 200:计数,在150到200中的元素有多少个

#####GEO地理位置类型

Redis3加入的新类型

LBS应用:location-based service:基于位置的服务

根据位置算距离有多远,范围内的搜索

  • geoadd:加元素,要加经纬度坐标
  • geopos:坐标
  • georadius:在半径内
  • geodist:算距离

#####事务

  • multi:开启
  • exec:提交
  • discard:回滚

#####线程安全问题:

redis是线程安全的还是不安全的?redis是单线程+多路I/O复用的工作模式,异步io模式,多个读写操作并发的进行,单线程保持安全,支持多线程操作。所以redis和关系型数据库一样都是安全的。

第二类丢失更新,没有保护数据,多线程访问,后面覆盖前面的

线程之间共享数据很容易,但多个进程之间是相互隔离的,多进程中有一个模块,quaue实现多个进程互相通信

多进程可以利用cpu的多核特性

python有??解释器,64.只能用一个核

多线程最重要的两个好处:

​ 第一:改善性能,占用更多的cpu资源,占用cpu更多的时间

​ 第二:改善用户体验,耗时的任务就可以扔到单独的线程或进程中去做

进程和线程是可以设置优先级

python中优化性能的方法:协程,微线程,单线程加异步io

#####选择数据类型:

一般的用字符串(图片,文件……),存对象用哈希表,队列或者栈用列表,去重用set,动态排位用Zset。

####端口映射

公网访问内网:在路由器上做端口映射-请求走到路由器,路由器通过端口决定将对该端口的请求映射到内网哪一台主机上

内网访问公网:NAT地址转换 - 内网地址映射为公网地址(看到的是你的路由器地址)

路由器会话:网络地址转换

python连接redis

使用的是redis-py一个开源项目,位于GitHub

####多台redis服务器,读写分离,主从操作

主从复制,主机写,从机复制

info replication:查看自己的角色

配置文件redis.conf

做为奴隶:

​ slaveof 120.77.222.217 6379:做120.77.222.217的奴隶端口是6379

​ masterauth 1qaz2wsx:master的密码

​ slaveof no one:回到master角色

如果master宕机就启动自动监控程序,哨兵(故障的自动切换)

配置文件:sentinel.conf

​ sentinel monitor mymaster 127.0.0.1 6379 2:监控master,端口,投票数量

​ sentinel auth-pass :哨兵也需要密码

​ sentinel down-after-milliseconds mymaster 30000:缓冲时间为30秒

​ sentinel failover-timeout mymaster 180000:180秒内恢复以前的master回来只能作为奴隶,180秒后就从本主从中剔除(通过修改配置文件)

最好把所有的从机和主机的密码保持一致,避免更新密码

打开防火墙端口

Redis集群
关于集群:多个节点当成一个节点来使用

避免单点故障:将单个节点做成多个节点

负载均衡服务器:配置在节点的前面,eg.轮询算法(RR),哈希码算法(Hash)(比如对5求余数),看负载看连接数(MCC) +Keepalived 双活服务(相当于热备份:如果负载均衡服务器挂了)

负载均衡可以用硬件也可以用软件做,Nginx/LVS不论用哪个都要用双活备份

######redis的集群

先要安装Ruby的编程语言环境

因为redis有一段脚本:redis-trib.rb

MongoDB概述