JAVA WEB DAY 17_ Redis

Redis

01_NOSQL的概述-[★★]

NOSQL:泛指非关系型数据库

02_为什么要使用NOSQL-[★★]

NOSQL的好处:快
1. 解决高并发数据访问问题
2. 解决高海亮数据存储问题

具体表现为对如下问题的解决:

High Performance - 数据库高并发访问

​ 在同一个时间点,同时有海量的用户并发访问。往往要达到每秒上万次读写请求。关系数据库应付上万次SQL查询还勉强顶得住,但是应付上万次SQL写数据请求,硬盘IO就已经无法承受了。

  • 如天猫的双11,从凌晨0点到2点这段时间,每秒达到上千万次的访问量。
  • 12306春运期间,过年回家买火车抢票的时间,用户不断查询有没有剩余票。

Huge Storage - 高海量数据的存储

​ 数据库中数据量特别大,数据库表中每天产生海量的数据。

​ 类似QQ,微信,微博,每天用户产生海量的用户动态,每天产生几千万条记录。对于关系数据库来说,在一张几亿条记录的表里面进行SQL查询,效率是极其低下乃至不可忍受的。

03_Redis的安装和启动-[★★]

  1. redis存储数据的格式:键值对形式存储
  2. 启动redis客户端的可执行程序是:redis-cli.exe
  3. 启动redis服务器的可执行程序是:redis-server.exe
  4. redis服务器使用的端口号是:6379
  • Redis 安装步骤:

解压即完成安装
注意事项

  1. 安装目录不要包含中文
  2. 目录不要太深
  3. 硬盘需要至少有20G内存空间
  • Redis 目录结构
目录或文件 作用
redis-benchmark.exe 用于 Reids 的性能测试工具
redis-check-aof.exe AOF 日志文件修复工具
redis-check-dump.exe RDB 文件修改工具
redis-cli.exe client 命令行的客户端工具
redis-server.exe server 服务器端的启动程序
redis.windows.conf redis 在 window 下的配置文件
  • Redis启动和停止步骤
  1. 启动redis
    进入redis解压目录:双击redis-server.exe文件
  2. 停止redis
    关闭服务器窗口即可停止

04_Redis五种数据类型及结构概述-[★★★★★]

  1. redis五种数据类型分别是:
    string
    hash
    list
    set
    zset
  2. 实际开发中主要使用哪种数据类型:string

在这里插入图片描述

关于key的定义,注意如下几点:

  1. 不建议key名字太长,通常不超过1024,如果太长会影响查询的速度。
  2. 不建议太短,太短会降低可读性。
  3. 一般在公司,都有统一命名规范

05_string类型操作命令-[★★★★★]

  1. 往redis存储键值对字符串的命令是:set 键 值
  2. 从redis中根据键获得值的命令是:get 键
  3. 从redis中根据键删除键值对的命令是:del 键
  • 命令语法
命令 说明
set 键 值 添加或修改键值对
get 键 根据键获得值
del 键 根据键删除键值对
  • 命令演示
  1. 添加一个键为company,值为qingruan
  2. 再设置一个键为company,值为baidun
  3. 得到company的元素
  4. 删除company元素
  5. 再次删除company看返回值是否相同
  6. 得到company看返回值是多少
  • 执行效果

在这里插入图片描述

06_hash类型操作命令-[★★★]

hash类型底层结构对应java的哪种类型?HashMap

  • 命令语法
命令 说明
hset 键 字段 值 向指定的中添加一对hash类型的字段名和值
hget 键 字段 取出指定键的指定字段的值
hmset 键 字段 值 字段 值 mulitple,一次向某个键中设置多个字段名和值
hmget 键 字段 字段 一次从指定的键中得到多个字段的值
hdel 键 字段 字段 删除一个键中的一个或多个字段
hgetall 键 得到某个键所有的字段值
  • 命令演示
  1. 创建hash类型的键为user,并且添加一个字段为username,值为pkxing
  2. 向user中添加字段为password,值为12345
  3. 向user中添加字段为age,值为18
  4. 分别得到user中的username、password和age的字段值
  5. 向user中同时添加多个字段和值,birthday 2018-01-01 sex male
  6. 同时取得多个字段:age 和 sex
  7. 得到user中所有的字段和值
  8. 删除user中的生日和密码字段
  • 执行效果

