视频教程:【狂神说Java】Redis最新超详细版教程通俗易懂

Nosql概述

时代背景:

1.单机数据库时代

90年代:一个基本的网站访问量一般不会太大,单个数据库完全足够!

  • 那个时候,更多的去使用静态网页 Html~服务器根本没有太大的压力!

    • 思考一下,这种情况下:整个网站的瓶颈是什么?

      1,数据量如果太大,一个机器放不下了!

      2,数据的索引(B+Tree),一个机器内存也放不下

      3.访问量(读写混合)

2.Memcached时代

memcached是一套分布式的高速缓存系统,由LiveJournal的Brad Fitzpatrick开发,但被许多网站使用。这是一套开放源代码软件,以BSD license授权发布。

memcached缺乏认证以及安全管制,这代表应该将memcached服务器放置在防火墙后。

memcached的API使用三十二比特的循环冗余校验(CRC-32)计算键值后,将数据分散在不同的机器上。当表格满了以后,接下来新增的数据会以LRU机制替换掉。由于memcached通常只是当作缓存系统使用,所以使用memcached的应用程序在写回较慢的系统时(像是后端的数据库)需要额外的代码更新memcached内的数据。

(缓存) + 数据库 +垂直拆分(读写分离)[此处的数据库都是指mysql数据库]

数据库垂直拆分与水平拆分的方式和问题

垂直拆分:
顾名思义是将表垂直着给拆掉,即:

  • 将表的字段拆成多张表(列拆分)

水平拆分:
顾名思义是将表数据水平的拆掉,即:

  • 将表的内容进行拆分(行拆分),一表内容放多表存储。

3. 水平拆分

分库分表+水平拆分+Mysql集群

数据库拆分:横向拆分和纵向拆分

技术和业务在发展的同时,对人的要求也越来越高了

本质:数据库(读,写)

早些年MyISAM:表锁,十分影响效率!高并发下就会出现严重的锁问题

转战Innodb:行锁

慢慢的就开始使用分库分表来解决写的压力!MySQL 在哪个年代推出了表分区!这个并没有多少公司使用!

MySQL 的集群,很好满足哪个年代的所有需求!

MyISAM与InnoDB 的区别(9个不同点)

  1. InnoDB支持事务,MyISAM不支持;

  2. InnoDB支持外键,而MyISAM不支持;

  3. InnoDB是聚集索引,使用B+Tree作为索引结构,数据文件是和(主键)索引绑在一起的(表数据文件本身就是按B+Tree组织的一个索引结构),必须要有主键,通过主键索引效率很高。
    MyISAM是非聚集索引,也是使用B+Tree作为索引结构,索引和数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。

  4. InnoDB不保存表的具体行数,执行select count(*) from table时需要全表扫描。而MyISAM用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快(注意不能加有任何WHERE条件);

  5. Innodb不支持全文索引,而MyISAM支持全文索引,在涉及全文索引领域的查询效率上MyISAM速度更快高;PS:5.7以后的InnoDB支持全文索引了

  6. MyISAM表格可以被压缩后进行查询操作

  7. InnoDB支持表、行(默认)级锁,而MyISAM支持表级锁

    ​ InnoDB的行锁是实现在索引上的,而不是锁在物理行记录上。潜台词是,如果访问没有命中索引,也无法使用行锁,将要退化为表锁

  8. InnoDB表必须有唯一索引(如主键)(用户没有指定的话会自己找/生产一个隐藏列Row_id来充当默认主键),而Myisam可以没有

  9. Innodb存储文件有frm、ibd,而Myisam是frm、MYD、MYI

    ​ Innodb:frm是表定义文件,ibd是数据文件

    ​ Myisam:frm是表定义文件,myd是数据文件,myi是索引文件

4. 大数据时代

灰度发布

大厂常用的几种灰度发布方案

什么是NoSql

nosql = not only sql

泛指非关系型数据库

NoSQL = Not Only SQL(不仅仅是SQL)

关系型数据库:表格,行,列

泛指非关系型数据库的,随着web2.0互联网的诞生!传统的关系型数据库很难对付web2.0时代!尤其是超大规模的高并发的社
区!暴露出来很多难以克服的问题。

NoSQL在当今大数据环境下发展的十分迅速,Redis是发展最快的,而且是我们当下必须要掌握的一个技术!

很多的数据类型用户的个人信息,社交网络,地理位置.这些数据类型的存储不需要一个固定的格式!不需要多月的操作就可以横
向扩展的!Map<String,Object>使用键值对来控制!

NoSql特点

