redis

Redis

1. redis的简介

1.1 NoSQL的介绍

在介绍redis之前,我们先来了解一下NoSQL(Not only SQL),不仅仅是SQL。

NoSQL,泛指非关系型的数据库

​ 为什么需要NoSQL,主要应对以下问题,传统关系型数据库的力不从心:

  • 高并发读写(High performance)

  • 海量数据的高效率存储和访问(Huge Storage)

  • 高可扩展性和高可用性(High Scalablility && High Availability)

NoSQL的特点:

1) 易扩展

2) 灵活的数据模型

3) 大数据量,高性能

4) 高可用

NoSQL数据库的四大分类:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rn1FzHbZ-1676778722923)(assets/wps1.jpg)]

NoSQL主流的产品:MongoDB,redis等,目前Redis是最受欢迎的。

Redis的应用的场景:

  • 缓存

  • 任务队列

  • 网站访问统计

  • 数据过期处理

  • 应用排行榜

  • 分布式集群架构中的session分离

1.2 SQL与NoSQL的区别

比较项SQLNoSQL
数据结构结构化非结构化
数据关联关联的无关联的
查询方式SQL查询非SQL
事务特性ACIDBASE
存储方式磁盘内存
扩展性垂直水平
使用场景1.数据结构固定
2.相关业务对数据安全性,一致性要求较高
1.数据结构不固定
2.对一致性,安全性要求不高
3.对性能要求高

1.3 redis简介

Redis诞生于2009年全称是Remote Dictionary Server,远程词典服务器,是一个基于内存的键值NoSQL数据库。

Redis从一开始只支持linux系统,只是后来开始支持window系统. Redis的官方网站: https://redis.io 、中文官方网站:http://www.redis.cn/

特征:

  • 键值(key-value)型,value支持多种不同数据结构,功能丰富
  • 单线程,每个命令具备原子性
  • 低延迟,速度快(基于内存、IO多路复用、良好的编码)。
  • 支持数据持久化
  • 支持主从集群、分片集群,
  • 支持多语言客户端

1.4 redis安装

参考资料的<<安装redis.md>>

2. Redis常见命令

2.1 Redis数据结构介绍

Redis是一个key-value的数据库,key一般是String类型,不过value的类型多种多样

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Vroaoq63-1676778722924)(assets/image-20220920235949352.png)]

Redis为了方便我们学习,将操作不同数据类型的命令也做了分组,在官网( http://www.redis.cn/commands.html )可以查看到不同的命令:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GXbE94Zh-1676778722924)(assets/image-20220921000211438.png)]

也可以使用help命令查询命令:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vRQzZnhy-1676778722925)(assets/image-20220921000716641.png)]

思考:

Redis没有类似MySQL中的Table的概念,我们该如何区分不同类型的key呢?
例如,需要存储用户、商品信息到redis,有一个用户id是1,有一个商品id恰好也是1

key的结构

Redis的key允许有多个单词形成层级结构,多个单词之间用’:'隔开,格式如下:

项目名:业务名:类型:id

这个格式并非固定,也可以根据自己的需求来删除或添加词条。
例如我们的项目名称叫 shop,有user和order两种不同类型的数据,我们可以这样定义key:

  • user相关的key:shop:user:1
  • order相关的key:shop:order:1

2.2 Redis的数据结构之字符串

​ String 是redis最基本的数据结构,你可以理解成与Memcached一模一样的类型,一个key对应一个value。String类型是二进制安全的,意思就是redis的String可以包含任何数据。比如jpg图片或者序列化的对象,String类型是Redis最基本的数据结构,String类型的值最大能存储512MB。

存储String常用命令:

1) 赋值

使用set key value 的语法

例如:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T6A6OBNu-1676778722925)(assets/wps1-1663690098002.jpg)]

  • SETNX:添加一个String类型的键值对,前提是这个key不存在,否则不执行

  • SETEX:添加一个String类型的键值对,并且指定有效期

