前言:

推荐免费Redis基础讲解视频:【狂神说Java】Redis最新超详细版教程通俗易懂_哔哩哔哩_bilibili

NoSQL概述

单机MySQL的演进

单机MySQL年代

image-20220910111313803

Memcached(缓存)+MySQL+垂直拆分

发展过程:优化数据结构和索引->文件缓存(IO)->Memcached

image-20220910112013890

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

本质:数据库(读和写)

MyISAM:表锁,影响效率,高并发下出现严重锁问题;

Innodb:行锁

image-20220910112948570

如今的数据库结构

image-20220910115501087

什么是NoSQL

NoSQL(Not Only SQL)

泛指非关系型数据库;随着互联网的告诉发展,传统关系型数据库也很难解决一些问题;NoSQL来解决这一问题。

用户的个人信息,社交网络,地理位置等这些数据类型的存储不需要一个固定的格式!

NoSQL的特点

解耦:

  • 方便扩展

  • 大数据量高性能(Redis一秒写8万次,读取11万次;NoSQL是一种细粒度的缓存,性能高)

  • 数据类型多样性

  • 传统RDBMS和NoSQL

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # 传统RDBMS
    - 结构化组织
    - SQL
    - 数据和关系都存在单独表中
    - 操作系统,数据定义语言
    - 严格的一致性
    - 基础的事务
    # NoSQL
    - 不仅仅是数据
    - 没有固定的查询语言
    - 键值对存储,列存储,文档存储,图形数据库
    - 最终一致性
    - CAP定理和BASE
    - 高性能,高可用,高扩展

了解3V和3高:

大数据时代的3V:

  • 海量Voulme(用户多)

  • 多样Varierty(每种数据都不一样)

  • 实时Velocity(实时性)

大数据时代的3高:

  • 高并发

  • 高可扩(扩展性)

  • 高性能(保证用户体验和性能)

公司的实践:NoSQL+RDBMS

NoSQL的四大分类

  • KV键值存储

    这一类数据库主要会使用到一个哈希表,这个表中有一个特定的键和一个指针指向特定的数据

  • 列存储

    这部分数据库通常是用来应对分布式存储的海量数据

  • 文档存储

    Bson格式,该类型的数据模型是版本化的文档,半结构化的文档以特定的格式存储,类似Json;

  • 图形数据库

    图形结构的数据库同其他行列以及刚性结构的SQL数据库不同,它是使用灵活的图形模型,并且能够扩展到多个服务器上

Redis概述

Redis(Remote Dictionary Server) 远程字典服务;是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

开源项目,是当下最热门的NoSQL技术之一,也常被称为结构化数据库;

Redis的作用

  • 内存存储,持久化(RDB/AOF);
  • 效率高,可用于高速缓存;
  • 发布订阅系统;
  • 地图信息分析;
  • 计时(数)器;

Redis特性:数据类型多样化,数据持久化,集群,事务…

Redis安装

官网:Redis