解耦!

  1. 方便扩展(数据之间没有关系,很好扩展!)

  2. 大数据量高性能(Redis一秒写8万次,读取11万,NoSQL的缓存记录级,是一种细粒度的缓存,性能会比较高!)

  3. 数据类型是多样型的!(不需要事先设计数据库!随取随用!如果是数据量十分大的表,很多人就无法设计了!)

  4. 传统RDBMS和NOSQL对比:

    NoSql与RDBMS的对比

    传统的 RDBMS
    - 结构化组织
    - SQL
    - 数据和关系都存在单独的表中
    - 操作操作,数据定义语言
    - 严格的一致博
    - 基础的事务
    -.....
    
    Nosql
    - 不仅仅是数据
    - 没有固定的查询语言
    - 键值对存储,列存储,文档存储,图形数据库(社交关系)
    - 最终一致性,
    - CAP定理和BASE(异地多活)初级架构师!(狂神理念:只要学不死,就往死里学!)
    - 高性能,高可用,高可扩
    - ...
    

    了解:3V+3高

  • 大数据时代的3V:主要是描述问题的

    ​ 1.海量Volume
    ​ 2.多样Variety
    ​ 3.实时Velocity

  • 大数据时代的3高:主要是对程序的要求
    1 .高井发
    2. 高可拓
    3. 高性能

真正在公司中的实践:NOSQL+RDBMS一起使用才是最强的,阿里巴巴的架构演进!

技术没有高低之分 就看如何使用:

阿里巴巴演进分析:

技术急不得,越是慢慢学,才能越扎实

开源才是技术的王道


如果你未来相当一个架构师:没有什么是加一层解决不了的!

#1,商品的基本信息
  名称,价格、商家信息: 
  关系型数据库就可以解决了!MySQL/Oracle(淘宝早年就去IOE了!-王坚:推荐文章:阿里云的这群孩子:40分钟重要!)
  淘宝内部的 MySQL 不是大家用的MySQL

#2,商品的播述,评论(文字比较多)
	文档型数掘库中,MongoDB
	
#3.图片
	分布式文件系统 FastDFS
	- 淘宝自己的 TFS
	- Gooale的 GFS
	- Hadoop HDFS
	- 阿里云的 oss
	
#4,商品的关健字(搜索)
	- 搜索引擎 solr elasticsearch
	- ISerach:多隆(多去了解一下这斐技术大佬!)
	- 所有牛逼的人都有一段苦逼的岁月!但是你只要像SB一样的去整持,终将牛逼!

#5,商品热门的波段信息
 	- 内存数据库
 	- Redis Tair,Memache...

#6,商品的交易,外部的支付接口
	- 三方应用

没有什么是加一层解决不了的!

Nosql 四大分类

kv键值对

  • 新浪:Redis
  • 美团:Redis+Tair
  • 阿里,百度:Redis+memecache

文档型数据库

(bson格式和json一样):

  • MongoDB(一般必须要掌握)
    • MongoDB是一个基于分布式文件存储的数据库,C++编写,主要用来处理大量的文档!
    • MongoDB是一个介于关系型数据库和非关系型数据中中间的产品!MongoDB是非关系型数据库中功能最丰富,最像关系型数据库的!
  • ConthDB

列存储数据库

  • HBase
  • 分布式文件系统

图关系数据库

  • 如 拓扑图
    • 存放关系

Redis 入门:

概述:

  • Redis是什么?

    Redis(Remote Dictionary Server),即远程字典服务。
    是一个开源的使用ANSI C语言编写,支持网络.可基于内存亦可持久化的日志型,Key-Value数抱座,井提供多种语言的API
    redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,井且在此基础上实现了master-slave(主从)同步.
    免费和开源!是当下最热门的 NoSQL技术之一1也枝人们称之为结构化数据库!

  • Redis能做什么?

    1. 内存存储,持久化,因为内存中是断电即失,所以说持久化很重要(rdb.aof)
    2. 效率高,可以用于高速缓存
    3. 发布订阅系统
    4. 地图信息分析
    5. 计时器,计数器(浏览量!)
  • Redis特性

    1. 多样的数据类型
    2. 持久化
    3. 集群
    4. 事务

Redis(Linux)安装:

前置操作:

  1. 一般对与Redis的使用都是在Linux系统上进行操作

    Linux将一个文件夹或文件夹下的所有内容复制

  2. 对于win10的操作系统,可以安装wsl,进行对linux的操作

    Windows Subsystem for Linux(简称WSL)是一个在Windows 10上能够运行原生Linux二进制可执行文件(ELF格式)的兼容层。它是由微软与Canonical公司合作开发,其目标是使纯正的Ubuntu 14.04 "Trusty Tahr"映像能下载和解压到用户的本地计算机,并且映像内的工具和实用工具能在此子系统上原生运行。

    具体操作指南:

    1. 从 0 到 1 在 Windows 上搭建 WSL
    2. Xshell和Xftp登陆WSL
    3. 适用于 Linux 的 Windows 子系统安装指南 (Windows 10)

    此时打开xshell就可以使用了本机的ubuntu了

  3. 对于新安装的系统需要安装Java环境

    • 操作指南:

      Ubuntu 16.04下Java环境安装与配置

      1. 确认系统:如何查看linux系统版本 查看linux系统的位数

        64位:uname -a

      2. 官网下载

      3. 系统安装

        安装成功