2) 取值

使用get key方式获取值

例如:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PJGWKWoi-1676778722926)(assets/wps2.jpg)]

3) 删除

使用del key方式删除

例如:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zrpCsrEa-1676778722926)(assets/wps3.jpg)]

也可以一次性删除多个key

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H6An8q3o-1676778722927)(assets/wps4.jpg)]

4) 数值增减

  • incr 自增 默认没有定义的key,对应的value默认为0 加1

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EmvwjquI-1676778722928)(assets/wps5.jpg)]

​ 如果key对应的value不是一个整数,使用incr会报错:

​ [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ezJSP6PA-1676778722928)(assets/wps6.jpg)]

  • decr 自减 与自增很相似 减1

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SfYD8S8x-1676778722929)(assets/wps7.jpg)]

5) 扩展命令

  • incrby 指定增量值

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gq8uf9LM-1676778722929)(assets/wps8.jpg)]

  • decrby 指定减量的值

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CvWOjAHU-1676778722930)(assets/wps9.jpg)]

  • append 追加字符串,如果没有定义,直接赋值

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4bbyY5B3-1676778722930)(assets/wps10.jpg)]

  • keys *查看redis的所有的key

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g9OQvQb1-1676778722930)(assets/wps11.jpg)]

2.3 Redis的数据结构之哈希

存储的value是一个hash结构,而hash结构就是一个String key和String value组成的map容器。Hash特别适合用于存储对象, Redis中每个hash可以存储232-1键值对(4294967295)。

String结构是将对象序列化为JSON字符串后存储,当需要修改对象某个字段时很不方便:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z0tFohWe-1676778722931)(assets/image-20221216223500293.png)]

Hash结构可以将对象中的每个字段独立存储,可以针对单个字段做CRUD:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7EIdWOm4-1676778722931)(assets/image-20221216223517649.png)]

​ 存储Hash常用的命令:

  1. 赋值
  • 存储单个字段 hset key fieldname fieldValue

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zMFbGnD4-1676778722931)(assets/wps12.jpg)]

如上代码,表示往redis存储了一个user, user的name的属性对应的值为zhangsan

  • 存储多个字段hmset key fieldname1 fieldValue1 fieldname2 fieldValue2…

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pzJFkhLH-1676778722932)(assets/wps13.jpg)]

HSETNX:添加一个hash类型的key的field值,前提是这个field不存在,否则不执行

  1. 取值
  • 获取指定key的指定的属性的值 hget key fieldName

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f0yy5Iy3-1676778722932)(assets/wps14.jpg)]

  • 获取指定key的多个属性值 hmget key fieldName1 fieldName2…

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bcGh0BjT-1676778722932)(assets/wps15.jpg)]

  • 获取指定key的所有属性名和属性值 hgetall key

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-apQ3sxKw-1676778722932)(assets/wps16.jpg)]

  1. 删除
  • 删除指定key的一个属性或者多个属性 hdel key fieldName1 [fieldName2 …]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YE6ZvVLy-1676778722933)(assets/wps17.jpg)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uq8KaksK-1676778722933)(assets/wps18.jpg)]

  1. 增加数字
  • hincrby 给某个属性值为整数的属性增加 hincrby key fieldname 增量

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SFaBLP9D-1676778722933)(assets/wps19.jpg)]

  1. 判断key是否存在
  • 判断某个key对应的属性是否存在, 1表示存在,0表示不存在 hexists key fieldname

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aFm9ib3t-1676778722934)(assets/wps20.jpg)]

  1. 获取hash属性的个数
  • 获取hash的属性的个数: hlen key

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oEiJGOli-1676778722934)(assets/wps21.jpg)]

  1. 获取hash所有属性
  • 获取所有属性的属性名 hkeys key

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DOybxcfd-1676778722934)(assets/wps22.jpg)]

  • 获取所有的属性的值 hvals key

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8NZ2V5td-1676778722935)(assets/wps23.jpg)]