在这里插入图片描述

07_list类型操作命令-[★★★]

1.list数据类型的特点:有序可重复
2.list类型底层结构对应java的哪种类型:ArrayList

  • 命令语法
命令 行为
lpush 键 元素 元素 left push在列表的左边向指定的键中添加列表元素,如果该键并不存在,Redis将为该键创建一个新的链表,如果这个键已经存在,则是向list添加元素。
rpush 键 元素 元素 right push在列表的右边向指定的键中添加列表元素
lpop 键 left pop从指定键中的左边弹出一个元素,列表中的元素就删除了。
rpop 键 right pop从指定键的右边弹出一个元素,列表中的元素就删除了。
lrange 键 开始 结束 从指定键的列表中取出指定范围的元素列表,从左边数起从0开始,从右边数起从-1开始。如果要取整个列表,开始是0,结束是-1
llen 键 得到指定列表的长度
  • 命令演示
  1. 向mylist键的列表中,从左边添加a b c三个元素
  2. 从右边添加one two three三个元素
  3. 查询所有的元素
  4. 从右边添加一个重复的元素three
  5. 删除最右边的元素three
  6. 删除最左边的元素c
  7. 获取列表中元素的个数
  • 执行效果

在这里插入图片描述

08_set类型操作命令-[★★★]

  1. set数据类型的特点:无序且不可重复
  2. list类型底层结构对应java的哪种类型:HashSet
  • 命令语法
命令 行为
sadd 键 元素 元素 向set集合中添加1个或多个元素
smembers 键 查询指定的集合中所有的元素
sismember 键 元素 判断指定的元素是否在某个集合中,如果存在返回1,否则返回0
srem 键 元素 元素 remove删除指定的一个或多个元素
  • 命令演示
  1. 向myset集合中添加A B C 1 2 3 六个元素
  2. 再向myset中添加B元素,看能否添加成功
  3. 显示所有的成员,发现与添加的元素顺序不同,元素是无序的
  4. 删除其中的C这个元素,再查看结果
  5. 判断A是否在myset集合中
  6. 判断D是否在myset集合中
  • 执行效果

在这里插入图片描述

09_zset类型操作命令-[★★]

  • 命令语法
命令 描述
zadd 键 分数 值 分数 值 添加1个或多个元素,每个元素都有一个分数
zrange 键 开始索引 结束索引 获取指定范围的元素,得到所有的元素,索引是0到-1
zrem 键 值 值 删除一个或多个值
zcard 键 得到元素个数
zrank 键 值 得到元素的索引号
zscore 键 值 得到元素的分数
  • 命令演示
  1. 添加键country,分数是10,值是Japan
  2. 添加键country,分数是5,值是USA,添加键country,分数是50,值是Russian
  3. 添加键country,分数是1,值是China,分数是120,值是Korea
  4. 查询country中所有的元素
  5. 查询Japan的索引号(从0开始)
  6. 删除值为USA的元素
  7. 查询country中还有多少个元素
  8. 显示Russian的分数值

在这里插入图片描述

10_客户端工具使用和redis通用命令-[★★★★★]

  • 通用命令语法
命令 功能
keys 匹配字符 查询当前数据库中由哪些键
* 匹配多个字符
? 匹配1个字符
del 键 1 键 2 可以删除任意键,可以一次删除多个键
exits 键 是否存在指定的键
type 键 判断指定的键它的值是什么类型,如:string,hash,list,set,none
select 数据库编号 选择指定的数据库,0~15
move 键 数据库编号 将某个键移动到另一个数据库中,如果另一个数据库中有同名的键,则移动失败。
  • 命令演示
  1. 添加字符串name的值为zhangsan
  2. 显示所有的键
  3. 显示所有以my开头的键
  4. 显示所有my后面有三个字符的键
  5. 添加一个字符串:name2 lisi
  6. 添加一个list:name3 a b c d
  7. 显示所有的键
  8. 一次删除name2和name3这两个键,其中name2和name3是不同的类型,显示所有键
  9. 分别判断name和name2是否存在
  10. 分别判断name user myset mylist分别是什么类型
  11. 切换数据库到15,向15中添加一个name2 wangwu,得到name2的值显示。
  12. 将15中的name2移到0中
  13. 切换到数据库0,显示所有的键
  • 执行结果

