1、NoSQL数据模型简介
1.1、以一个电商客户、订单、订购、地址模型来对比下关系型数据库和非关系型数据库
1.1.1、传统的关系型数据库你如何设计
ER图(1:1/1:N/N:N,主外键等常见)
1.1.2、NoSQL你如何设计
1.1.2.1、什么是BSON
BSON是一种类json的一种二进制形式的存储格式,简称Binary JSON
它和JSOn一样,支持内嵌的文档对象和数组对象
1.1.2.2、可分可合 自由组装
1.1.3、两者对比,问题和难点
1.1.3.1、为什么上述的情况可以用聚合模型来处理
1.1.3.1.1、高并发的操作是不太建议有关联查询的,互联网公司用冗余数据来避免关联查询
1.1.3.1.2、分布式事务是支持不了太多的并发的
1.1.3.2、关系模型数据库你如何查?【inner join 非常麻烦】如果按照BSON 不需要join 就是一个串可以直接解析json串。
1.2、聚合模型
KV键值
Bson
列族
按列存储数据,最大的特点是方便存储结构化和半结构化数据,方便做数据压缩,对针对某一列或者某几列的查询有非常大的IO优势
图形
交际圈
2、NoSQL数据库的四大分类
kV键值:典型介绍
新浪:BerkeleyDB+redis
美团:redis+tair
阿里、百度:memcache+redis
文档型数据库(bson格式比较多):典型介绍
MongoDB
MongoDB是一个基于分布式文件存储的数据库。由C++语言编写,旨在为WEB应用提供可扩展的高性能数据存储解决方案
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
列存储数据库
Cassandra,HBase
分布式文件系统
图关系数据库
不是放图形的,放的是关系比如:朋友圈社交网络、广告推荐系统
社交网络,推荐系统等。专注于构建关系图谱
Neo4J,InfoGrid
四者对比
3、在分布式数据库中CAP原理CAP+BASE
3.1、传统的ACID分布式什么
A(Atomicity) 原子性
事务中的所有操作要么全部做完,要么都不做,事务成功的条件是事务里的所有操作都成功,只要有一个操作失败,整个事务就失败,需要回滚
C(Consistency)一致性
数据库要一致处于一致的状态,事务的运行不会改变数据库原本的一致性约束
I(Isolation)独立性
并发的事务之间不会互相影响
D(Durability)持久性
一旦事务提交后,它所做的修改会永久保存在数据库上,即使宕机也不会丢失。
3.2、CAP
C:Consistency(强一致性)
A:Availability (可用性)
P:Partition tolerance(分区容错性)
3.3、CAP的3进2
CAP力量就是说在分布式存储系统中,最多只能实现上面的两点。
而由于当前的网络硬件肯定会出现延迟丢包等问题,所以分区容错性是我们必须要实现的。
所以只能在一致性和可用性之间权衡,没有NoSQL系统能同时保证三点
C:强一致性 A:高可用性 P:分布式容错性
CA传统Oracle数据库
AP 大多数网络架构的选择
CP Redis、MongoDB
分布式架构的时候必须做出取舍
3.4、经典CAP图
CAP理论的核心是:一个 分布式系统不可能同时很好的满足一致性,可用性和分区容错性这三个需求,最多只能同时较好的满足两个。
因此,根据CAP原理将NoSQL数据库分成了满足CA原则【RDBMS【传统数据库比如Oracle】】、满足CP原则【MongoDB、HBase、Redis】、满足AP原则【CouchDB、Cassandra、DynamoDB、Riak】三大类:
CA:单点集群,满足一致性,可用性的系统,通常在可扩展上不太强大。
CP:满足一致性,分区容错性的系统,通常性能不是特别高
AP:满足可用性,分区容错性的系统,通常可能对一致性要求低一些。
3.5、BASE
BASE就是为了解决关系数据库强一致性引起的可用性降低的问题而提出的解决方案。
BASE其实是下面三个术语的缩写:
基本可用(Basically Available)
软状态(Soft state)
最终一致性(Eventually consistent)
思想是通过让系统放松对某一时刻数据一致性的要求来换取系统整体伸缩性和性能上改观【牺牲C换取AP】。由于大型系统的地域分布和极高性能的要求,不可能采用分布式事务来完成,要想完成这些要求,我们必须要采用另外一种方式,即BASE。
3.6、分布式+集群简介
3.6.1、分布式系统(distruted system)
由多态计算机和通信的软件组件通过计算机网络连接(本地网络或广域网)组成。分布式系统时建立在网络之上的软件系统。正是因为软件的特性,所以分布式系统具有高度的内聚性和透明性。因此,网络和分布式系统之间的区别更多在于高层软件(特别是操作系统),而不是硬件。分布式系统可以应用在不同的平台上如:PC、工作站、局域网和广域网上等
简单说:
分布式:不同的多台服务器上部署不同的服务模块(工程),他们之间通过RPC/Rmi之间通信和调用,对外提供服务和组内协作。
集群:不同的多台服务器上面部署相同的服务模块,通过分布式调度软件进行统一的调度,对外提供服务和访问。
4、Redis入门概述
4.1、是什么?
4.1.1、Redis: Remote Dictionary Server(远程字典服务器)
4.1.2、完全开源免费的,用C语言编写的,遵守BSD协议,是一个高性能的(key/value)分布式内存数据库,基于内存运行并支持持久化的NoSQL数据库,是当前最热门的NoSQL数据库之一,也被人们称为数据结构服务器。
4.1.3、Redis与其他key-value缓存产品有以下三个特点
Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用
Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,haash等数据结构的存储
Redis支持数据的备份,即master-slave模式的数据备份。
4.2、能干么
内存存储和持久化:redis支持异步将内存中的数据写到硬盘上,同时不影响继续服务
取最新N个数据的操作:可以将最新的10条评论的ID放在Redis 的List集合中
模拟类似HttpSession这种需要设定过期时间的功能
发布、订阅消息系统
定时器、计数器
4.3、下载
http://redis.io
http://www.redis.cn
4.4、玩
数据类型、基本操作和配置
持久化和复制 RDB/AOF
事务的控制
复制
5、Linux版安装(\与w并排 所以是windows的命令)
5.1、下载获得redis-6.0.5.tar.gz后放入Linux目录/opt 通过 mv redis-6.0.5.tar.gz /opt
5.2、/opt目录下,解压命令:tar -zxvf redis-6.0.5.tar.gz
5.3、解压完成后出现文件夹redis-6.0.5
5.4、进入目录 cd redis-6.0.5
5.5、在redis-6.0.5 执行make命令
安装gcc 能上网:yum isntall gcc-c++
gcc 是linux下一个编译程序,是c程序的编译工具
Gcc(GNU Complier Collection)是GNU(GNU's Not Unix)计划提供的编译器家族,能够支持C,C++,Objective-C,Java和ada等待程序设计语言前端,同时能够运行在x86,x86-64,Ia-64,PowerPC,SPARC和Alpha等等几乎目前所有的硬件平台上。鉴于这些特征和gCC编译代码的高效性,使得GCC成为绝大多数自由软件开发编译的首选工具。GCC影响力大,性能提升甚至有望改善所有的自由软件的运行效率,同时它的内部结构的变化也体现出现代编译器发展的新特性。
gcc -v 校验是否有了
二次make
Jemalloc/jemalloc.h没有那个文件或目录
运行 make distclear 再make
Redis Test 需要tcl 8.5
wget http://downloads.sourceforge.net/tcl/tcl8.6.1-src.tar.gz 需要vpn
sudo tar xzvf tcl8.6.1-src.tar.gz -C /usr/local/
cd /usr/local/tcl8.6.1/unix/
sudo ./configure
sudo make
sudo make install
wget在外网下
/usr: 非常重要的目录,用户很多的程序都放在这 相当于windows的Program Files
5.6、如果make完成后继续执行make install
5.7、查看默认安装目录 usr/local/bin
5.8、启动
复制一份redis.conf 到/myredis【一般不修改原有配置文件】
修改其中 General 下的 daemonize 为true
开启守护进程 默认情况下当退出redis的命令行界面或者关闭连接工具都会导致redis进程退出。开启后会在后台运行,并将进程pid写入redis.conf选项pidfile设置的文件中。
在usr/local/bin中 redis-server /myredis/redis.conf 启动redis
在ps -ef|grep redis 中此时能看到redis 的进程
5.9、helloworld
redis-cli -p 6379 进入redis进程
输入 set k1 hello
get k1 成功获取到hello
5.10、关闭
输入 shutdown
6、启动后杂项基础知识
单进程
单进程模型来处理客户端的请求,对读写等事件的响应是通过对epoll函数的包装来做到的,Redis的实际处理速度完全依靠主进程的执行效率
Epoll是Linux内核为处理大批量文件描述符而作了改进的epoll,是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率
默认16个数据库,类似数组下表从零开始,初始默认使用零号库
Select命令切换数据库
Dbsize查看当前数据库的key 的数量
Flushdb:清空当前库
Flushall:通杀全部库
统一密码管理,16个库都是同样密码,要么都行,要么一个都不行
Redis索引都是从零开始
为什么默认端口为6379
9键merz 意大利女歌手
7、redis数据类型
Redis的五大数据类型【二进制安全】
String(字符串)
最基本的类型,memcached中差不多,一个key对应一个value
String类型是二进制安全的。意思为redis的string可以包含任何数据。比如jpg图片或者序列化的对象
一个Redis中字符串value最多为512M,但是因为是放内存,最好小点。
Hash(哈希,类似java的map)
一个键值对集合。
一个String类型的field和value的映射表,特别适合用于存储对象
类似Map<String,Object>
List(列表)【双向列表】
Redis列表是简单的字符串列表,按照插入顺序排序,可以添加一个元素到列表的头部(左边)或尾部(右边),底层实际是一个链表
Set(集合)
String类型的无序集合,通过HashTable实现
Zset(sorted set:有序集合)
zset和set一样也是string类型元素的集合,且不允许重复的成员。
不同是每个元素都会关联一个double类型的分数。
redis通过分数来为集合中的成员进行从小到大的排序。zset的成员是唯一的,但分数(score)可以重复。
哪里去获得redis常见数据类型操作命令
redisdoc.com
Redis键(key)
api
keys *
exists key 的名字,判断是否存在
move key db ——》把key移到另外一个库,当前的就没了
expire key 秒钟:为给定的key设置过期时间【需要先有这个key】
ttl key 查看还有多少秒过期, -1 用不过期 ,-2 已过期 -2后keys 中没这个了,
type key 查看key是什么类型
Redis字符串(String)
单指单 value
api
set/get/del/append/strlen
incr/decr/incrby/decrby 一定要是数字才能加减
incr k1 3
getrange/setrange
getrange获取指定区间的值 类似between...and
getrange k1 0 -1
setrange设置指定区间范围内的值 setrange key值 位置值 具体值【会覆盖掉原有位置的值】
setex(set with expire)键秒值/setnx(set if not exist)
mset/mget/msetnx【多个set,msetnx要么全部成功,要么全部失败】
msetnx k1 v2 k4 v4
Redis列表(list)
单值多value
api
lpush/rpush/lrange[lpush 先进后出 压入栈中]
lpop/lpush
lpop 栈顶元素出栈
lindex,按照索引下标获得元素(从上到下) 只能拿一个
llen
lrem key 删N个value lrem list05 1 1 从栈顶删除一个1
ltrim key 开始index 结束index,截取指定范围的值后赋给key
rpoplpush 源列表 目的列表【源列表的栈底 移到目的的栈顶】
lset key index value
linsert key before/after 值1 值2
性能总结
是一个字符串链表,left、right都可以插入添加
如果键不存在,创建新的链表
如果键已存在,新增内容
如果值全移除,对应的键也就消失了
链表的操作无论是头和尾效率都极高,但假如是对中间元素进行操作,效率就低了
Redis集合(Set)
单值多value
api
sadd/smembers/sismember
sadd 自动去重
smembers set01 展示其中内容
sismember key value 是否有这个值
scard 获取集合里面的元素个数
srem key value 删除集合中指定元素
srandmember key 某个整数 (随机出几个数)
spop key 随机出栈
smove key1 key2 在key1里某个值 作用是将key1里的某个值赋给key2
数学集合列
差集:sdiff key1 key2 在第一个里面而不在第二个里面
交集:sinter
并集:sunion
Redis哈希(Hash)
KV模式不变,但V是一个键值对
hset/hget/hmset/hmget/hgetall/hdel
hset user id 1
hmset customer id 11 name zhangsan age 26
hmget customer id name age
hgetall customer
hlen
hexists key 在key里面的某个值的key
hkeys/hvals 【所有的键/所有值】
hincrby/hincrbyfloat
hsetnx
Redis有序集合Zset(sorted set)
在set基础上 加一个score值,之前set是k1 v1 v2 v3 ,现在zset是k1 score1 v1 score2 v2
zadd/zrange 【withscores】
zadd k1 10 v2 20 v2
zrangebyscore key 开始score 结束score【不能用0 -1】
withscores
(不包含
Limit作用是返回限制【分页】
limit 开始下标【从0开始】步 多少步
zrem key 某score下对应的evalue值 作用是删除元素
zcard/zcount key score区间/zrank key values值 作用是获得下标值/zscore key 对应值,获得分数
zrevrank key values值 逆序获得下标值
zrevrange
zrevrangebyscore key 【分数也要倒过来】
127.0.0.1:6379> zrevrangebyscore k2 50 10
1) "v4"
2) "v3"
3) "v2"
4) "v1"