2.4 Redis的数据结构之List

​ Redis列表是简单的字符串列表,插入顺序排序,你可以添加一个元素到列表的头部(左边)或者尾部(右边),一个列表最多可以包含2的32方 – 1个元素。

常用来存储一个有序数据,例如:朋友圈点赞列表,评论列表等

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hupKk4Td-1676778722935)(assets/image-20221216175645226.png)]

存储List常用的命令

  1. 两端添加
  • 从左边开始添加 lpush key value1 value2 …

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Iwro77PY-1676778722935)(assets/wps24.jpg)]

  • 获取指定范围的集合元素 lrange key 开始下标 结束下标 注意:-1表示最后下标

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mDNzctIH-1676778722935)(assets/wps25.jpg)]

  • 从右端开始添加元素(我们比较习惯这种方式) rpush key value1 value2…

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0yic8CWs-1676778722936)(assets/wps26.jpg)]

  • 往list集合头部插入元素 lpushx key value

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VReteJKt-1676778722936)(assets/wps27.jpg)]

  • 往list集合尾部插入元素 rpushx key value

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nye8f4GP-1676778722937)(assets/wps28.jpg)]

  1. 两端弹出
  • 从list左侧(头部)弹出集合元素 lpop key 删除头部元素

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q5mJryvD-1676778722937)(assets/wps29.jpg)]

  • 从list 右侧弹出集合元素 rpop key 删除尾部元素

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AELTeCoE-1676778722937)(assets/wps30.jpg)]

  • 查看list集合的元素的个数 llen key

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q632ii7y-1676778722937)(assets/wps31.jpg)]

  • 从list集合的指定的方向删除指定个数的指定元素 lrem key count value

注意: count 表示删除多少个 如果为正数 表示从左边开始,负数表示从右边开始, 0表示删除所有

从左侧删除2个3:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RvNkdc4w-1676778722938)(assets/wps32.jpg)]

从list右侧删除2个2

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BarnPDRZ-1676778722938)(assets/wps33.jpg)]

删除所有的1

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gkoAVW0Y-1676778722938)(assets/wps34.jpg)]

  • 修改指定下标上的值 lset key index value

注意: index 表示下标,从0开始

把下标为2的元素修改为hello

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yitGBh5i-1676778722939)(assets/wps35.jpg)]

  • 在指定位置插入指定的元素: linsert key before/after value1 value2

注意: before 表示在value1之前插入value2

after 表示在value1之后插入value2

在hello元素之前插入 me

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CHCra8NS-1676778722939)(assets/wps36.jpg)]

在hello之后插入world

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SjGoqCZx-1676778722939)(assets/wps37.jpg)]

  • 把某个集合的尾部元素弹出并插入到另外一个集合的头部

rpoplpush key1 key2

​ 比如把l1集合的尾部元素弹出,并插入到l2集合的头部

​ [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3y7Z7BL7-1676778722939)(assets/wps38.jpg)]

2.5 Redis的数据结构之Set

Set与list类型不同的是,set集合中不允许出现重复的元素,set集合最大可以存储2的32方-1个元素. Set集合使用的场景, 就是在跟踪一些唯一数据.

Set集合常用的方法:

  • 添加set元素 sadd key value1 value2 ….

添加一个set1的集合,该集合包含a,b,c 3个元素

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aKvCAltd-1676778722940)(assets/wps39.jpg)]

  • 查看set集合的元素 smembers key

查看set1集合的元素

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NejhP9i7-1676778722940)(assets/wps40.jpg)]

  • 删除set集合中的元素 srem key value1 value2 …

删除set1集合的a元素

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6sR4jhmz-1676778722940)(assets/wps41.jpg)]

  • 判断set集合中某个元素是否存在, 返回1表示存在, 返回0表示不存在 sismember key value