在这里插入图片描述

在这里插入图片描述

11_Redis的持久化-RDB持久化机制-[★★]

问:把客户端和服务端都关闭了,再重新开启服务器和客户端,数据会不会丢失?
答:可能会部分丢失,可能会全部丢失

  • RDB持久化机制的配置

在redis.windows.conf配置文件中的SNAPSHOTTING快照中有如下说明:

语法 说明
save<时间间隔><修改键数> 在指定的时间间隔内,修改了多少个键,则进行持久化的操作

如下面配置的是RDB方式数据持久化时机,必须两个条件都要满足

关键字 时间(秒) 修改键数 解释
save 900 1 在15分钟内如果修改了1个键,则进行持久化操作
save 600 10 在5分钟内如果修改了10个键,则进行持久化操作
save 60 10000 在1分钟内如果修改了1万个键,则进行持久化操作
  • RDB持久化内存的数据到dump.rdb文件,文件中会存储键值对数据。
  • RDB持久化的时候是将当时内存中所有的键值对一次性的持久化到dump.rdb。

示例演示-RDB持久化数据

  • 需求:修改rdb持久化策略方案,设置20秒内修改3个键进行持久化数据到dump.rdb文件中。

  • 实现步骤:

    1. 修改配置文件:redis.windows.conf 的101行,增加如下配置
    save 20 3
    
    1. 重启redis服务器端:要求启动的时候指明配置文件启动
    3. 打开DOS命令行窗口,切换到redis安装目录:cd d:/redis
    4. 启动服务器指定配置文件启动,格式:redis-server.exe redis.windows.conf
    
    1. 启动客户端,测试在20秒内写入3个键
    2. 关闭服务器,再次启动看是否有持久化
  1. RDB执行持久化的机制:在指定时间段内修改了指定数量的键时才执行持久化操作。
  2. RDB持久化机制的优点
  • 因为不是实时持久化,所以效率高。
  • 持久化文件中只记录内存中键值对的结果,不会记录对键值对修改的过程。
  1. RDB持久化机制的缺点
  • 因为不是实时持久化,所以数据容易丢失。
  • 当一次持久化数据很大的时候,会导致服务器暂停。

## 12_Redis的持久化-AOF持久化机制-[★★]

  • AOF持久化机制的配置

开启AOF持久化
AOF默认是关闭的,首先需要开启AOF模式.

参数配置 说明
appendonly no/yes yes表示开启持久化,no表示关闭,默认是关闭
如果开启会在硬盘上生成一个文件appendonly.aof

AOF 持久化时机

关键字 持久化时机 解释
appendfsync always 每次修改都持久化,效率最低
appendfsync everysec 每秒持久化一次
appendfsync noi 不持久化,效率最高

示例演示-AOF持久化数据

  • 需求:开启AOF机制进行持久化数据测试。

  • 实现步骤:

    1. 开启AOF机制:修改配置文件:redis.windows.conf,将393行修改如下
    appendonly yes
    
    1. 重启redis服务器端:启动的时候指明配置文件启动
    3. 打开DOS命令行窗口,切换到redis安装目录:cd d:/redis
    4. 启动服务器指定配置文件启动,格式:redis-server.exe redis.windows.conf
    	* 此时在服务器目录下出现appendonly.aof文件。大小是0个字节。
    
    1. 启动客户端,添加3个键
      • 打开appendonly.aof文件,查看文件的变化,会发现文件记录了所有操作的过程。
    2. 关闭服务器,再次启动看是否有持久化
  1. AOF执行持久化的机制:每秒执行一次持久化操作。
  2. AOF持久化机制的优点:
  • 因为持久化的频率更高了,所以数据更加安全,更不容易丢失。
  1. AOF持久化机制的缺点:
  • 因为持久化的频率更高了,导致性能低了。
  • 因为日志文件中记录的所有修改的操作,在运行恢复数据过程中效率低。

