文章目录
- Redis
-
- 01_NOSQL的概述-[★★]
- 02_为什么要使用NOSQL-[★★]
- 03_Redis的安装和启动-[★★]
- 04_Redis五种数据类型及结构概述-[★★★★★]
- 05_string类型操作命令-[★★★★★]
- 06_hash类型操作命令-[★★★]
- 07_list类型操作命令-[★★★]
- 08_set类型操作命令-[★★★]
- 09_zset类型操作命令-[★★]
- 10_客户端工具使用和redis通用命令-[★★★★★]
- 11_Redis的持久化-RDB持久化机制-[★★]
- ## 12_Redis的持久化-AOF持久化机制-[★★]
- 13_AOF重写机制介绍-[★]
- 14_AOF和RDB常见问题-[★★]
- 15_Jedis的基本使用-[★★★★★]
- 16_Jedis连接池创建和使用-[★★★★★]
- 17_Jedis连接池工具类实现-[★★★★★]
- 18_案例-异步加载联系人-分析和环境准备-[★★★★★]
- 19_案例-异步加载联系人-服务器端实现-[★★★★★]
- 20_案例-异步加载联系人-前端页面实现-[★★★★★]
Redis
01_NOSQL的概述-[★★]
NOSQL:泛指非关系型数据库
02_为什么要使用NOSQL-[★★]
NOSQL的好处:快
1. 解决高并发数据访问问题
2. 解决高海亮数据存储问题
具体表现为对如下问题的解决:
High Performance - 数据库高并发访问
在同一个时间点,同时有海量的用户并发访问。往往要达到每秒上万次读写请求。关系数据库应付上万次SQL查询还勉强顶得住,但是应付上万次SQL写数据请求,硬盘IO就已经无法承受了。
- 如天猫的双11,从凌晨0点到2点这段时间,每秒达到上千万次的访问量。
- 12306春运期间,过年回家买火车抢票的时间,用户不断查询有没有剩余票。
Huge Storage - 高海量数据的存储
数据库中数据量特别大,数据库表中每天产生海量的数据。
类似QQ,微信,微博,每天用户产生海量的用户动态,每天产生几千万条记录。对于关系数据库来说,在一张几亿条记录的表里面进行SQL查询,效率是极其低下乃至不可忍受的。
03_Redis的安装和启动-[★★]
- redis存储数据的格式:键值对形式存储
- 启动redis客户端的可执行程序是:redis-cli.exe
- 启动redis服务器的可执行程序是:redis-server.exe
- redis服务器使用的端口号是:6379
- Redis 安装步骤:
解压即完成安装
注意事项
- 安装目录不要包含中文
- 目录不要太深
- 硬盘需要至少有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启动和停止步骤
- 启动redis
进入redis解压目录:双击redis-server.exe文件- 停止redis
关闭服务器窗口即可停止
04_Redis五种数据类型及结构概述-[★★★★★]
- redis五种数据类型分别是:
string
hash
list
set
zset- 实际开发中主要使用哪种数据类型:string
关于key的定义,注意如下几点:
- 不建议key名字太长,通常不超过1024,如果太长会影响查询的速度。
- 不建议太短,太短会降低可读性。
- 一般在公司,都有统一命名规范
05_string类型操作命令-[★★★★★]
- 往redis存储键值对字符串的命令是:set 键 值
- 从redis中根据键获得值的命令是:get 键
- 从redis中根据键删除键值对的命令是:del 键
- 命令语法
命令 | 说明 |
---|---|
set 键 值 | 添加或修改键值对 |
get 键 | 根据键获得值 |
del 键 | 根据键删除键值对 |
- 命令演示
- 添加一个键为company,值为qingruan
- 再设置一个键为company,值为baidun
- 得到company的元素
- 删除company元素
- 再次删除company看返回值是否相同
- 得到company看返回值是多少
- 执行效果
06_hash类型操作命令-[★★★]
hash类型底层结构对应java的哪种类型?HashMap
- 命令语法
命令 | 说明 |
---|---|
hset 键 字段 值 | 向指定的中添加一对hash类型的字段名和值 |
hget 键 字段 | 取出指定键的指定字段的值 |
hmset 键 字段 值 字段 值 | mulitple,一次向某个键中设置多个字段名和值 |
hmget 键 字段 字段 | 一次从指定的键中得到多个字段的值 |
hdel 键 字段 字段 | 删除一个键中的一个或多个字段 |
hgetall 键 | 得到某个键所有的字段值 |
- 命令演示
- 创建hash类型的键为user,并且添加一个字段为username,值为pkxing
- 向user中添加字段为password,值为12345
- 向user中添加字段为age,值为18
- 分别得到user中的username、password和age的字段值
- 向user中同时添加多个字段和值,birthday 2018-01-01 sex male
- 同时取得多个字段:age 和 sex
- 得到user中所有的字段和值
- 删除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 键 | 得到指定列表的长度 |
- 命令演示
- 向mylist键的列表中,从左边添加a b c三个元素
- 从右边添加one two three三个元素
- 查询所有的元素
- 从右边添加一个重复的元素three
- 删除最右边的元素three
- 删除最左边的元素c
- 获取列表中元素的个数
- 执行效果
08_set类型操作命令-[★★★]
- set数据类型的特点:无序且不可重复
- list类型底层结构对应java的哪种类型:HashSet
- 命令语法
命令 | 行为 |
---|---|
sadd 键 元素 元素 | 向set集合中添加1个或多个元素 |
smembers 键 | 查询指定的集合中所有的元素 |
sismember 键 元素 | 判断指定的元素是否在某个集合中,如果存在返回1,否则返回0 |
srem 键 元素 元素 | remove删除指定的一个或多个元素 |
- 命令演示
- 向myset集合中添加A B C 1 2 3 六个元素
- 再向myset中添加B元素,看能否添加成功
- 显示所有的成员,发现与添加的元素顺序不同,元素是无序的
- 删除其中的C这个元素,再查看结果
- 判断A是否在myset集合中
- 判断D是否在myset集合中
- 执行效果
09_zset类型操作命令-[★★]
- 命令语法
命令 | 描述 |
---|---|
zadd 键 分数 值 分数 值 | 添加1个或多个元素,每个元素都有一个分数 |
zrange 键 开始索引 结束索引 | 获取指定范围的元素,得到所有的元素,索引是0到-1 |
zrem 键 值 值 | 删除一个或多个值 |
zcard 键 | 得到元素个数 |
zrank 键 值 | 得到元素的索引号 |
zscore 键 值 | 得到元素的分数 |
- 命令演示
- 添加键country,分数是10,值是Japan
- 添加键country,分数是5,值是USA,添加键country,分数是50,值是Russian
- 添加键country,分数是1,值是China,分数是120,值是Korea
- 查询country中所有的元素
- 查询Japan的索引号(从0开始)
- 删除值为USA的元素
- 查询country中还有多少个元素
- 显示Russian的分数值
10_客户端工具使用和redis通用命令-[★★★★★]
- 通用命令语法
命令 | 功能 |
---|---|
keys 匹配字符 | 查询当前数据库中由哪些键 * 匹配多个字符 ? 匹配1个字符 |
del 键 1 键 2 | 可以删除任意键,可以一次删除多个键 |
exits 键 | 是否存在指定的键 |
type 键 | 判断指定的键它的值是什么类型,如:string,hash,list,set,none |
select 数据库编号 | 选择指定的数据库,0~15 |
move 键 数据库编号 | 将某个键移动到另一个数据库中,如果另一个数据库中有同名的键,则移动失败。 |
- 命令演示
- 添加字符串name的值为zhangsan
- 显示所有的键
- 显示所有以my开头的键
- 显示所有my后面有三个字符的键
- 添加一个字符串:name2 lisi
- 添加一个list:name3 a b c d
- 显示所有的键
- 一次删除name2和name3这两个键,其中name2和name3是不同的类型,显示所有键
- 分别判断name和name2是否存在
- 分别判断name user myset mylist分别是什么类型
- 切换数据库到15,向15中添加一个name2 wangwu,得到name2的值显示。
- 将15中的name2移到0中
- 切换到数据库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文件中。
-
实现步骤:
- 修改配置文件:redis.windows.conf 的101行,增加如下配置
save 20 3
- 重启redis服务器端:要求启动的时候指明配置文件启动
3. 打开DOS命令行窗口,切换到redis安装目录:cd d:/redis 4. 启动服务器指定配置文件启动,格式:redis-server.exe redis.windows.conf
- 启动客户端,测试在20秒内写入3个键
- 关闭服务器,再次启动看是否有持久化
- RDB执行持久化的机制:在指定时间段内修改了指定数量的键时才执行持久化操作。
- RDB持久化机制的优点
- 因为不是实时持久化,所以效率高。
- 持久化文件中只记录内存中键值对的结果,不会记录对键值对修改的过程。
- RDB持久化机制的缺点
- 因为不是实时持久化,所以数据容易丢失。
- 当一次持久化数据很大的时候,会导致服务器暂停。
## 12_Redis的持久化-AOF持久化机制-[★★]
- AOF持久化机制的配置
开启AOF持久化
AOF默认是关闭的,首先需要开启AOF模式.
参数配置 | 说明 |
---|---|
appendonly no/yes | yes表示开启持久化,no表示关闭,默认是关闭 如果开启会在硬盘上生成一个文件appendonly.aof |
AOF 持久化时机
关键字 | 持久化时机 | 解释 |
---|---|---|
appendfsync | always | 每次修改都持久化,效率最低 |
appendfsync | everysec | 每秒持久化一次 |
appendfsync | noi | 不持久化,效率最高 |
示例演示-AOF持久化数据
-
需求:开启AOF机制进行持久化数据测试。
-
实现步骤:
- 开启AOF机制:修改配置文件:redis.windows.conf,将393行修改如下
appendonly yes
- 重启redis服务器端:启动的时候指明配置文件启动
3. 打开DOS命令行窗口,切换到redis安装目录:cd d:/redis 4. 启动服务器指定配置文件启动,格式:redis-server.exe redis.windows.conf * 此时在服务器目录下出现appendonly.aof文件。大小是0个字节。
- 启动客户端,添加3个键
- 打开appendonly.aof文件,查看文件的变化,会发现文件记录了所有操作的过程。
- 关闭服务器,再次启动看是否有持久化
- AOF执行持久化的机制:每秒执行一次持久化操作。
- AOF持久化机制的优点:
- 因为持久化的频率更高了,所以数据更加安全,更不容易丢失。
- 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手动重写
-
关闭服务器,删除生成的aof和rdb文件
-
执行以下命令
1. 从右边添加一个键为list,值为A B
2. 从右边添加 C
3. 从右边添加 D E
4. 从左边弹出一个元素
5. 从左边弹出一个元素
6. 从右边添加元素 F G
7. 显示列表中的所有元素
-
输入命令:bgrewriteaof,则aof被重写
-
观察目录下会产生旧的的aof文件
-
观察服务器上出现提示
1.5 演示-AOF自动重写
-
关闭服务器删除生成的aof和rdb文件
-
修改配置文件如下:
# 大于原来的50%就自动重写 auto-aof-rewrite-percentage 50 # 自动重写的最小尺寸 auto-aof-rewrite-min-size 100b
-
带配置文件启动服务器: redis-server redis.windows.conf
-
执行如下命令:
1. 从右边添加一个键为list,值为A B 2. 从右边添加 C 3. 从右边添加 D E 4. 从左边弹出一个元素 5. 从左边弹出一个元素 6. 从右边添加元素 F G 7. 显示列表中的所有元素
-
观察目录下会产生旧的的aof文件
-
观察服务器上出现提示