判断set1集合中是否包含b

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TEwrPnYy-1676778722941)(assets/wps42.jpg)]

  • 计算多个集合的差集 sdiff key1 key2 …

注意:上述命令表示,统计出元素在key1存在,但是不存在key2的元素

​ 统计在set2存在,但是不存在与set3的元素:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SRIJiuNI-1676778722941)(assets/wps43.jpg)]

统计在set3存在,但是不存在与set2的元素:

​ [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HQAYXWQG-1676778722941)(assets/wps44.jpg)]

注意: sdiff 集合的位置不一样,得到的结果也不一样.

  • 计算多个集合的交集, sinter key1 key2 …

统计set2,set3的交集(即存在与set2,又存在与set3的元素)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ke0qmhMz-1676778722942)(assets/wps45.jpg)]

  • 计算多个集合的并集 sunion key1 key2 …

统计set2和set3集合的并集

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3NzEI3lL-1676778722943)(assets/wps46.jpg)]

  • 计算集合的元素的个数: scard key

统计set2集合的元素个数:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rPN0ANxQ-1676778722943)(assets/wps47.jpg)]

  • 把多个集合的差集存储到一个新的集合中 sdiffstore 新集合名 集合1 集合2…

把set2,set3的差集保存到n1集合:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-clttsQr6-1676778722943)(assets/wps48.jpg)]

  • 把多个集合的交集结果存储到新集合 sinterstore 新集合名 集合1 集合2….

把set2,set3集合的交集保存到n2集合中:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fi6lxc5t-1676778722944)(assets/wps49.jpg)]

  • 把多个集合的并集结果存储到新集合 sunionstore 新集合名 集合1 集合2 …

把set2和set3的并集的结果存储到n3集合中:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wMNH01na-1676778722944)(assets/wps50.jpg)]

2.6 Redis的数据结构之sorted-set/ZSet

Sorted-Set与Set的区别在于:Sorted-Set中的成员在集合中的位置是有序的. Sorted-Set集合使用的场景是:大型在线游戏积分排行榜.

  • 添加元素,包括评分和值, zadd key score1 value1 score2 value2…

添加集合sort1,该集合的元素是a,b,c.对应的评分为 5,4,6

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KLlqvWCT-1676778722944)(assets/wps51.jpg)]

注意:

  1. sorted-set集合的默认排序是按照评分的升序排序

  2. 如果我们继续给集合添加元素,如果集合的元素已经存在,则覆盖,如果元素不存在,那这个元素就添加进去.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SObM2BJY-1676778722945)(assets/wps52.jpg)]

  • 查找元素: zrange 开始下标 结束下标

注意: -1表示最后一个 默认是评分的升序排序

查找sort1的所有元素:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vRzTm2JE-1676778722945)(assets/wps53.jpg)]

如果想把元素的评分也打印出来, 则在后面添加withscores

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GHRTiEEU-1676778722945)(assets/wps54.jpg)]

  • 删除元素 zrem key value1 value2 ….

删除sort1集合中的b元素

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yHCeDUdY-1676778722945)(assets/wps55.jpg)]

  • 查看集合的元素个数 zcard key

查看sort1集合的元素个数:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6LsV4yYh-1676778722946)(assets/wps56.jpg)]

  • 降序打印集合元素

zrevrange key 开始下标 结束位置 [widthscores]

把sort1集合的元素降序输出:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lTAaBO6M-1676778722946)(assets/wps57.jpg)]

  • 根据具体评分范围来删除元素

​ zremrangebyscore key min max

**注意:** min 表示最小评分, max表示最大评分, 包括最小和最大评分

​ 删除sort1集合评分在8-12之间的所有元素:

​ [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Kxi5aJ45-1676778722946)(assets/wps58.jpg)]

  • 根据评分范围来查找元素

zrangebyscore key min max [withscores] [limit 开始 个数]

