一、前置知识
(一)常识
- 磁盘
- 寻址:ms
- 带宽:G/M
- I/O buffer:成本问题
- 磁盘有磁道和扇区,一扇区 512Byte 带来一个成本变大–索引
- 4K:操作系统,无论你读多少,都是最少4K从磁盘取
- 随着文件变大,磁盘I/O会成为瓶颈,导致速度变慢
- 内存
- 寻址:ms
- 带宽:很大
补充:
- 秒>毫秒>微秒>纳秒 磁盘比内存在寻址上慢了10W倍
- 数据在磁盘和内存中,体积不一样(2G在内存可能1.9G)
(二)关系型数据库
如上图所示:
-
1页:等同于操作系统读取大小,避免浪费(data page 4k)
-
索引:等同于1页(data page 4k)
注意: 数据和索引都是存储在硬盘,查询时会在内存中准备一个B+Tree
特点:
-
关系型数据库建表时,必须给出schema(架构)
之所给出schema是因为,这样当插入的时候,如果这行数据有列为null值,会进行占位,当更改数据时,直接在这一列中进行插入即可,避免了空间上的转换
-
类型:字节宽度
-
存:倾向于行级存储
-
问题引入:
数据库表很大,性能下降?->表中加索引->增删改变慢->查询速度怎么样?
- 1个或少量查询依然很快
- 并发大的时候会受磁盘带宽影响速度
所以诞生了内存级别的关系型数据库SAP,HANA,但是如果数据库宕机了那么数据不能保证安全.
最后综合上述,进行折中缓存,从而出现了memcached,redis这样的数据库
注意:
该数据库都依赖于两个基础设施,分别为:
- 冯诺依曼体系的硬件
- 以太网,tcp/ip网络
扩展:
- 数据库引擎学习:https://db-engines.com/en/
- redis中文翻译手册:http://redis.cn/
二、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是value有类型的时候,我们应该想到:
设想如果没有redis之前,value没有类型的概念,那么应该用什么来表示复杂的数据类型呢?
使用json来表示,如下图所示.
如果客户端想要从缓存中取出value值
- memchahce ->返回的所有数据到client需要走网卡IO,且client需要实现代码来解码
- redis->对客户端来说类型不重要,redis的server对每种类型有自己的方法,用户只需直接调用方法,这样会轻盈很多,本质是解耦(也就是计算向数据移动)
计算向数据移动 https://www.cnblogs.com/blog-of-zxf/p/10827941.html
(二)安装实操
安装环境
- centos 6.x
- redis 官网5.x http://download.redis.io/releases/redis-5.0.5.tar.gz
1. yum install wget
2. cd
3. mkdir soft
4. cd soft
5. wget http://download.redis.io/releases/redis-5.0.5.tar.gz
6. tar xf redis...tar.gz
7. cd redis-src
8. 看README.md(重点,通过它可以自主学习,各种步骤都里面)
9. make
....yum install gcc
.... make distclean
10. make
11. cd src
....生成了可执行程序
12. cd ..
13. make install PREFIX=/opt/mashibing/redis5(将执行脚本安装到指定路径)
14. vi /etc/profile(配置Redis全局环境)
... export REDIS_HOME=/opt/mashibing/redis5
... export PATH=$PATH:$REDIS_HOME/bin
... source /etc/profile
15. cd utils
16. /install_server.sh (可以执行一次或多次)
从安装的过程我们可以得到如下结论:
a) 一个物理机中可以有多个redis实例(进程),通过port区分
b) 可执行程序就一份在目录,但是内存中未来的多个实例需要各自的配置文件,持久化目录等资源
c) 执行该命令之后会在linux的目录 > /etc/init.d/**** 下放了一个脚本 redis_6379
启动刚才设置的redis服务:service redis_6379 start/stop/status
d) 脚本还会帮你启动!
17. ps -fe | grep redis
总结:
1.下载wget下载工具
2.添加要安装的文件夹
3.通过wget在线下载对应的gz包
4.解压gz包到对应的文件夹
5.在解压的包中的src中查看README.md(重点:通过README.md文件知道后面的安装步骤)
6.执行make命令
如果报错提示差gcc环境,则下载gcc环境,并清理原先make的数据 make distclean
7.重新执行make命令
8.将执行脚本安装到指定路径
9.配置redis全局变量
10.安装redis服务端(生成在/etc/init.d/中设置的对应脚本,安装完后会自动启动)
11.通过service redis_6379 start/stop/status(启动,终止,查看状态)
12.通过 ps -fe | grep redis 查看redis进程