正式安装Redis

  1. 下载安装包:

    此时官网的是:最新稳定版本是redis 6.0.6

    有最新用最新的,不要怂就是干

  2. 解压,sudo tar -zvxf,并把解压后的文件移动至/opt目录下

  3. 开始配置redis

  4. 安装Redis:

    1. 狂神语句:yum install gcc-c++

      但是不知为何在wsl上执行不了该语句:

      也报错:https://zhidao.baidu/question/1927871047087690147.html

      分开执行:即可

      sudo apt-get install gcc
      sudo apt-get install g++
      

      安装完毕之后:gcc -v查看版本

    1. 狂神:执行 make操作

      同样本机不知为啥执行不了,于是:

      用sudo make执行后,进行了漫长的等待…直至

      就已经安装成功了,默认会安装在 /usr/local/bin目录下

    2. 备份配置文件

      之后用备份的conf的文件启动,同时不影响原来的配置信息

      1. redis默认不是后台启动,需要修改conf文件

    3. 启动redis服务

    4. 查看redis的进程是否启动

      ps -ef|grep redis

    5. 关闭redis服务

      1. 遇坑:Redis第一次启动,SHUTDOWN时提示: (error) ERR Errors trying to SHUTDOWN. Check logs.

        1. 使用sudo 启动服务就行了

        2. 或者指定下log文件夹

          Linux创建文件的5种方式

        3. 以上操作需要手动清理redis进程并重启redis服务

        4. 如果还不行 则需要手动sudo chmod 777 dump.rdb (在log目录下)

      2. 踩坑:

        #Redis Error #MISCONF Redis is configured to save RDB snapshots

        Redis被配置为保存数据库快照,但它目前不能持久化到硬盘。用来修改集合数据的命令不能用。请查看Redis日志的详细错误信息。

        运行命令:config set stop-writes-on-bgsave-error no 即可

      3. 踩坑3:修改权限:

        当文件通过xftp上传至服务器时出错(Permission denied)

        使用:sudo chmod 777 [对应的文件夹/文件] 即可

性能测试:

redis-benchmark是一个压力测试工具!(官方自带的性能测试工具!)

redis-benchmark 命令参数如下:Redis 性能测试

图片来自菜鸟教程:

简单测试:

  1. 开启redis服务

    sudo redis-server wConfig/redis.conf 
    
  2. 执行性能测试:

    #测试100个并发 100000个请求
    sudo redis-benchmark -h localhost -p 6379 c 100 -n 100000
    

  3. 性能分析:

基础知识

  1. redis默认有16个数据库

    默认使用的是第0个

    可以使用select进行数据库切换

    127.0.0.1:6379> select 3
    OK
    127.0.0.1:6379[3]> DBSIZE
    (integer) 0
    127.0.0.1:6379[3]> SET NAME WAYNE
    OK
    127.0.0.1:6379[3]> DBSIZE
    (integer) 1
    127.0.0.1:6379[3]> 
    
  2. 查看所有keys

    127.0.0.1:6379[3]> keys *
    1) "NAME"
    
  3. 清空当前数据库

    127.0.0.1:6379> select 3
    OK
    127.0.0.1:6379[3]> keys *
    1) "NAME"
    127.0.0.1:6379[3]> flushdb
    OK
    127.0.0.1:6379[3]> keys *
    (empty array)
    
  4. 清空全部数据库

    127.0.0.1:6379> flushall
    OK
    

Redis是单线程的:

  1. Redis面试题(一): Redis到底是多线程还是单线程?

  2. Redis 到底是单线程还是多线程?我要吊打面试官!

明白Redis是很快的,官方表示,Redis是基于内存操作,CPU不是Redis性能瓶颈,Redis的瓶颈是根据机器的内存和网络带宽,既然可以使用单线程来实现,就使用单线程了!所有就使用了单线程了!

Redis是C语言写的,官方提供的数据为 100000+的QPS(每秒查询),完全不比同样是使用 key-vale的Memecache差!

Redis 为什么单线程还这么快?

  1. 误区1:高性能的服务器一定是多线程的?
  2. 误区2:多线程(CPU上下文会切换!)一定比单线程效率高!

CPU>内存>硬盘的速度要有所了解!
核心:

(1) 绝大部分请求是纯粹的内存操作(非常快速)

(2) 采用单线程,避免了不必要的上下文切换和竞争条件

(3) 非阻塞IO - IO多路复用

Redis相比memcached有哪些优势?

我们所知的内存型的存储数据库,除了Redis外还有Memcache。两者的共同点就是存储时都是K-V存储的,而本质区别就是Redis的value是有类型的。

(1) memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型
(2) redis的速度比memcached快很多
(3) redis可以持久化其数据
(4)Redis支持数据的备份,即master-slave模式的数据备份。
(5) 使用底层模型不同,它们之间底层实现方式 以及与客户端之间通信的应用协议不一样。Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。
(6)value大小:redis最大可以达到1GB,而memcache只有1MB

更多推荐

厚积薄发打卡Day55 :[狂神]Redis详细教程(上)<从Nosql 概述到WSL安装Redis踩坑记录>