常识
在计算机当中,数据是在磁盘中还是内存中,涉及到两方面。
- 数据在磁盘:
- 寻址:查找数据的地址时间,它是毫秒级别的。
- 带宽:单位时间有多少个字节流过去。一般是G或者M的级别。
- 数据在内存:
- 寻址:纳秒级别的。‘’
- 带宽:远远超过磁盘,好像是每秒几十个G
I/O buffer :
磁盘有磁道和扇区,一个扇区是512byte,如果我们访问一个硬盘都是以最小力度一个扇区512byte来查找数据,同样引发一个问题,如果一个区域足够小,那么索引就会变大(表示很大一个数的区间,可能就不是四个字节,甚至可能需要8个字节或者16个字节才能索引住这么多的512byte),所以在我们格式化磁盘的时候,就会有一个4K对齐,也就是真正使用硬件的时候,并不是以512byte来做一次读写量,就是说读取数据量哪怕是1byte,硬盘也会返回4K,这样索引就会变小。
关系型数据库建表:
- 必须给出schema
- 类型:建表宽度
存:倾向于行级存储,内存维护一个b+树,
磁盘:存储数据和索引
总结:
数据库合理的利用了各自内存寻址快和磁盘存储的能力,并且在磁盘是分而治之的存储,所以获取数据的速度及其快,最终目的是减少IO的流量,不让磁盘发生大量的IO。
问题:如果数据库的表很大,性能会降低吗?
- 如果表有索引,增删改变慢。
因为修改表都需要找索引页,总是需要调整索引的位置(维护索引)。 - 有索引查询的话一个或少量的查询,依然会很快。
查询会先走B+Tree找到数据所在区间,根据所在区间找到对应索引映射的数据。(局部I/O)。 - 并发大的时候会受硬盘带宽影响速度。如果是并发状态下,大量的请求进入数据库来请求数据,一个人4K,10个人,100个人?数据吞吐就会增大,会影响查询的速度。
折中做法
将内存中的一部分数据做缓存
关于缓存的技术有很多,比如memcached、Redis …
memcached
key value结构,value没有类型的概念
对比总结:
计算向数据移动获得优势
1、Memcached:如果很多人都这么获取的话,网卡IO就会成为最大的瓶颈,Client端要有你实现的代码去解码计算。
2、Redis:因为有类型,但是类型有不是太重要的,重要的是Redis服务器对每种类型都有自己的方法index(),lpop(),Client端的代码也会比较轻盈。
redis(秒级十万操作)
同为key value结构,value有类型,string(字符,数值,bitmaps),hashes,lists,sets,sorted sets
reidis安装
redis官网介绍:
Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。
.
它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。
.
Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。
安装步骤
- 安装环境
操作系统:CentOS 7.x
Redis版本:Redis5.x
下载地址:http://download.redis.io/releases/redis-5.0.5.tar.gz
make:在linux中属于编译命令,跟随文件makefile,但是这个命令需要config执行之后才会生成
[root@z8524210 /]# mkdir soft //建立一个soft目录,用来安装Redis
[root@z8524210 /]# cd soft/ //进入到目录并且下载Redis,这里我已经下载好了
[root@z8524210 soft]# tar xf redis-5.0.4.tar.gz //解压
[root@z8524210 redis-5.0.4]# yum install gcc //安装C语言编译器
[root@z8524210 redis-5.0.4]# make //执行make
[root@z8524210 redis-5.0.4]# make install PREFIX=/opt/zxj/redis5 //迁移出执行文件到指定目录
[root@z8524210 bin]# vi /etc/profile //配置环境变量
[root@z8524210 bin]# source /etc/profile //重新加载配置文件
[root@z8524210 bin]# cd /soft/redis-5.0.4/utils/ //进入到/soft/redis-5.0.4/utils/ 目录
[root@z8524210 utils]# ./install_server.sh //执行这个脚本,生成服务
[root@z8524210 init.d]# ps -fd | grep redis //查看启动的redis进程
[root@z8524210 utils]# service redis_6379 stop //停止服务
[root@z8524210 utils]# service redis_6379 start //开启服务
[root@z8524210 utils]# service redis_6379 status //查看服务状态