文章目录
一、Redis概述
1.为什么使用NoSql
-
问题:随着用户数的增长,Tomcat和数据库之间竞争资源,单机性能不足以支撑业务。
解决思路:Tomcat和数据库分别独占服务器资源,显著提高俩者各自的性能。即分开部署。 -
新问题:随着用户数的增长,并发读写数据库成为瓶颈。
解决思路:通过缓存能把绝大多数请求在读写数据库前拦截掉,大大降低数据库压力。其中涉及的技术包括:使用memcached作为本地缓存,使用Redis作为分布式缓存。即引入本地缓存和分布式缓存。 -
缓存挡住大部分访问请求,随着用户数的增长,并发压力主要落到单机Tomcat上,响应逐渐变慢。
解决思路:在多台服务器上分别部署Tomcat,使用反向代理软件nginx把请求平均分发到每个Tomcat中。即引入反向代理实现负载均衡。 -
反向代理使应用服务器可支持的并发量大大增加,但并发量的增长也意味着更多的请求穿透到数据库,单机数据库最终成为瓶颈。
解决思路:由于数据库的写入压力增加,Memcached只能缓解数据库的读取压力。读写集中在一个数据库上让数据库不堪重负,大部分网站开始使用主从复制技术来达到读写分离,以提高读写性能和读库的可扩展性。Mysql的master-slave模式成为这个时候的网站标配了。即数据库读写分离。 -
业务逐渐变多,不同业务之间的访问量差距较大,不同业务直接竞争数据库,相互影响性能。
解决思路:把不同业务的数据保存到不同的数据库中,使业务之间的资源竞争降低,对于访问量大的业务,可以部署更多的数据库服务器来支撑。即数据库按业务分库。
2.NoSql,即非关系型数据库
- 结构化数据和非结构化数据
结构化数据指的是由二维表结构来表达逻辑和实现的数据,严格遵循数据格式与长度规范,也称作行数据。
非结构化数据,指的是数据结构不规则或不完整,没有任何预定义的数据模型,不方便用二维逻辑表来表示的数据,例如办公文档(word)、文本、图片、HTML、各类报表、视频音频等。
NoSQL的四大分类:
-
KV型NoSql(Redis):
KV型顾名思义就是以键值对的形式存储的非关系型数据库。
特点:1.数据基于内存,读写效率高。 2.KV型数据,时间复杂度为O(1),查询速度快。
KV型NoSql最大的特点就是高性能,利用Redis自带的BenchMark做基准测试,TPS可达到10W级别,性能非常强劲。
TPS,即每秒事务处理量,就是每秒可以处理的并发量
QPS,即每秒查询率
-
列式NoSql(HBase)
列式NoSql,大数据时代最具代表性的技术之一了,以HBase为代表。
列式数据库:查询时只有指定的列会被读取,不会读取所有列;列数据被组织到一起,一次磁盘IO可以将一列数据一次性读取到内存中。 -
文档型NoSql(MongoDB)
文档型NoSql指的是将半结构化数据存储为文档的一种NoSql,文档型NoSql通常以JSON或者XML的格式存储数据。
关系型数据库是按部就班的每个字段一列存,在MangoDB中就是一个JSON字符串存储。 -
搜索型NoSql(ElasticSearch)
传统关系型数据库主要通过索引来达到快速查询的目的,但是在全文搜索的场景下,索引是无能为力的,like查询一来无法满足所有模糊匹配需求,二来使用限制太大且使用不当容易造成慢查询,搜索型NoSql的诞生正是为了解决关系型数据库全文搜索能力较弱的问题。
3.关系型数据库和非关系型数据库
-
关系型数据库:
关系型数据库最典型的数据结构是表,由二维表及其之间的联系组成的一个数据组织。
优点:1.易于维护:都是使用表结构,格式一致。 2.使用方便:SQL语言通用,可用于复杂查询。 3.复杂操作:支持SQL,可用于一个表以及多个表之间非常复杂的查询。
缺点:
1.读写性能比较差,尤其是海量数据的高效率读写。 2.固定的表结构,灵活度稍欠。
-
非关系型数据库:
优点:1.格式灵活:存储数据的格式可以是K,V形式、文档形式、图片形式等等,使用灵活,应用场景广泛,而关系型数据库则只支持基础类型。 2.速度快:nosql可以使用硬盘或者随机存储器作为载体,而关系型数据库只能使用硬盘。 3.高扩展性。 4.成本低:nosql数据库部署简单,基本都是开源软件。
缺点:
1.不提供sql支持:学习和使用成本较高。 2.无事务处理。 3.数据结构相对复杂,复杂查询方面稍欠。
3.Redis(分布式缓存)
- Redis是一个使用ANSIC编写的开源、包含多种数据结构、支持网络、基于内存、可选持久性的键值对存储数据库。
- 特性:
1.基于内存运行,性能高效。
2.支持分布式,理论上可以无限扩展。
3.key-value存储系统。
4.开源的使用ANSIC语言编写、遵循BSD协议、可基于内存亦可持久化的日志型、K-V型数据库,并提供多种语言的API。
二、Linux下载安装Redis
1.普通下载安装Redis
-
Redis下载地址:
https://redis.io
-
将压缩包通过mobax上传到Linux或者复制下载链接通过wget下载,然后解压缩到/usr/local目录:
tar -zxvf redis-7.0.4.tar.gz -C /usr/local/
-
安装c语言编译环境:
yum install -y gcc
-
打印gcc版本,验证gcc编译器是否安装成功:
gcc --version
-
进入/usr/local/redis-7.0.4/目录下,编译Redis:
make
,即将源代码编译成可执行文件。 -
make会根据makefile文件里面关于install项目,将编译完成的数据安装到预定目录:
make install
,即其安装到/usr/local/bin目录下。 -
安装目录下的文件:
1.redis-benchmark:Redis自带的基准性能测试工具
2.redis-check-aof:对有问题的AOF文件进行修复
3.redis-check-rdb:对有问题的RDB文件进行修复
4.redis-sentinel:Redis集群使用
5.redis-cli:客户端
6.redis-server:服务器启动 -
进入/usr/local/bin目录下,启动redis服务:
./redis-server
,port为6379 -
后台启动,修改redis.conf文件:
vim ../redis-7.0.4/redis.conf
,
修改daemonize:daemonize yes
,可以使用/daemonize搜索该配置的位置 -
启动服务并启动后台:
./redis-server ../redis-7.0.4/redis.conf
-
客户端启动:
./redis-cli
2.docker下载安装Redis
- 查看上面redis服务的pid:
lsof -i:6379
- 杀死上面的redis进程:
kill -9 2839
- 安装docker:
yum install -y docker
- 启动docker服务:
service docker start
- 下载最新Redis镜像:
docker pull redis
- 启动redis容器:
docker run -d --name myredis -p 6379:6379 redis:latest
- 进入到redis容器的命令行交互窗口:
docker exec -it myredis /bin/bash
- 连接客户端:
redis-cli
三、Redis基础知识
1.Redis基础知识
-
redis是一个字典结构的存储服务器,一个redis实例提供了多个用来存储数据的字典,客户端可以指定数据存储在哪个字典中。
redis默认支持16个数据库,可以通过调整redis的配置文件redis/redis.conf文件中的databases来修改这一个值,设置完毕后重启redis即可。 -
redis是基于内存的操作,cpu不是redis的瓶颈,redis的瓶颈最有可能是机器内存的大小或网络带宽。既然单线程容易实现,cpu不会成为瓶颈,那就顺理成章的采用单线程的方案。
-
redis采用网络IO多路复用技术来保证在多连接的时候,系统的高吞吐量。
多路指的是多个网络连接,复用指的是复用同一个线程。采用I/O多路复用技术可以让单个线程高效的处理多个连接请求(尽量减少网络IO的时间消耗),且Redis在内存中操作数据的速度非常快(内存中的操作不会称为这里的性能瓶颈),以上主要两点造就了Redis具有很高的吞吐量。 -
进入到usr/local/redis-7.0.4/src目录下,启动服务跟后台:
./redis-server ../redis.conf
-
连接客户端:
./redis-cli
-
切换数据库:
select number
,默认使用0号数据库(默认支持16个数据库,可取0~15)。 -
命令行客户端赋值与取值:
set key value
,get key
-
清除当前库:
FLUSHDB
-
清除所有库:
FLUSHALL
2.key键
-
keys
查看当前库中所有的key。语法:keys *
三个通配符:*:通配任意多个字符。 ?:通配单个字符。 []:通配括号内的某一个字符。
在redis命令行客户端查看当前库所有的key:
keys *
,但是会阻塞redis,其他客户端的命令请求一直处于阻塞状态。
更安全的做法是采用scan,需要退出redis命令行客户端,查看所有keys:redis-cli --scan "*"
-
exists
判断某个key是否存在,返回1表示存在,返回0表示不存在。语法:exists key
判断多个key,exists k1 … kn,如果其中x个不存在,则返回n-x -
type
查看当前key所存储的值的类型。返回当前Key所存储的值的类型,如string、list等。语法:type key
-
del
删除已存在的key,不存在的key直接忽略,成功返回1,失败返回0。多个key返回成功删除存在的key的个数。语法:del key
-
expire
给key设置time秒的过期时间。设置成功返回1,当key不存在返回0。语法:expire key time
-
ttl
以秒为单位返回key的剩余过期时间。 语法:ttl key
-
persist
移除给定key的过期时间,使得key永不过期。语法:persist key
总结:
1.将Tomcat与数据库分别部署→引入本地缓存和分布式缓存→反向代理实现负载均衡→数据库的读写分离→数据库按业务分库。
就是说随着用户数的增加,并发量的增大,而逐渐形成的解决方案,从分别部署开始是为了解决tomcat和数据库的资源竞争;引入本地缓存和分布式缓存是为了缓解数据库的直接读取并发压力;反向代理实现负载均衡是为了解决因引入本地缓存和分布式缓存而导致的服务器压力,当然这是其中之一;数据库的读写分离是为了解决数据库的读写操作一起的压力;数据库按业务分库是为了解决不同业务对数据库的并发访问。
2.非关系型数据库,KV型数据库可以做缓存,列式数据库可以将实时产生的地理纬度保存,文档型数据库可以将博客CSDN文章保存,搜索型数据库可以在淘宝这种全文大数据量实现快速查询。
3.redis采用网络I/O多路复用技术让单线程可以高效处理多个连接请求,并且在内存中操作数据的速度非常快,使得它具有很高的吞吐量。redis的瓶颈最有可能是机器内存的大小或者网络带宽,cpu不会称为瓶颈,所以使用单线程。redis默认支持16个数据库,在redis.conf可以修改。
4.key键,通过key键来对value值进行操作。keys加通配符,即在当前库所有key中根据通配符进行匹配。