Linux安装(推荐)

  1. 下载Redis

    下载地址:Download | Redis

    如果你下载无法下载,可以复制下载地址到GitHub Proxy 代理加速进行下载;

  2. 把下载好的压缩包上传到远程服务器

    远程服务器购买参考:【服务器购买】阿里云服务器购买和简单部署 | Hey,Joker (jokerdig.com)

  3. 解压上传的Redis压缩包

    1
    tar -zsvf redis-7.0.4.tar.gz 
  4. 进入解压好的目录

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    [root@jokerdig opt]# ls
    apache-tomcat-8.5.82 redis-7.0.4
    containerd redis-7.0.4.tar.gz
    [root@jokerdig opt]# cd redis-7.0.4/
    [root@jokerdig redis-7.0.4]# ls
    00-RELEASENOTES runtest
    BUGS runtest-cluster
    CODE_OF_CONDUCT.md runtest-moduleapi
    CONTRIBUTING.md runtest-sentinel
    COPYING SECURITY.md
    deps sentinel.conf
    INSTALL src
    Makefile tests
    MANIFESTO TLS.md
    README.md utils
    redis.conf
    [root@jokerdig redis-7.0.4]#
  5. 安装基本环境

    1
    2
    3
    4
    5
    yum install gcc-c++ # 安装基本环境
    gcc -v # 查看版本

    make # 等待make执行完毕
    make install # 查看安装
  6. 安装好的启动文件默认在/usr

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    [root@jokerdig src]# clear
    [root@jokerdig src]# cd /usr
    [root@jokerdig usr]# ls
    bin include lib libexec sbin src
    games java lib64 local share tmp
    [root@jokerdig usr]# cd local
    [root@jokerdig local]# ls
    aegis etc include lib64 sbin src
    bin games lib libexec share
    [root@jokerdig local]# cd bin
    [root@jokerdig bin]# ls
    redis-benchmark redis-check-rdb redis-sentinel
    redis-check-aof redis-cli redis-server
    [root@jokerdig bin]#
  7. 将刚才的配置文件拷贝到当前目录下

    1
    2
    3
    4
    5
    [root@jokerdig bin]# mkdir myconfig # 新建目录为myconfig
    [root@jokerdig bin]# cp /opt/redis-7.0.4/redis.conf myconfig # 复制配置文件到myconfig下
    [root@jokerdig bin]# cd myconfig
    [root@jokerdig myconfig]# ls
    redis.conf
  8. redis默认不是后台启动,需要我们修改配置文件

    1
    2
    3
    4
    [root@jokerdig myconfig]# ls
    redis.conf
    [root@jokerdig myconfig]# vim redis.conf
    daemonize yes # 找到daemonize,默认为no改为yes
  9. 启动redis服务

    1
    [root@jokerdig bin]# redis-server myconfig/redis.conf # 通过指定的配置文件启动服务
  10. 连接redis,并简单测试

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    [root@jokerdig bin]# redis-cli -p 6379
    127.0.0.1:6379> ping
    PONG
    127.0.0.1:6379>
    127.0.0.1:6379> set name jokerdig.com
    OK
    127.0.0.1:6379> get name
    "jokerdig.com"
    127.0.0.1:6379>
    127.0.0.1:6379> keys *
    1) "name"
    127.0.0.1:6379>
  11. 开启新的服务,查看redis进程

    1
    2
    3
    4
    5
    [root@jokerdig bin]# ps -ef|grep redis
    root 47996 1 0 15:13 ? 00:00:00 redis-server 127.0.0.1:6379
    root 48002 43286 0 15:14 pts/0 00:00:00 redis-cli -p 6379
    root 48029 48007 0 15:17 pts/1 00:00:00 grep --color=auto redis
    [root@jokerdig bin]#
  12. 如何关闭redis

    1
    2
    3
    127.0.0.1:6379> shutdown
    not connected> exit
    [root@jokerdig bin]#

Windows安装(不推荐)

  1. 下载Redis

    下载地址:Releases · microsoftarchive/redis (github.com)

    image-20220910141653076

    可以看到已经停更好久了!

  2. 下载好压缩包,解压到指定目录

    image-20220910142235619

  3. 双击redis-server.exe即可启动

    Redis默认端口:6379

    image-20220910142306270

  4. 双击redis-cli.exe启动客户端,进行连接,输入ping,输出PONG表示连接成功

    image-20220910142540089

  5. 设置key/value并获取

    image-20220910142644274

这篇教程主要以Linux使用Redis为准(Redis官方也推荐在Linux使用Redis),Windows仅作安装演示。

Redis基本知识说明

Redis性能测试

redis-benchmark是一个压力测试工具

image-20220910152739031

语法:

1
redis-benchmark [option] [option value] # 在服务器目录下执行,而非redis客户端

可选参数:

描述 默认值 默认值
-h 指定服务器主机名 127.0.0.1
-p 指定服务器端口 6379
-s 指定服务器 socket
-c 指定并发连接数 50
-n 指定请求数 10000
-d 以字节的形式指定 SET/GET 值的数据大小 3
-k 1=keep alive 0=reconnect 1
-r SET/GET/INCR 使用随机 key, SADD 使用随机值
-P 通过管道传输 <numreq> 请求 1
-q 强制退出 redis。仅显示 query/sec 值
--csv 以 CSV 格式输出
-l 生成循环,永久执行测试
-t 仅运行以逗号分隔的测试命令列表。
-I Idle 模式。仅打开 N 个 idle 连接并等待。

简单测试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 90个并发连接  50000请求
[root@jokerdig bin]# redis-server myconfig/redis.conf
[root@jokerdig bin]# redis-benchmark -h localhost -p 6379 -c 90 -n 50000
# 测试结果 用SET举例
====== SET ======
50000 requests completed in 0.55 seconds # 5w条数据
90 parallel clients # 90个并发连接
3 bytes payload # 每次写入三个字节
keep alive: 1 # 只有一台服务器处理
host configuration "save": 3600 1 300 100 60 10000
host configuration "appendonly": no
multi-thread: no
........
100.000% <= 1.999 milliseconds (cumulative count 50000) # 全部完成实践小于等于1.999秒