注意:

  1. withscores 表示输出评分

  2. limit 用于分页 序号从0开始

​ 查询sort1集合中评分在 4-10之间的元素:

​ [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jJbjjaAt-1676778722947)(assets/wps59.jpg)]

​ 查询sort1集合中评分在 4-10之间的元素:并且输出评分:

​ [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hVrWduDC-1676778722947)(assets/wps60.jpg)]

​ 查询sort1集合中评分在4-10之间的元素,并且进行分页

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vhpkphLZ-1676778722947)(assets/wps61.jpg)]

  • 给指定的元素加分 zincrby key score value

给sort1集合的c元素加4分

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qnwEWzhs-1676778722947)(assets/wps62.jpg)]

  • 查找指定评分范围的元素个数: zcount key min max

查找sort1集合中评分在4-10之间的元素个数:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yCBoqZ8Z-1676778722948)(assets/wps63.jpg)]

2.7 redis keys的通用操作

  • 显示所有的key keys *

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wWYMtDrf-1676778722948)(assets/wps64.jpg)]

  • 查找以指定字符开头 keys 指定字符串*

查找以s开头的

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ERg9gYTQ-1676778722948)(assets/wps65.jpg)]

  • 查找以指定字符串开头,后面紧跟任意一位字符 keys 指定字符串?

查找以n开头,后面紧跟一位任意字符:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yQcYbPK5-1676778722949)(assets/wps66.jpg)]

  • 删除 指定的key del key1 key2…

删除n1 n2 n3

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sKAzkkSe-1676778722949)(assets/wps67.jpg)]

  • 判断key是否存在 1表示存在 0表示不存在 exists key1 key2…

判断n1是否存在,判断set1是否存在:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qtikLGox-1676778722949)(assets/wps68.jpg)]

  • 对key重命名: rename oldKey newKey

把set1的名字设置为set4

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JezBDB33-1676778722950)(assets/wps69.jpg)]

  • 设置key的有效时间 expire key time

注意: 以秒作为单位

设置set4 的有效时间为10s

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7BC2630N-1676778722950)(assets/wps70.jpg)]

  • 查看key的剩余有效时间 ttl key

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KsFAlA4F-1676778722950)(assets/wps71.jpg)]

注意: -2表示该key不存在

  • 显示key的类型 type key

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CFzNpL5u-1676778722951)(assets/wps72.jpg)]

  • 删除redis中所有的key flushall

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9Rkcfxyb-1676778722951)(assets/wps73.jpg)]

3. Redis的持久化

​ Redis的数据都是存储在内存中,为了数据的永久保存,需要把数据同步到硬盘上,这个过程就叫做持久化. Redis的持久化存在有两种方式: rdb方式,aof方式,这两种方式可以单独使用,也可以综合使用.

  1. rdb持久化方式: 是在指定的时间间隔写入硬盘

  2. aof持久化方式:是以日志,记录每一个操作,服务器启动后,根据日志来构建数据.

3.1 redis持久化之RDB方式

​ RDB:在指定的时间间隔内将内存中的数据集快照写入到磁盘,也就是行话说的snapshot快照,它在恢复时是将快照文件直接读取到内存.

​ Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件,整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能,如果需要进行大规模的快照,且处于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效.RDB的缺点就是最后一次持久化后的数据可能丢失.

RDB方式是redis默认支持的,它的优劣如下:

​ 优势: 只有一个文件,时间间隔的数据,可以归档为一个文件,方便压缩和转移

​ 劣势: 如果宕机,数据损失比较大,因为它是每隔一个时间段进行持久化操作的,也就是积累的数据比较多,一旦宕机,就彻底懵逼了.

我们先查看redis的配置文件:redis.conf文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PxRQsNsk-1676778722951)(assets/image-20220922053610349.png)]

找到如下位置:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8LdAXMLD-1676778722952)(assets/wps2-1663795252361.jpg)]

