一、为啥要使用NoSQL
在90年代,一个网站的访问量一般不大,使用单个的数据库完全可以轻松应对,在那个时候,更多的是静态网页,动态交互的网站其实不多。
1.单机sql
上述架构下,我们来看一下数据存储的瓶颈是什么;
- 数据量的总大小,一个机器放不下时
- 数据的索引,一个机器的内存放不下时
- 访问量,一个实例不能承受
2.memcache+mysql+垂直分布
后来,随着访问量的上升,几乎大部分使用MySQL架构的网站在数据库上都开始出现了性能问题,web 程序不再仅仅专注在功能上,同时也在追求性能。程序猿们开始大量使用缓存技术来缓解数据库的压 力,优化数据库的结构和索引,开始比较流行的是通过文件缓存来缓解数据库压力,但是当访问量继续 增大的时候,多台web机器通过文件缓存不能共享,大量的小文件缓存也带了比较高的IO压力,在这个 时候,Memcached就自然的成为一个非常时尚的技术产品。
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的开发人员面临的问题。
二、Redis入门
一、Redis为什么这么快?
1)以前一直有个误区,以为:高性能服务器 一定是多线程来实现的 原因很简单因为误区二导致的:多线程 一定比 单线程 效率高,其实不然! 在说这个事前希望大家都能对 CPU 、 内存 、 硬盘的速度都有了解了!
2)redis 核心就是 如果我的数据全都在内存里,我单线程的去操作 就是效率最高的,为什么呢,因为 多线程的本质就是 CPU 模拟出来多个线程的情况,这种模拟出来的情况就有一个代价,就是上下文的切 换,对于一个内存的系统来说,它没有上下文的切换就是效率最高的。redis 用 单个CPU 绑定一块内存 的数据,然后针对这块内存的数据进行多次读写的时候,都是在一个CPU上完成的,所以它是单线程处 理这个事。在内存的情况下,这个方案就是最佳方案。 因为一次CPU上下文的切换大概在 1500ns 左右。从内存中读取 1MB 的连续数据,耗时大约为 250us, 假设1MB的数据由多个线程读取了1000次,那么就有1000次时间上下文的切换,那么就有1500ns * 1000 = 1500us ,我单线程的读完1MB数据才250us ,你光时间上下文的切换就用了1500us了,我还不 算你每次读一点数据 的时间。
二、redis的key
一、一些基本的命令:
性能测试:
1 | $ redis-benchmark -n 10000 -q |
| 1 | -h | 指定服务器主机名 | 127.0.0.1 |
| 2 | -p | 指定服务器端口 | 6379 |
| 3 | -s | 指定服务器 socket | |
| 4 | -c | 指定并发连接数 | 50 |
| 5 | -n | 指定请求数 | 10000 |
| 6 | -d | 以字节的形式指定 SET/GET 值的数据大小 | 2 |
| 7 | -k | 1=keep alive 0=reconnect | 1 |
| 8 | -r | SET/GET/INCR 使用随机 key, SADD 使用随机值 | |
| 9 | -P | 通过管道传输 |
1 |
| 10 | -q | 强制退出 redis。仅显示 query/sec 值 | |
| 11 | –csv | 以 CSV 格式输出 | |
| 12 | -l | 生成循环,永久执行测试 | |
| 13 | -t | 仅运行以逗号分隔的测试命令列表。 | |
| 14 | -I | Idle 模式。仅打开 N 个 idle 连接并等待。 |
二、一些基本的命令
- set;设置数据,键值对
- get [key] 获得对应的数据key-value
- select [num] 选择数据库
- flushdb清除当前的数据库
- flushall 消除全部数据
- dbsize获得数据库的大小
- Linux使用redis的步骤:1. redis-server redis.conf:启动服务2.redis-cli 启动客户端
- EXISTS [key] 查询某一个键是否存在
- move [key] [数据库] 移除当前数据库的字段到另一个数据里面
- **expire [key] [seconds] 设置字段的过期时间 **
- ttl[key] 获得距离过期的时间
- del [key] 删除key
- type [key ] 查看数据的类型



