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