13_AOF重写机制介绍-[★]

为什么需要AOF重写

​ 为了解决AOF文件体积膨胀的问题,Redis提供了AOF重写功能:Redis服务器可以创建一个新的AOF文件来替代现有的AOF文件,新旧两个文件所保存的数据库状态是相同的,但是新的AOF文件不会包含任何浪费空间的冗余命令,通常体积会较旧AOF文件小很多。

set name jack
set name rose
set name lucy
set name ptg
set name gcw

set name gcw

AOF 文件重写的原理

​ AOF重写并不需要对原有AOF文件进行任何的读取,写入,分析等操作,这个功能是通过读取服务器当前的数据库状态来实现的。

# 假设服务器对键list执行了以下命令
127.0.0.1:6379> RPUSH list "A" "B"
(integer) 2
127.0.0.1:6379> RPUSH list "C"
(integer) 3
127.0.0.1:6379> RPUSH list "D" "E"
(integer) 5
127.0.0.1:6379> LPOP list
"A"
127.0.0.1:6379> LPOP list
"B"
127.0.0.1:6379> RPUSH list "F" "G"
(integer) 5
127.0.0.1:6379> LRANGE list 0 -1
1) "C"
2) "D"
3) "E"
4) "F"
5) "G"
127.0.0.1:6379>
结果分析

​ 当前列表键list在数据库中的值就为[“C”,“D”, “E”, “F”, “G”]。要使用尽量少的命令来记录list键的状态,最简单的方式不是去读取和分析现有AOF文件的内容,,而是直接读取list键在数据库中的当前值,然后用一条RPUSH list “C” “D” “E” “F” "G"代替前面的6条命令。

结论

​ 因为AOF如果记录每一步操作,文件会越来越大,通过AOF的重写,可以缩小AOF文件的尺寸。同样可以达到数据还原效果。

  • AOF重写触发的方式
触发方式 描述
手动触发 通过调用bgrewriteaof手动触发
自动触发 同时满足以下条件就触发自动的AOF重写操作:
1. 没有RDB持久化/AOF持久化在执行,没有bgrewriteaof在进行
2. 当前AOF文件大小要大于redis.conf配置的auto-aof-rewrite-min-size大小
3. 当前AOF文件大小和最后一次重写后的大小之间的比率大于或者等于
指定的增长百分比。
(在配置文件设置了auto-aof-rewrite-percentage参数,不设置默认为100%)

演示-AOF手动重写

  1. 关闭服务器,删除生成的aof和rdb文件

  2. 执行以下命令

1. 从右边添加一个键为list,值为A B
2. 从右边添加 C
3. 从右边添加 D E
4. 从左边弹出一个元素
5. 从左边弹出一个元素
6. 从右边添加元素 F G
7. 显示列表中的所有元素 
  1. 输入命令:bgrewriteaof,则aof被重写

  2. 观察目录下会产生旧的的aof文件

  3. 观察服务器上出现提示

1.5 演示-AOF自动重写

  1. 关闭服务器删除生成的aof和rdb文件

  2. 修改配置文件如下:

    # 大于原来的50%就自动重写
    auto-aof-rewrite-percentage 50
    # 自动重写的最小尺寸
    auto-aof-rewrite-min-size 100b
    
  3. 带配置文件启动服务器: redis-server redis.windows.conf

  4. 执行如下命令:

    1. 从右边添加一个键为list,值为A B
    2. 从右边添加 C
    3. 从右边添加 D E
    4. 从左边弹出一个元素
    5. 从左边弹出一个元素
    6. 从右边添加元素 F G
    7. 显示列表中的所有元素 
    
  5. 观察目录下会产生旧的的aof文件

  6. 观察服务器上出现提示

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值