前言
只要学不死,就往死里学!
链接:redis学习
提取码:1256
附:
链接:xshell和xftp
提取码:1256
一.NoSql
1.背景
1.1 mysql的演变
(1) 单机Mysql数据的瓶颈
数据量大, 单个机器不能满足需求;访问量(读写混合)一个实例不能承受
(2) Memcached+mysql+垂直拆分
(3) mysql主从读写分离
(4) 分表分库 水平拆分 mysql集群
存在瓶颈:
MySQL的扩展性差(需要复杂的技术来实现),大数据下IO压力大,表结构更改困难。
1.2 NoSQL数据库应运而生
伴随互联网的发展,智能移动设备的普及,用户访问量和用户数据激增,所有的互联网平台面临性能挑战,急需解决CPU、内存、IO的压力。
有2个典型场景应用nosql数据库:
(1)集群中,用户登录后,共享session的存储问题:
使用缓存数据库存储session,基于内存存储,速度快且数据结构简单;
(2)频繁查询的数据放入缓存中:
使用缓存数据库,最重要的一点打破了传统关系型数据库以业务逻辑为导向的存储模式,而是针对不同数据结构改为以性能为先的存储模式;
2.nosql数据库概述
2.1 概念
NoSQL(NoSQL = Not Only SQL ),意即“不仅仅是SQL”,泛指非关系型的数据库。 NoSQL 不依赖业务逻辑方式存储,而以简单的key-value模式存储,因此大大的增加了数据库的扩展能力。
不遵循SQL标准
不支持ACID
远超于SQL的性能
2.2 nosql的使用
(1).NoSQL适用场景
对数据高并发的读写(秒杀功能)
海量数据的读写
(2).NoSQL不适用场景
需要事务支持
基于sql的结构化查询存储,处理复杂的关系,需要即席查询
2.3 RDBMS vs NoSQL
RDBMS | NoSQL |
---|---|
数据高度组织化结构化;支持结构化查询语言(SQL);数据和关系存储在单独的表中;支持数据操纵语言和数据定义语言;严格的一致性;支持事务 | 代表着不仅仅是SQL;没有声明性查询语言; 没有预定义的模式;键 - 值对存储,列存储,文档存储,图形数据库;支持最终一致性,而非ACID属性;数据非结构化和不可预知;CAP定理;高性能,高可用性和可伸缩性 |
3.根据数据模型对nosql分类
4.CAP
CAP包含三部分内容:
一致性(Consistency) 、可用性(Availability) 、分区容错性(Partition tolerance)
一致性:对于客户端的每次读操作,要么读到的是最新的数据,要么读取失败。即,一致性是站在分布式系统的角度,对访问本系统的客户端的一种承诺:要么返回一个错误,要么返回绝对一致的最新数据,强调的是数据正确
可用性: 任何客户端的请求都能得到响应数据,不会出现响应错误。即,可用性是站在分布式系统的角度,对访问本系统的客户的另一种承诺:一定返回数据,不会返回错误,但不保证数据最新,强调的是服务可用
分区容错性:由于分布式系统通过网络进行通信,网络是不可靠的。当任意数量的消息丢失或延迟到达时,系统仍会继续提供服务,不会挂掉。即,分区容忍性是站在分布式系统的角度,对访问本系统的客户端的再一种承诺:不管内部出现何种数据同步问题,系统始终在线,强调的是不挂掉。
CAP理论的核心是:一个分布式系统不可能同时很好的满足一致性,可用性和分区容错性这三个需求,最多只能同时较好的满足两个
二.Redis概述和安装
2.1 概述
2.1.1 简介
redis(remote dictionary server 远程字典服务器)
官网
中文官网
redis基于内存且支持数据的持久化;
redis单线程运行,省去线程上下文切换带来的性能开销,效率高;
redis支持的数据类型丰富,字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) , bitmaps, hyperloglogs 和 地理空间(geospatial) ;
通过 Redis哨兵(Sentinel)和自动分区(Cluster)提供高可用性(high availability)
2.1.2 作用和应用
(1) 配合关系型数据库做高速缓存;
需要注意缓存穿透、缓存击穿、缓存雪崩问题
(2) 多样的数据结构存储持久化数据;
最新的N个数据(通过List实现按自然时间排序的数据)
排行榜,Top N(利用zset有序集合)
时效性数据,如手机验证码(expire过期时间)
秒杀系统(原子性 watch multi discard exec ,自增方法incrby、decrby)
爬虫系统,url去重(利用set集合)
构建队列(利用list集合)
发布订阅消息系统(pub/sub)
2.2 安装
2.2.1 点击链接下载redis所需的版本
2.2.2 编译安装redis
1)安装C 语言的编译环境:
yum -y install gcc tcl –y
查看gcc版本
gcc --version
2)上传下载的源码包到/opt目录下解压缩
tar -zxvf redis-6.2.1.tar.gz
3)在redis-6.2.1目录下执行make命令
make
4)跳过make test 继续执行: make install
make install
2.2.3 安装目录:/usr/local/bin (用户自行编译安装时默认的可执行程序的安装位置)
redis-benchmark:性能测试工具,可以在自己本子运行,看看自己本子性能如何
redis-check-aof:修复有问题的AOF文件,rdb和aof后面讲
redis-check-dump:修复有问题的dump.rdb文件
redis-sentinel:Redis集群使用
redis-server:Redis服务器启动命令
redis-cli:客户端,操作入口
2.3 redis启动(后台启动)和关闭
2.3.1 启动
备份redis.conf
后台启动设置daemonize no改成yes
Redis启动
redis-server /opt/redis-6.2.1/redis.conf
用客户端访问
redis-cli
2.3.2 关闭redis
单实例或多实例关闭:
redis-cli进入客户端,再输入 shutdown
2.3.3 redis密码设置
修改redis的配置文件—redis.conf,找到requirepass,注释去掉,并将后面的字段设置成密码,保存退出:
重启redis服务:
客户端连接redis,解密后才允许操作:
三.redis有关知识
3.1 数据库命令
默认端口6379,默认16个数据库,类似数组下标从0开始,初始默认使用0号库。
使用命令 select <dbid>
来切换数据库
dbsize 查看当前数据库的key的数量
flushdb 清空当前库
flushall 清空全部库
3.2 单线程+多路IO复用技术
多路复用是指使用一个线程来检查多个文件描述符(Socket)的就绪状态(调用select, epoll, evport, kqueue函数),传入多个文件描述符,如果有一个文件描述符就绪,则返回,否则阻塞直到超时。得到就绪状态后进行真正的操作可在同一个线程里执行,也可启动线程执行(如使用线程池)
memcached | Redis |
---|---|
多线程+锁 | 单线程+多路IO复用 |
如:epoll机制:
客户端操作服务器时就会产生这三种文件描述符(简称fd):writefds(写)、readfds(读)、和exceptfds(异常)。没有fd个数限制,用户态拷贝到内核态只需要一次,使用时间通知机制来触发。通过epoll_ctl注册fd,一旦fd就绪就会通过callback回调机制来激活对应fd,进行相关的io操作。