这是就是RDF的持久化策略:

1) save 900 1 表示每900秒内至少有一个key发生变化,就持久化

2) save 300 10 表示每300秒内至少有10个key发生变化,就持久化

3) save 60 10000 表示每60秒至少有10000个key发生变化,就持久化

再往下拉,找到下图的位置:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OlVpIviB-1676778722952)(assets/wps3-1663795252362.jpg)]

上图的dbfilename配置表示持久化的文件是 dump.rdb

继续往下拉,找到下图位置:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Pi1xDZwa-1676778722952)(assets/wps4-1663795252362.jpg)]

dir ./ 表示文件存储的路径就是当前目录,也就是在redis安装包下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sSehbVPC-1676778722952)(assets/image-20220922054031091.png)]

接下来我们来模拟实验rdb进行数据的备份和还原:

1) 我们首先添加几个key,如下图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TJE59lpm-1676778722953)(assets/wps6-1663795252362.jpg)]

2) 我们把redis关闭

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-udvSdMOn-1676778722953)(assets/wps7-1663795252363.jpg)]

3) 我们重新启动redis,登录到redis客户端,查看所有的key

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QCBWkPHz-1676778722954)(assets/wps8-1663795252363.jpg)]

我们发现之前添加的数据已经加载进来了。说明redis默认是使用RDB进行持久化的。

备份数据,我们只需要把dump.rdb文件拷贝到另外一个位置,

还原数据:只需要把dump.rdb文件拷贝到redis的安装目录下就可以了,重启redis就可以了。

3.2 redis持久化之AOF方式

​ AOF: 以日志的形式来记录每个写操作,将redis执行过的所有写指令记录下来(不会记录读指令),只许追加文件但是不可以改写文件,redis启动之初会读取该文件(appendonly.aof)重新构建数据,换而言之:redis重启的话就是根据日志文件的内容将写指令从头到尾执行一次,以完成数据的恢复工作.

AOF方式,以日志记录每一个操作。Redis可以通过日志去还原数据。

优势: 安全性相对RDB方式高很多,它记录了每一个操作

劣势:效率相对于RDB方式低很多。

Redis默认是关闭AOF方式的。

我们查看redis的配置文件,找到下图的位置:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uwV7sX37-1676778722954)(assets/wps9-1663795252363.jpg)]

appendonly no 默认关闭aof方式,我们修改为yes就开启

appendfilename 就是aof方式的日志文件

再往下拉:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m1Sg6His-1676778722954)(assets/wps10-1663795252363.jpg)]

上图的配置是aof的三种同步策略:

always 同步持久化,每次发生数据变更会被立即记录到磁盘 性能较差但数据完整性比较好

everysec 异步操作,每秒记录 如果一秒内宕机,有数据丢失

no 表示不同步

我们修改成always,保存退出

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P0zodY8w-1676778722955)(assets/wps11-1663795252363.jpg)]

再重启redis服务器, 往redis放几个key

需要注意的时,到时候appendonly.aof文件保存的位置在SNAPSHOTTING模块下dir配置项指定的位置,或者在redis中输入 config get dir 命令也能

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tjRxDxLQ-1676778722955)(assets/image-20220922061057430.png)]

备份: 我们只需要把appendonly.aof文件拷贝到其他存储设备中,

还原:我们只需要把appendonly.aof文件拷贝到redis目录下

注意:

假如在写入aof文件时机器挂掉了,则aof文件中的内容肯定存在错误,或者说aof文件被破坏了,那么就必修现将aof文件修复,在/urs/local/bin目录下有个redis-check-aof,可以用它修复

redis-check-aof --fix aof文件
3.2.1 aof重写机制

原理

