1. redis 及NIO原理介绍
要了解redis之前,要先知道一些常识:
基础知识
- 磁盘:数据保存在磁盘的
- 寻址:ms
- 带宽:G/M
- 内存:
- 寻址:ns2 纳秒级别
- 带宽:很大
结论:秒>毫秒>微秒>纳秒 所以磁盘比内存在寻址上慢了10W倍
I/O buffer:有个成本问题:
磁盘与磁道,扇区:一扇区 512Byte,带来一个成本变大:索引
所以磁盘都格式化为4K大小,操作系统,无论你读多少,都是最少4k从磁盘拿
随着文件变大,速度变慢,硬盘i/o成为瓶颈,所以有了数据库的出现
数据库把4k大小的页给通过索引串联了起来,因为不管一次io读多少数据(就算读1k数据),硬盘还是分成4k小的,所以数据库这个软件等于给每个4k大小的页分了一个关联id,就可以在查的时候直接把数据拿出来。
如果只是把每个数据都给一个关联id,当查找数据的时候等于还是全量索引查找,所以通过一个数据的标识唯一性熟悉来关联起来,比如通过身份证号关联到一个用户的数据。
当我们建表的时候,关系型数据库建表:必须给出schema,每个列的类型:字节宽度。存的时候:倾向于行级存储
数据和索引都是存在磁盘当中的,所以在内存中准备个b+树,如果用户想查的时候,通过b+树找到索引id,比如身份证号,把身份证号读取到磁盘里,通过身份证号就知道找的是那条数据,然后查找到数据。
比如一个面试题,数据库表很大,性能会下降?如果表有索引,增删改变慢,查询速度呢?
- 1个或少量查询依然很快,因为有b+树索引,可以快速查找到数据
- 并发大的时候会受硬盘带宽影响速度,因为查的数据多,数据都通过磁盘io读取
数据在磁盘中速度很慢,在内存中快,可以内存型数据快太贵,买不起(比如HANA数据库),所以有了折中方案,缓存的概念。(比如memcached、redis)
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)。
使用redis有什么好处
比如memcached 数据库,它也是key-value 类型数据库,也是基于缓存的,为什么后来会被redis取代地位?
memcached 的value没有类型的概念,也就说什么都可以存,使用json就可以存所有复杂的类型。
redis的value有类型概念,客户端调用对应的api,redis服务端返回想要的数据就行。
所以有个大数据方面的一个概念计算向数据移动,使用memcached时候,返回了所有数据,在客户端通过代码解析出想要的数据,redis直接返回的就是想要的数据结果。
redis安装
yum install wget
cd ~
mkdir soft
cd soft
# 也可以上传压缩包
wget http://download.redis.io/releases/redis-5.0.5.tar.gz
tar xf redis...tar.gz
cd redis-src源码目录,看README.md
make
# 执行make要先执行这两步
make distclean
yum install gcc
make
# 生成了可执行程序
cd src
cd ..
make install PREFIX=/opt/mashibing/redis5
vi /etc/profile
# 内容如下
export REDIS_HOME=/opt/mashibing/redis5
export PATH=$PATH:$REDIS_HOME/bin
# 让文件生效
source /etc/profile
cd utils
# (可以执行一次或多次)
./install_server.sh
# 执行时候脚本自己实现过程
a) 一个物理机中可以有多个redis实例(进程),通过port区分
b) 可执行程序就一份在目录,但是内存中未来的多个实例需要各自的配置文件,持久化目录等资源
c) service redis_6379 start/stop/stauts > linux /etc/init.d/****
d)脚本还会帮你启动!
ps -fe | grep redis