一 Nosql
1、什么是NoSql
Nosql的意思是Not Only Sql,不仅仅是sql。
随着互联网的发展,数据类型多种多样(有文字,图片,视频,音频等等)类型的数据,而且数据量非常多,传统的数据库(关系型数据库,MySql,ORACLE,DB2,Sql Server)无法解决这些问题(数据的存储和高效读取问题),就促进了Nosql的发展。
Nosql中存储数据没有固定的格式,而传统数据库存储数据都是二维表的形式。在大数据领域中Nosql应用是非常广泛的。
总结:
Nosql出现的根源:用户多,数据多
Nosql是一个理论,是一个思想,具体的技术是:redis MogoDB Memcache(缓存数据库)等
ORM(对象关系映射,解决关系型数据库与对象关系映射之间的联系),也是一个思想,基于这个理论出现的技术:JDBC Mybatis Hibernate
2、工作中数据问题
1)高并发问题
2)海量数据的存储和高效读取
3)数据库扩展
3、传统数据库的瓶颈
1)海量数据存储之后需要读取的话,对磁盘IO要求很高,磁盘就是瓶颈
2)数据表中数据存储到达上限之后的扩展问题
3)数据库扩展时数据迁移和停机维护问题
4、数据库架构演变
01单机时代(单个数据库)----》02Memcached(缓存)+Mysql+垂直拆分(Memcached作为一个独立的分布式的缓存服务器,使用缓存技术可以减缓数据库的压力,多台web机器通过文件缓存也可以实现共享,能缓解数据库的读取压力,但不能解决数据库的写入压力)----》03Mysql主从读写分离(使用主从复制技术来达到读写分离,以提高读写性能和读库的可扩展性,解决了数据库写的压力)---》04分表分库+水平拆分+mysql集群(这时MySQL主库的写压力开始出现瓶颈,而数据量的持续猛增,这时候开始流行使用分表分库来缓解写压力和数据增长的扩展问题,MySQL还推出了MySQL Cluster集群,但性能并不是很稳定)---》05MySql的扩展瓶颈(mySQL数据库也经常存储一些大文本字段,导致数据库表非常的大,在做数据库恢复的时候就导致非常的慢,不容易快速恢复数据库。MySQL的扩展性差(需要复杂的技术来实现),大数据下IO(磁盘)压力大,表结构更改困难,正是当前使用MySQL的开发人员面临的问题)--06今天数据库架构的样子:。。。。。
1、单机时代
在90年代,一个网站的访问量一般都不大,用单个数据库完全可以轻松应付。在那个时候,更多的都是静态网页,动态交互类型的网站不多。
上述架构下,我们来看看数据存储的瓶颈是什么?
1.数据量的总大小 一个机器放不下时
2.数据的索引(B+ Tree)一个机器的内存放不下时
3.访问量(读写混合)一个实例不能承受
如果满足了上述1 or 3个,进化......
2、Memcached(缓存)+Mysql+垂直拆分
注: 垂直拆分:自己的表保存自己的数据 水平拆分:保存同一个数据,一个人保存一部分
后来随着访问量的上升,几乎大部分使用MySQL架构的网站在数据库上都开始出现了性能问题,web程序不再仅仅专注在功能上,同时也在追求性能。程序员们开始大量的使用缓存技术来缓解数据库的压力,优化数据库的结构和索引。开始比较流行的是通过文件缓存来缓解数据库压力,但是当访问量继续增大的时候,多台web机器通过文件缓存不能共享,大量的小文件缓存也带了了比较高的IO压力。在这个时候,Memcached就自然的成为一个非常时尚的技术产品。
Memcached作为一个独立的分布式的缓存服务器,为多个web服务器提供了一个共享的高性能缓存服务,在Memcached服务器上,又发展了根据hash算法来进行多台Memcached缓存服务的扩展,然后又出现了一致性hash来解决增加或减少缓存服务器导致重新hash带来的大量缓存失效的弊端
3、Mysql主从读写分离
由于数据库的写入压力增加,Memcached只能缓解数据库的读取压力。读写集中在一个数据库上让数据库不堪重负,大部分网站开始使用主从复制技术来达到读写分离,以提高读写性能和读库的可扩展性。Mysql的master-slave模式成为这个时候的网站标配了。
4、分表分库+水平拆分+mysql集群
在Memcached的高速缓存,MySQL的主从复制,读写分离的基础之上,这时MySQL主库的写压力开始出现瓶颈,而数据量的持续猛增,由于MyISAM使用表锁,在高并发下会出现严重的锁问题,大量的高并发MySQL应用开始使用InnoDB引擎代替MyISAM。
同时,开始流行使用分表分库来缓解写压力和数据增长的扩展问题。这个时候,分表分库成了一个热门技术,是面试的热门问题也是业界讨论的热门技术问题。也就在这个时候,MySQL推出了还不太稳定的表分区,这也给技术实力一般的公司带来了希望。虽然MySQL推出了MySQL Cluster集群,但性能也不能很好满足互联网的要求,只是在高可靠性上提供了非常大的保证
5、MySql的扩展瓶颈
MySQL数据库也经常存储一些大文本字段,导致数据库表非常的大,在做数据库恢复的时候就导致非常的慢,不容易快速恢复数据库。比如1000万4KB大小的文本就接近40GB的大小,如果能把这些数据从MySQL省去,MySQL将变得非常的小。关系数据库很强大,但是它并不能很好的应付所有的应用场景。MySQL的扩展性差(需要复杂的技术来实现),大数据下IO压力大,表结构更改困难,正是当前使用MySQL的开发人员面临的问题。
6、今天什么样子
4、CDN
因为我们系统的和用户在天南海北都有,由于网络的原因,都集中访问一个服务器的话由于地域的区别导致有部分用户响应速度比较慢,我们可以使用CDN解决这种延迟问题,CDN服务器可以自动找到离用户最近的应用服务器,将请求发送到该服务器上提高用户的响应速度。
二 Redis
1、Redis概述
是一个非关系型数据库(思想是:NoSql),存储的数据都是以key-value存放的。可以用作数据存储,缓存,消息中间件(消息队列),支持五种数据类型: 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets,也叫zsets)。
2、redis的特点
1)Redis支持数据的持久化,可以将内存中的数据保持在磁盘中(落盘),重启的时候可以再次加载进行使用.
2)Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储.
3)Redis支持数据的备份,即master-slave(主从)模式的数据备份.
3、nosql数据库的分类
4、Redis的安装
1、环境要求
Redis可以安装在Windows或者Linux上,我们在企业中都是使用在Linux上,我们上课就在Linux上操作,Windows操作大家可以自家看一下。
2、redis的下载
下载链接:http://www.redis.cn/download.html
3、redix在Linux上的安装(可以去redix官网查看安装步骤 及 redix常用的命令)
1)创建redis目录
2)上传并解压
3)运行make命令安装
4、启动regix
注:启动命令在src下。先启动服务器端,然后启动客户端
- 启动服务端
Redis默认端口号6379
命令:./redis-server
2.启动客户端操作
新开一个窗口启动
三 redis的数据类型
1 string
String是Redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value,String类型是二进制安全的。意味着Redis的string可以包含任何数据。比如jpg图片或者序列化的对象。
String类型是Redis最基本的数据类型,一个Redis中字符串value最多可以是512M。
2 list
单键多值(有序的)
Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)
它的底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差。
3 set
Redis set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。
Redis的Set是string类型的无序集合。它底层其实是一个value为null的hash表,所以添加,删除,查找的复杂度都是O(1)。
4 hash
Redis hash 是一个键值对集合。
Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。类似Java里面的Map<String,Object>
5 zset(sorted sets)
Redis有序集合zset与普通集合 set(无序集合) 非常相似,是一个没有重复元素的字符串集合。
不同之处是有序集合的每个成员都关联了一个评分(score) ,这个评分(score)被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的,但是评分可以是重复了 。
因为元素是有序的, 所以你也可以很快的根据评分(score)或者次序(position)来获取一个范围的元素。访问有序集合的中间元素也是非常快的,因此你能够使用有序集合作为一个没有重复成员的智能列表。