​ AOF采用文件追加方式,文件会越来越大为避免出现此种情况,新增了重写机制,当AOF文件的大小超过所设定的阈值时,Redis就会启动AOF文件的内容压缩,只保留可以恢复数据的最小指令集。
AOF文件持续增长而过大时,会fork出一条新进程来将文件重写(也是先写临时文件最后再rename),遍历新进程的内存中数据,每条记录有一条的Set语句。重写aof文件的操作,并没有读取旧的aof文件,而是将整个内存中的数据库内容用命令的方式重写了一个新的aof文件,这点和快照有点类似

触发条件

​ 在 APPEND ONLY MODE模块下有两条默认配置:

在这里插入图片描述

​ 这两条配置就是触发重写aof文件的条件,第一个表示文件大小达到前一次保存文件的一倍,第二个表示aof文件大小最少达到64MB,两个条件必须同时满足。

4. Redis的Java客户端

在Redis官网中提供了各种语言的客户端,地址:https://redis.io/clients

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-680oH2Tm-1676778722955)(assets/image-20221216172953885.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6QMADUuj-1676778722956)(assets/image-20221216173012858.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZBL6Z0pz-1676778722956)(assets/image-20221216173102127.png)]

4.1 Jedis

Jedis的官网地址: https://github.com/redis/jedis,我们先来个快速入门:

  1. 引入依赖:
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>4.3.0</version>
</dependency>
  1. 建立连接

    private Jedis jedis;
    @Before
    public void setUp() {
        // 建立连接   
        jedis = new Jedis("192.168.145.133", 6379);   
        // 设置密码    
        jedis.auth("123");    
        // 选择库   
        jedis.select(0);
    }
    
    
  2. 测试string

@Test
public void test1() {
// 插入数据,方法名称就是redis命令名称,非常简单
String result = jedis.set(“name”, “张三”);
System.out.println("result = " + result);
// 获取数据
String name = jedis.get(“name”);
System.out.println("name = " + name);
}

```
  1. 释放资源

    @After
    public void tearDown() {
         // 释放资源
        if (jedis != null) {
            jedis.close();
        }
    }
    

jedis的连接池:

Jedis本身是线程不安全的,并且频繁的创建和销毁连接会有性能损耗,因此我们推荐大家使用Jedis连接池代替Jedis的直连方式。

public class JedisConnectionFactory {
   private static final JedisPool jedisPool;
   static {
       JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
       // 最大连接
       jedisPoolConfig.setMaxTotal(8);
       // 最大空闲连接
       jedisPoolConfig.setMaxIdle(8);
       // 最小空闲连接
       jedisPoolConfig.setMinIdle(0);
       // 设置最长等待时间, ms
       jedisPoolConfig.setMaxWaitMillis(200);
       jedisPool = new JedisPool(jedisPoolConfig, "192.168.145.133", 6379,                1000, "123");
   }
   
   // 获取Jedis对象
   public static Jedis getJedis(){
       return jedisPool.getResource();
   }
}

// 释放资源
if (jedis != null) {
jedis.close();
}
}


jedis的连接池:

>Jedis本身是线程不安全的,并且频繁的创建和销毁连接会有性能损耗,因此我们推荐大家使用Jedis连接池代替Jedis的直连方式。
>
>```java
>public class JedisConnectionFactory {
>    private static final JedisPool jedisPool;
>    static {
>        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
>        // 最大连接
>        jedisPoolConfig.setMaxTotal(8);
>        // 最大空闲连接
>        jedisPoolConfig.setMaxIdle(8);
>        // 最小空闲连接
>        jedisPoolConfig.setMinIdle(0);
>        // 设置最长等待时间, ms
>        jedisPoolConfig.setMaxWaitMillis(200);
>        jedisPool = new JedisPool(jedisPoolConfig, "192.168.145.133", 6379,                1000, "123");
>    }
>    
>    // 获取Jedis对象
>    public static Jedis getJedis(){
>        return jedisPool.getResource();
>    }
>}
>
>```
>
>

后期我们将使用SpringBoot整合lettuce
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值