文章目录
- 一、NOSQL概述
- 1.1 单机Mysql的演进
- 1.2 什么是Nosql
- 1.3 Nosql的四大分类
- 1.3.1 KV键值对型
- 1.3.2 文档型数据库(bson格式,和json一样)
- 1.3.3 列存储数据库
- 1.3.4 图数据库
- 二、redis安装与配置
- 2.1 redis概述
- 2.2 Windows安装
- 2.2.1 安装至windows服务
- 2.3 Linux安装(源码安装)
- 2.3.1 配置本地yum源
- 2.3.2 安装gcc环境
- 2.3.2.1 更新gcc版本
- 2.3.3 下载安装包
- 2.3.4 解压编译
- 2.3.5 编译安装
- 2.3.6 启动服务
- 2.3.7 查看进程
- 2.3.8 停止服务
- 2.3.9 配置环境变量
- 2.4 redis.conf配置文件
- 2.4.1 内存
- 2.4.2 设置密码
- 2.4.3 后台运行
- 2.4.4 远程访问
- 三、性能测试工具redis-benchmark
- 3.1 示例
- 四、redis常识
- 4.1 为什么默认端口是6379?
- 4.2 为什么redis是单线程还这么快?
- 4.3 redis为什么是单线程?
一、NOSQL概述
1.1 单机Mysql的演进
单机MYSQL的时代!
在90年代,一个基本的网站访问量一般不会太大,单个数据库完全足够用。在那个时候,更多的是去使用静态网页Html,比如我们熟知的导航网站“Hao123”,此类网站对服务器来说没有太大的压力,读和写的操作都在单台机器上。但好景不长,出现很多瓶颈。
- 数据量太大,一个机器放不下。
- 数据的索引太多,一个机器的内存也放不下。
- 访问量太大(读写混合),一个服务器也承受不了。
出现以上问题时,先是优化数据结构和索引,再到用文件缓存,最终发现还是解决不了根本问题,后面就出现了了Memcached,成为当时最热门的技术,自此正式进入缓存时代。
Memcached(缓存)+mysql+垂直拆分(读写分离)
缓存的出现使用很好的解决了大量用户的“读”操作,当一个库一张表数据过多时,就开始采用集群,MySQL水平拆分。
Memached(缓存)+水平拆分+mysql集群
从早些年的MyISAM(表锁)转战到Innodb(行锁),这种更换引擎也只是属于“物理治疗”,再后来就开始使用分库分表来解决写的压力,这就属于“精神治疗”。mysql集群的出现很好的解决了大量“写”操作。但是像抖音热榜、热搜排名这种需要快速刷新的大数据量时,MySQL这种关系型数据库就不够用了,用mysql保存一些大文件和图片时,效率也比较低,所以这时候就需要用Nosql非关系型数据库来解决了。
1.2 什么是Nosql
- NoSQL(Not Only SQL),翻译过来为“不仅仅是SQL”,是对所有非关系型数据库的一种统称。除去关系型数据库之外的都是非关系型数据库。
- NoSQL数据库种类繁多,包括文档型数据库、键值存储数据库、宽列存储数据库和图形数据库,常见的有MongoDB、Redis、Hbase、Neo4j等,共同的特点都是去掉关系数据库的关系型特性。
- 数据之间无关联,易扩展,无形之间也在架构的层面上带来了可扩展的能力。
- 大数据量下的NoSQL数据库具有非常高的读写性能,这正是得益于它的无关系性,数据库的结构简单。
1.3 Nosql的四大分类
1.3.1 KV键值对型
- 新浪:redis
- 美团:redis+Tair
- 阿里、百度:redis+memcached
1.3.2 文档型数据库(bson格式,和json一样)
- MongoDB:是一个基于分布式文件存储的数据库,C++编写,主要用来处理大量的文档。是介于关系型数据库和非关系型数据库中间的产品,同时也是非关系型数据库中功能最丰富,最像关系型数据库的。
- ConthDB等等
1.3.3 列存储数据库
- HBase
- 分布式文件系统
1.3.4 图数据库
- Neo4j、InfoGrid:不是存图形,而是存放关系,比如:朋友圈的社交网络关系,广告推荐等。
二、redis安装与配置
2.1 redis概述
- Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
- redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了 master-slave(主从)同步。
- 免费、开源,是当下最热门的NoSQL技术之一,也被人们称之为结构化数据库。
redis作用
- 内存存储、持久化,内存中是断电即失,所以说持久化很重要(rdb、aof)。
- 效率高,可以用于告诉缓存。
- 发布订阅系统,可以做消息中间件使用。
- 地图信息分析。
- 计时器、计数器(比如博客浏览量。)
…
redis特性
- 多样的数据类型
- 持久化
- 集群
- 事务
…
2.2 Windows安装
1、下载安装包:redis_Windows版本下载地址
Redis 官方不建议在 windows 下使用 Redis,所以官网没有 windows 版本可以下载。还好微软团队维护了开源的 windows 版本,虽然只有 3.2 版本,对于普通测试使用足够了。
2、解压。将下载的离线包解压至自己的电脑上,我这里是统一放在D盘。
redis.conf配置文件介绍
3、启动服务端
4、启动客户端,连接redis服务,注意不要关闭客户端窗口。
2.2.1 安装至windows服务
1、cmd窗口进入redis服务启动程序程序当前目录,执行安装启动命令。
- 安装默认服务未启动。
- 启动
- 停止
- 卸载
2.3 Linux安装(源码安装)
- 这里以Centos7.5系统为例。
2.3.1 配置本地yum源
1、上传CentOS镜像到/opt/下任意目录。
2、创建挂载镜像
[root@localhost centos]# mkdir centos7
3、挂载镜像
[root@localhost centos]# mount /opt/backup/centos/CentOS-7-x86_64-DVD-1804.iso /opt/backup/centos/centos7 -o loop
mount: /dev/loop0 is write-protected, mounting read-only
[root@localhost centos]# df -h
Filesystem Size Used Avail Use% Mounted on
......
......
/dev/loop0 4.2G 4.2G 0 100% /opt/backup/centos/centos7
4、配置本地yum源
root@localhost yum.repos.d]# pwd
/etc/yum.repos.d
[root@localhost yum.repos.d]# cat ma.repo
[Centos7]
name=centos7 backup
baseurl=file:///opt/backup/centos/centos7
enabled=1
gpgcheck=0
5、更新缓存
[root@localhost centos]# yum clean all
[root@localhost centos]# yum makecache
6、测试
[root@localhost centos]# yum install fuse
2.3.2 安装gcc环境
- 由于 Redis 由 ANSIC 编写,安装 Redis 前需要先安装 C 语言环境。
- 高版本的redis依赖的高版本gcc,需要更新gcc。
[root@localhost ~]# yum install gcc-c++
2.3.2.1 更新gcc版本
1、配置网络yum源
阿里云镜像地址
[root@localhost yum.repos.d]# pwd
/etc/yum.repos.d
[root@localhost yum.repos.d]# wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
[root@localhost yum.repos.d]# sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo [root@localhost yum.repos.d]# yum clean all
[root@localhost yum.repos.d]# yum makecache
2、更新gcc版本
[root@localhost yum.repos.d]# sudo yum install centos-release-scl
[root@localhost yum.repos.d]# sudo yum install devtoolset-9-gcc* #这里是更新到9版本,更新8版本换成8.
[root@localhost yum.repos.d]# scl enable devtoolset-9 bash
[root@localhost yum.repos.d]# gcc --version
2.3.3 下载安装包
redis中文网
redis官网
2.3.4 解压编译
一般都会将 redis 目录放置到 /usr/local/redis这里将目前在 /home/sail 目录下的 redis-6.2.6 文件夹更改目录,同时更改文件夹名称为 redis。
[root@localhost opt]# tar zxf redis-6.0.6.tar.gz
[root@localhost opt]# mv redis-6.0.6 /usr/local/redis
[root@localhost opt]# cd /usr/local/redis/
[root@localhost redis]# make
2.3.5 编译安装
PREFIX参数指定程序编译时存放路径。
比如我们现在就是指定了 redis 必须存放在 /usr/local/redis 目录。
假设不添加该关键字 Linux 会将可执行文件存放在 /usr/local/bin 目录。
这里指定好目录也方便后续的卸载,后续直接 rm -rf /usr/local/redis 即可删除 redis。
[root@localhost redis]# make PREFIX=/usr/local/redis install
2.3.6 启动服务
启动方式有两种:命令带&,和修改配置文件后不带&。
1、第一种。
[root@localhost redis]# pwd
/usr/local/redis
[root@localhost redis]# ./bin/redis-server& ./redis.conf
2、第二种。
修改redis.conf配置文件里的 daemonize no 改为 daemonize yes 即可。
[root@localhost redis]# pwd
/usr/local/redis
[root@localhost redis]# ./bin/redis-server ./redis.conf
2.3.7 查看进程
[root@localhost redis]# ps -ef|grep redis
root 19268 1 0 12:25 ? 00:00:00 bin/redis-server 127.0.0.1:6379
root 19297 9320 0 12:25 pts/0 00:00:00 grep --color=auto redis
2.3.8 停止服务
[root@localhost redis]# pwd
/usr/local/redis
[root@localhost redis]# bin/redis-cli shutdown
[root@localhost redis]# ps -ef|grep redis
root 18768 9320 0 12:20 pts/0 00:00:00 grep --color=auto redis
2.3.9 配置环境变量
从以上操作来看,对redis的任何操作,都需要在/usr/local/redis/bin目录下操作,也就是我们所安装的指定目录。倘若需要跟其他服务公用,就不太方便,所以哦我们需要配置环境变量,这样不管我们在哪个目录下,都可以操作。
- 添加变量文件
[root@localhost profile.d]# pwd
/etc/profile.d
[root@localhost profile.d]# cat redis.sh
export JAVA_HOME=/usr/local/redis
export PATH=$JAVA_HOME/bin:/usr/bin:$PATH
2、重新读取
[root@localhost profile.d]# source redis.sh
3、测试启动程序
[root@localhost redis]# pwd
/opt/redis
[root@localhost redis]# redis-server redis.conf #指定配置文件后台启动,不指定就是前台启动。
10262:C 29 Nov 2022 17:11:02.053 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
10262:C 29 Nov 2022 17:11:02.053 # Redis version=6.0.6, bits=64, commit=00000000, modified=0, pid=10262, just started
10262:C 29 Nov 2022 17:11:02.053 # Configuration loaded
[root@localhost redis]# ps -ef|grep redis
root 10263 1 0 17:11 ? 00:00:00 redis-server 127.0.0.1:6379
root 10269 3342 0 17:11 pts/1 00:00:00 grep --color=auto redis
4、测试停止程序
[root@localhost redis]# ps -ef|grep redis #存在redis进程。
root 10263 1 0 17:11 ? 00:00:00 redis-server 127.0.0.1:6379
root 10269 3342 0 17:11 pts/1 00:00:00 grep --color=auto redis
[root@localhost redis]# redis-cli shutdown #关闭程序
[root@localhost redis]# ps -ef|grep redis
root 11168 3342 0 17:14 pts/1 00:00:00 grep --color=auto redis #进程消失。
2.4 redis.conf配置文件
配置项名称 | 配置项值范围 | 说明 |
---|---|---|
daemonize | yes、no | yes表示启用守护进程,默认是no即不以守护进程方式运行。其中Windows系统下不支持启用守护进程方式运行 |
port | 指定 Redis 监听端口,默认端口为 6379 | |
bind | 绑定的主机地址,如果需要设置远程访问则直接将这个属性备注下或者改为bind * 即可,这个属性和下面的protected-mode控制了是否可以远程访问 。 | |
protected-mode | yes 、no | 保护模式,该模式控制外部网是否可以连接redis服务,默认是yes,所以默认我们外网是无法访问的,如需外网连接rendis服务则需要将此属性改为no。 |
timeout | 300 | 当客户端闲置多长时间后关闭连接,如果指定为 0,表示关闭该功能 |
loglevel | debug(调试日志)、verbose(在debug的基础上,减少连接信息以及内部信息)、notice(建议在生产使用)、warning(只打印重要、关键的信息) | 日志级别,默认为 notice |
databases | 16 | 设置数据库的数量,默认的数据库是0。整个通过客户端工具可以看得到 |
rdbcompression | yes、no | 指定存储至本地数据库时是否压缩数据,默认为 yes,Redis 采用 LZF 压缩,如果为了节省 CPU 时间,可以关闭该选项,但会导致数据库文件变的巨大。 |
dbfilename | dump.rdb | 指定本地数据库文件名,默认值为 dump.rdb |
dir | 指定本地数据库存放目录 | |
requirepass | 设置 Redis 连接密码,如果配置了连接密码,客户端在连接 Redis 时需要通过 AUTH 命令提供密码,默认关闭 | |
maxclients | 0 | 设置同一时间最大客户端连接数,默认无限制,Redis 可以同时打开的客户端连接数为 Redis 进程可以打开的最大文件描述符数,如果设置 maxclients 0,表示不作限制。当客户端连接数到达限制时,Redis 会关闭新的连接并向客户端返回 max number of clients reached 错误信息。 |
maxmemory | XXX < bytes > | 指定 Redis 最大内存限制,Redis 在启动时会把数据加载到内存中,达到最大内存后,Redis 会先尝试清除已到期或即将到期的 Key,当此方法处理 后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis 新的 vm 机制,会把 Key 存放内存,Value 会存放在 swap 区。配置项值范围列里XXX为数值。 |
2.4.1 内存
- 项目中需要视情况设置redis最大内存,该参数默认是注释状态。
- 注意单位是字节。
2.4.2 设置密码
- 项目中,必须要设置redis密码,现网络完全形式严峻,做一名合格的“运维战将”。
- 密码不能设置太简单,要有一定的安全性。
- 不输入密码连接失败
- 输入密码才能登录成功
2.4.3 后台运行
- daemonize no (默认),代表redis只是一个守护进行,关闭启动的对话框,就直接停止运行了。
- 把yes改为no,redis就能在后台自动运行了,不受对话框是否关闭的影响
2.4.4 远程访问
- bind 127.0.0.1为默认只能本机连接,也就是只能在redis所在的虚拟机上用redis-cli来连接,无法通过外部工具远程连接。
- 注释该行,或者bind * 就可以开启远程访问。
- bind * 和bind 0.0.0.0 一样,0.0.0.0 实际等效于通配符 *,代表任意地址。
三、性能测试工具redis-benchmark
3.1 示例
测试200个并发连接数,100000个请求。
- 测试命令
[root@localhost redis]# redis-benchmark -a wuhan@123 -p 6379 -c 200 -n 100000
- 测试结果
- 结果分析
四、redis常识
4.1 为什么默认端口是6379?
- 6379在是手机按键(9键)上MERZ对应的号码,而MERZ取自意大利歌女Alessia Merz的名字。Redis 作者 Antirez 早年看电视节目,觉得 Merz 在节目中的一些话愚蠢可笑,Antirez 喜欢造“梗”用于平时和朋友们交流,于是造了一个词 “MERZ”,形容愚蠢,与 “stupid” 含义相同。
- 到了给 Redis 选择一个数字作为默认端口号时,Antirez 没有多想,把 “MERZ” 在手机9键上对应的数字 6379 拿来用了。
4.2 为什么redis是单线程还这么快?
- redis是完全基于内存来的,绝大部分请求时存粹的内存操作,非常快速。
- 数据结构简单,所以对数据的操作也就非常简单了,redis中的数据结构是专门进行设计过的。
- 采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或多线程导致的切换从而消耗CPU,也不用去考虑各种锁的问题,更不存在加锁释放锁的操作,也没有因为可能出现死锁而导致的性能消耗问题。
- 使用多路I/O复用模型,可以处理并发的连接。
- 使用底层模型不同,他们之间底层实现方式以及与客户端之间通信的应用协议不一样,redis自己构建的VM机制,因为一般的系统调用系统函数会浪费一定的时间去移动和请求。
上下文切换:多线程再轮流执行会抢占cpu资源,而redis单线程就避免了繁琐的多线程的上下文切换。
多路复用:
多路,指多个网络连接。
复用,指复用一个线程。
多路复用主要有三种技术,select、poll、eploll。三种技术时从前往后依次出现的,后者交于前者更正其缺点,epoll也成为最新的也是目前最好的多路复用技术。
怎么理解?先打个比方。一个高级自助餐厅服务员要服务多桌客人,epoll方式就相当于1号桌的客人要添加菜品,服务员就会去给他服务,当没有客人有需求时可以在旁边等待玩玩手机。而select和poll技术就相当于这个服务员轮流问1号桌、2号桌、3号桌…客人需不需要服务,完全没有空闲时间可以玩手机,全程服务。在这里I/O多路复用的意思就是多桌客人公用一个服务员。
- I/O多路复用模型:就是利用select、poll、epoll可以同时检查多个流的I/O事件的能力。在空闲的时候,会把当前线程阻塞掉,当有一个或多个流有I/O事件时,就从阻塞状态中唤醒,此时程序就会轮询一遍所有的流,而epoll是值轮询那些真正发出了事件的流,并且只依次顺序的处理就绪的流,避免了大量的无用操作,高效率就是epoll的特别之处。
4.3 redis为什么是单线程?
官方表示,redis是基于内存干活的,CPU不是redis的性能瓶颈,影响redis性能的是服务器的内存和网络带宽。既然可以用单线程来实现,就不需要去靠考虑多线程,所以就使用单线程了。