Redis基本知识

数据库

redis默认有16个数据库,默认使用第0个数据库;

可以使用select进行切换

1
2
3
4
5
127.0.0.1:6379> select 2 # 切换数据库
OK
127.0.0.1:6379[2]> dbsize # 当前数据库大小
(integer) 0
127.0.0.1:6379[2]>

查看所有的key

1
2
3
4
5
6
7
127.0.0.1:6379> keys *
1) "mylist"
2) "counter:__rand_int__"
3) "key:__rand_int__"
4) "name"
5) "myhash"
127.0.0.1:6379>

清空数据库内容

1
2
127.0.0.1:6379> flushdb # 清空当前数据库
127.0.0.1:6379> flushall # 清空所有数据库

Redis是单线程吗

Redis 单线程指的是:

接收客户端请求->解析请求 ->进行数据读写等操作->发生数据给客户端

这个过程是由一个线程(主线程)来完成的,这也是我们常说 Redis 是单线程的原因。

但是,Redis 程序并不是单线程的,Redis 在启动的时候,是会启动后台线程(BIO)。

Redis 单线程为什么速度还快

  • 高性能的服务器并不一定就是多线程;
  • 多线程不一定比单线程效率高;

核心原因:

  • Redis 的大部分操作都在内存中完成,并且采用了高效的数据结构,因此决定Redis瓶颈的是网络带宽或内存,并非CPU;
  • 采用单线程避免多线程之间竞争的问题,也不会导致死锁;
  • Redis 采用了 I/O 多路复用机制处理大量的客户端 Socket 请求,即一个线程处理多个 IO 流。

Redis6.0后引入多线程问题

Redis 的主要工作(网络 I/O 和执行命令)一直是单线程模型,但在 Redis 6.0 版本之后,也采用了多个 I/O 线程来处理网络请求,这是因为随着网络硬件的性能提升,网络 I/O 的处理成为Redis处理数据的瓶颈,因此引入的多线程 I/O 特性对性能提升。

但是对于读写命令,Redis 仍然使用单线程来处理

关于RedisKey的基本命令

Redis官方命令文档:Commands | Redis

Redis 键命令用于管理 redis 的键

语法:

1
COMMAND key_name

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
127.0.0.1:6379> set name jokerdig.com
OK
127.0.0.1:6379> set age 18
OK
127.0.0.1:6379> exists name
(integer) 1
127.0.0.1:6379> exists name1
(integer) 0
127.0.0.1:6379> EXPIRE age 10 # age 10s后过期
(integer) 1
127.0.0.1:6379> ttl age
(integer) 2
127.0.0.1:6379> ttl age
(integer) -2
127.0.0.1:6379> get age
(nil)
127.0.0.1:6379> get name
"jokerdig.com"
127.0.0.1:6379> keys * # 查看所有key
1) "name"
127.0.0.1:6379> type name # 查看类型
string
127.0.0.1:6379>

常用命令

命令 描述
DEL key 该命令用于在 key 存在时删除 key
DUMP key 序列化给定 key ,并返回被序列化的值。
EXISTS key 检查给定 key 是否存在。
EXPIRE key seconds 给定 key 设置过期时间,以秒计。
EXPIREAT key timestamp EXPIREAT 的作用和 EXPIRE 类似不同在于 EXPIREAT 命令接受的时间参数是 UNIX 时间戳。
PEXPIRE key milliseconds 设置 key 的过期时间以毫秒计。
PEXPIREAT key milliseconds-timestamp 设置 key 过期时间的时间戳以毫秒计
KEYS pattern 查找所有符合给定模式的 key,key *查看所有 。
MOVE key db 将当前数据库的 key 移动到给定的数据库 db 当中。
PERSIST key 移除 key 的过期时间,key 将持久保持。
PTTL key 以毫秒为单位返回 key 的剩余的过期时间。
TTL key 以秒为单位,返回给定 key 的剩余生存时间。
RANDOMKEY 从当前数据库中随机返回一个 key 。
RENAME key newkey 修改 key 的名称
RENAMENX key newkey 当 newkey 不存在时,将 key 改名为 newkey 。
SCAN cursor [MATCH pattern\] [COUNT count] 迭代数据库中的数据库键。
TYPE key 返回 key 所储存的值的类型。