| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> Redis 6 知识点总结 -> 正文阅读 |
|
[大数据]Redis 6 知识点总结 |
Redis 6 知识点总结什么是 NoSQL 数据库?技术发展技术的分类我们学习过很多的技术,但根据技术的功能可以分为以下几种: 功能型技术:解决基础的功能,没有它们根本完成不了项目。例如 JavaSE,HTML 等。 Web 开发分类Web 1.0 时代 出现的问题:服务器要处理大量的数据,导致CPU及内存压力过大,数据库要频繁写入,导致IO压力过大。 但这个方案会带来另一个问题:如何实现共享 Session ?我们知道,Session 存储在服务器中,那么当一个用户1访问服务器 A 时,将 Session 信息存储在服务器 A 中,那么下次,他发起请求被分到 服务器 B 处理,这个时候 B 并没有用户的 Session。 解决方案一:使用 cookie 存储。 各种数据库对比NoSQL 数据库NoSQL 数据库是指非关系型数据库,存储时以键值对存储,不遵循 SQL 标准,不支持 ACID,性能远超 SQL 。 NoSQL 是一类数据库的总称,包括 Redis 、 Memeache 、 MongoDB 等。 Memcache 和 Redis 的区别?Memcache 是比较早期的 NoSQL 数据库,数据存储在内存中,不支持持久化,数据以键值对存储,但类型单一(只支持 String )。 其它数据库1、行式数据库 Redis 简介与安装Redis 简介引入了 NoSQL 的概念之后,我们来了解一下什么是 Redis ?
Redis 应用场景1、配合关系型数据库做高速缓存 2、利用 Redis 多样的数据结构做特殊的功能 Redis 的下载1、打开 Redis 的官网 官方只提供 Linux 版本的 Redis,想要下载 Windows 版本可以通过到微软的专门开发组织那里下载,地址如下:https://github.com/MicrosoftArchive/redis Redis 的安装如果目前是在 Windows 系统下操作,我们可以先连接远程 Linux 服务器(也可以通过连接虚拟机等),接着将压缩文件上传到服务器的任意位置(只是一个压缩包,放哪里都可以)。假设我们现在把压缩包放在 1、检查是否有 C 语言的编译环境
2、如果提示没有找到命令,那么说明没有安装,这个时候就需要安装 C 语言的编译环境(需要连网)(安装完成后可以使用1中的命令检查是否安装完成)
3、解压压缩文件
4、解压完成后会生成一个
5、因为刚刚下载好了 C 的编译环境,现在可以用 make 命令进行编译成 c 文件啦~(如果报错的话,先执行 make distclean 再执行 make 命令)
6、进行安装(安装成功后,默认会安装到
7、进入该目录
8、显示文件列表(可以看到有各种 redis 文件,表示安装成功)
Redis 的启动Redis 前台启动(不推荐)缺点:一旦关闭窗口,Redis 就会关闭
启动后默认端口:6379 Redis 后台启动优点:关闭窗口,Redis 仍然是启动状态
2、将该文件复制到
3、来到
4、修改 进入该文件
定位
进入编辑模式进行修改
修改后按 esc 进入命令行模式 保存并退出
5、进入到
6、启动后可以查看 redis 进程
可以看到已经启动了,并且默认的端口是 6379
8、关闭客户端
9、关闭 Redis 服务
方式二:不在客户端状态下
Redis 的相关知识1、Redis 默认有几个数据库?
2、Redis 的单线程+多路 IO 复用技术 串行:类似羊肉串,一个一个的吃 Redis 常用五大数据类型Redis 中对键(key)的操作查看当前库中的所有 key
判断某个 key 是否存在,返回1表示存在,0表示不存在
判断某个 key 是什么类型(返回 string等等)
删除指定的某个 key
根据 value 选择非阻塞删除(效果同上,可以删除键值对,但是是先将 key 先从 keyspace 元数据中删除,真正的删除会在后续异步操作)
为给定的 key (该键值对已经存在)设置过期时间为10秒钟
查看指定的 key 还有多少秒过期,-1表示永不过期,-2 表示已经过期
切换数据库
查看当前数据库的key数量
清空当前库
清空所有库
Redis 中 String 类型简介格式: 常见命令添加键值对(键已经存在时会更新值得内容,不存在则会创建键值对)
按照键查找值,返回值
在某个键值对的值后面追加(例如有个键值对 k1 5,追加 append k1 7,该键值对就会变成 k1 57)
根据键返回值的长度
添加键值对(键不存在时会创建键值对,存在则什么都不做)
将 key 中存储的数字值 + 1
将 key 中存储的数字值 - 1
将 key 中存储的数字值 + 步长
将 key 中存储的数字值 - 步长
注意:由于 Redis 是单线程的,所以 Redis 单命令的操作具有原子性(注意:这里的原子性和事务的原子性不是一个概念),因此 Redis 的 incrby 命令自增时是原子性的,对比 Java 中的 i++ 操作,在多线程情况下不具备原子性(经典案例:对于变量 a = 0,线程1执行a+=100,线程2执行a+=100,结果a的值<=100)。 同时设置多个键值对
根据多个键获取多个值
同时设置多个键值对(只有该键值对不存在时才会设置。并且具有原子性,一个创建失败那就全部失败)
获取某个键值对的值的一部分
设置指定位置的值
设置键值对,并赋予过期时间(与之前不同,现在时一步操作),过期时间单位是秒
根据键获取值,并修改值(此时会返回旧值,然后更新新值,之后再执行 get 就会返回新值)
Redis 中 List 类型简介特点:单键多值 ,多值部分为一个有序可重复列表 List List 底层的数据结构1、当 List 中数据量较少的时候,这些数据会存储在一块连续的内存中,我们把这块连续的内存叫做 压缩列表 ZipList 常见命令根据键向列表左边插入一个或多个值
根据键向列表右边插入一个或多个值
根据键从列表左边吐出一个或多个值
根据键从列表右边吐出一个或多个值
从键1列表的右边吐出一个值,插入到键2的左边
按照索引获取一个键中的元素(从左到右)
按照索引获取某个键对应列表的该下标元素
获取列表的长度
在某个值的前面插入新值
在某个值的后面插入新值
删除列表左边的 n 个该值
将列表下标为 该索引 的值替换为新值
注意:所有操作 list 的过程中,如果某个 list 的值的个数已经为0,那么这个键值对就不存在了 Redis 中 Set 类型简介特点:单键多值 ,多值部分为一个无序不可重复集合 Set 常见命令添加一个或多个值到一个 set 中(由于不可重复的特点,已经存在的元素则会忽略)
取出一个 set 中的所有值
判断 set 中是否含有指定的值,有返回1,没有返回0
返回 Set 中元素个数
删除集合中的指定元素
随机从集合中吐出一个值(会删除)
随机从集合中取出 n 个值(不会删除)
把集合1中的某个值移动到另一个集合2(移出的那个集合1会删除掉该值)
返回两个集合的交集元素
返回两个集合的并集元素
返回两个集合的差集元素(即键1中有的,但键2 中没有的)
Redis 中 Hash 类型简介特点:单键多值 ,多值部分为一个 Map 结构,因此,整个 key - value 类似 Java 中的 Map<String,Object>。 所以,特别适合用于存储 Java 对象。例如:登录时需要存储用户信息,我们可以把用户信息封装成一个对象(包括姓名、年龄、电话等),然后将用户的唯一标识(一般为用户 ID )存储为 key ,将封装的对象存储为 value。 底层:value 为 固定值的哈希表,因此,Set 具有 哈希表的特点,例如:添加,删除,查找的效率都是 O(1)。 Hash 底层的数据结构当 field - value 长度较短且个数较少时,会使用 ZipList(压缩列表);否则,会使用 HashTable(哈希表)。 常见命令Hash 类型的一个键值对如下图,一个键中的一个字段叫做 field(领域)。
给一个键添加一个 field 并赋值(已经存在该领域则会更新值)
给一个键添加一个 field 并赋值(已经存在该领域则不会执行)
取出一个键中的一个领域
给一个键批量添加 field
查看某个 领域 是否存在于某个键中
列出一个键中的所有领域
列出一个键中的所有值
为指定键指定领域的值加上指定增量
Redis 中 Zset(Sorted Set) 类型简介==特点:单键多值,多值部分为一个有序不可重复集合,有序是通过维护一个 score (分数)来实现,根据分数的大小进行排序。==所以,Zset 适合做排行版功能。 Zset 底层的数据结构底层的数据结构: Hash + 跳跃表 实现。 前面学到,Hash 的 field 是不重复的,正好对应 Zset 的值,而 field 对应的 值,正好对应 Zset 的分数。而跳跃表主要用于实现排序和根据分数范围获取元素等功能。 普通有序链表: 常见命令将一个或多个元素及其分数添加到一个 key 中
返回一个 key 中,下标在 开始索引 到 结束索引 之间的值(按照从小到大排序,可以在后面加上
返回一个 key 中,下标在 开始索引 到 结束索引 之间的值(按照从大到小排序,可以在后面加上
返回一个 key 中,分数在 指定的较小分数 和 指定的较大分数 之间的元素,并按照分数从小到大排序(包括分数为 指定的较小分数 和 指定的较大分数 的值)
返回一个 key 中,分数在 指定的较大分数 和 指定的较小分数 之间的元素,并按照分数从大到小排序(包括分数为 指定的较大分数 和 指定的较小分数 的值)
为指定键的指定值的分数加上增量
删除这个 key 下指定值的元素
统计这个 key 中,指定分数区间内的元素个数
返回这个值在这个 key 中的排名(从 0 开始)
Redis 发布和订阅频道:类似生活中的电视台
操作方法:
3、发布者发布消息 hello 到 channel1
4、订阅者收到消息 Redis 中的新数据类型Bitmaps简介
缺点:例如我现在的用户 id 是1万,如果我将 id 作为偏移量进行存储,且我只有一个用户时,前面的九千多个位存着 0 实际上时浪费的,这个时候可以选择不用 Bitmaps ,或者将 id 减少 9999 ,然后再存储。
常用命令设置 Bitmaps 中某个偏移量的值为 0 或 1。(偏移量可以理解为数组下标,从 0 开始)。
获取 Bitmaps 中某个偏移量的值(返回 0 或 1)
统计 Bitmaps 被设置为 1 的 bit 数,可以指定统计区间(注意:统计区间是按照字节来算的,从 0 开始)
set 与 Bitmaps 对比当有一组数据只需要存储两种状态(例如:签到、是否访问、男女…),且数据量很大,并且数据量比较密集时,用 Bitmaps 存储效率高于 set;其余情况 set 效率高于 Bitmaps。 例如:假如一个网站的用户巨多,并且要统计是否访问过这个网站,看起来可以使用 Bitmaps 记录每天的访问情况,但如果这个网站日活跃量不高,比如 1000 万 的用户量一天只有10万人访问,那么这个用 id 作为偏移量的存储方式需要存储大量的 0 数据,空间效率其实很低。 HyperLogLog简介基数: 给定一组数据,将这组数据去重后剩下的值的个数叫做基数。 HyperLogLog 可以用于统计一组数据的基数的个数,一般可用的场景就是去重。 使用场景: 对比其它解决方案: 但使用 HyperLogLog 的优点是:当数据量非常大的时候,计算基数的空间总是固定的,并且很小。在 Redis 中,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算出 2^64个不同元素的基数,而 set 则数据量越多消耗的内存就越多。 命令添加一个元素到 HyperLogLog 中
计算一个或多个键(多个时返回合在一起的结果)的基数值
将一个或多个键(来源键)合并后存储在另一个键(目标键)中
Geospatial简介:主要是用于存储地理信息(即经纬度) 常用命令添加一个地理位置(经度 纬度 地点)
获取指定地区的坐标值
获取两个位置之间的直线距离(默认为米)
以给定的经纬度为中心,找到半径在指定值内的地点(可用于查找附近的人)
Redis 事务Redis 事务的简介、执行流程、错误处理Redis 事务在执行的过程中,不会被其它客户端发送过来的命令所打断。主要作用是串联多个命令防止别的命令插队。 Redis 执行事务的流程三个主要命令及两个主要过程: 组队过程中放弃组队演示案例: 执行过程中出现错误的情况:(如果组队的过程没有出错,但是在执行的过程中某个命令出现了错误,那么只有出错的命令不会被执行,其它命令都会执行。)
Redis 事务的冲突问题悲观锁每次去拿数据都会上锁,直到操作完成才会释放锁,这个过程别人拿不了数据。 乐观锁每次去拿数据不上锁,如果有更新数据时发现现在的版本号和数据库中的版本号不一致,则不更新;如果发现版本号一致,则会更新数据,并更新版本号。 Redis 中的锁Redis 是单线程的,并且单个操作具有原子性,因此执行单个操作的时候并不会有线程安全的问题。但是当我们并发地执行多个事务地时候,我们就需要考虑对操作地数据进行上锁。 Redis 中加锁是通过 实操演示: Redis 事务的三特性
Redis 超卖问题Redis 准备好以下数据 但在并发情况下,会出现两个问题:
以上示例解决了 Redis 事务在并发情况下的"超卖"问题,但实际上上面的代码还会出现一个问题:当并发数比较高时,会出现滞销现象。 解决方法:我们知道,问题的根本是 Redis 使用的是乐观锁的机制,那么只能通过 lua 脚本来实现。 Redis 持久化操作Redis 的特点之一就是支持持久化。Redis 持久化的方式主要有两种,分别是 RDB 和 AOF。Redis 的数据是存在内存中的,持久化技术可以让内存中的数据存到硬盘中。 RDB什么是RDB在指定的时间间隔内将内存的数据集快照写入磁盘。 时间间隔:例如指定每隔 10 分钟持久化一次,就可能在 RDB 持久化的过程Redis 会单独创建一个子进程(fork)来进行持久化,会将数据先写入到一个临时文件中,等持久化过程结束了,再用这个临时文件替换上次持久化好的文件,整个过程中,主进程是不进行任何 IO 操作的,这种通过替换的过程叫做“写时复制技术”。 RDB 持久化的实际操作Redis 默认开启 RDB 持久化。 打开 Redis 的配置文件——
以下配置默认不开启:
save 默认不开启,默认是开启了 bgsave 。
RDB 优缺点优点: RDB 的备份备份的作用:当我们的 Redis 正在使用时,会不断地使用 RDB 进行持久化,此时如果 Redis 突然挂掉了,存储在内存中地数据就会消失,但是持久化的数据还在,此时,等待 Redis 重新启动后,会自动加载 dump.rdb 文件的数据到内存中,从而达到数据的恢复。 AOF什么是 AOF以日志的形式来记录每个写操作(增量保存),将 Redis 执行过的所有写指令记录下来(读操作不记录),只许追加文件但不可以改写文件,Redis 启动之初会读取该文件重新构建数据,换言之,Redis 重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。 AOF 持久化的过程客户端请求中的写命令会被 append 追加到 AOF 缓冲区内,AOF 缓冲区根据 AOF 持久化策略(always,everysec,no)将操作 sync 同步到磁盘的 AOF 文件中,AOF 文件大小超过重写策略或者手动重写时,会对 AOF 文件 rewrite 重写,压缩 AOF文件容量,Redis 服务重启时,会重新 加载 AOF 文件中的写操作达到数据恢复的目的。 AOF 持久化的实际操作Redis 默认不开启 AOF 持久化,但 RDB 和 AOF 同时开启时,会使用 AOF 持久化。
修改配置文件并重启 Redis 即可看到 但 AOF 除了恢复数据外,还支持修复数据。 实际演示:
2、修改文件内容最后一行为 “hello”(此时模拟了文件损坏) 在 AOF 文件所在的目录里面有一个 redis-check-aof ,执行下面命令。
AOF 还可以设置同步的频率,可以直接在 AOF 还可以设置 Rewrite 压缩: 简单的说:
从而达到了压缩文件的效果。 重写的原理: 默认的触发重写阈值: AOF 的优缺点优点: RDB 和 AOF 用哪个好1、官方推荐两个都启用。 Redis 主从复制主从复制简介一、什么是主从复制? **主机(也叫 Master)数据更新后根据配置和策略,自动同步到从机(也叫 Slave)**的机制,叫做主从复制。其中,主机主要复制写入操作,从机主要负责读取操作。 二、为什么要使用主从复制(主从复制的作用)? 我们之前演示的都是单机的 Redis 服务,而单机 Redis 的缺点无非就两个:一是随着用户请求的不断增多,单机很难承受住大量的请求;二是单机的 Redis 安全性不高,一旦机器出现故障挂掉,服务就直接停止了。因此,总结作用如下: 1、读写分离,性能扩展 主从复制的模式如下:一主多从,主负责写,从负责读,主被写入数据时复制(同步)到从。 搭建主从复制
操作演示1、搭建三个 Redis 服务器并启动,连接上各自的客户端。 2、查看 三台Redis 服务器主从复制相关信息
可以看到每一台服务器都显示目前是主机(Master),且没有携带任何从机,表明各自是相互独立的。 在想要成为从机的两台机器上面执行(配从不配主)
4、重新查看三个机子的主从信息 5、测试 演示二: 场景解释一主多从演示一: 特点:slave 挂掉之后重新启动是独立的,手动配置成原来主服务器的从服务器,数据是全量恢复的。 演示二: 薪火相传问题所在:当从服务器很多很多时,一主对应多从会让这台主的压力很大,每次都要同步多台从,因此可以做成类似层级结构的 演示一: 反客为主前面我们演示到,当主服务器挂掉时,从服务器是不会篡位的(还是认他为大哥),那么在实际开发中,这不就缺少了主机了吗,项目肯定跑不了了。这时候我们可以手动将一台从变成主,这就是反客为主。 主从复制原理主从复制的过程: 哨兵模式(自动版本的反客为主)简介哨兵模式:当主机挂掉时,不需要手动去把一个从机变成主机,Redis 会帮我们根据某些策略帮我们选择一台从机变成主机。 哨兵:用于监视主机是否挂掉,并负责选择一个从代替主,本质也是一个 Redis 服务。 如何搭建哨兵? 演示演示一: 复制延时主从模式的缺点:当写操作是发生在主服务器时,主服务器同步到从服务器再快也会有延迟,特别是系统繁忙或者从服务器很多时,延迟会更加严重。 选择新主的策略
Redis 集群简介问题一:如果我们是采用前面一主多从的架构的话,写入的操作只在一个 Redis 服务器中进行,如果写入的请求很大时,只用一台 Redis 来写不满足要求。 基于以上两个问题,简述如下: 我们的解决方法是:采用 Redis 集群(即配置多个一主多从)。 那么这样又有一个问题,集群的话那会有多台服务器负责写入操作,那么该如何均匀的把请求分配给多台服务器呢? Redis 插槽Redis 有 16384 个插槽,每个键对应一个插槽,然后每个主机分配一部分的插槽,插入键时根据公式计算插入哪个主机。 Redis 故障在一个 Redis 集群中,当一个主机挂掉后,它的从机会自动变成主机(不需要哨兵),且当挂掉的原主机重启后会自动成为新主机的从机。 在一个 Redis 集群中,当一个主机以及它的从机全部挂掉后,会怎么样呢? Redis 应用问题解决缓存穿透**描述:**当出现大量并发请求同时访问 Redis 中不存在的数据,导致请求到达数据库,从而让数据库崩溃的情况,通常是非法请求。 缓存击穿描述:当有大量的访问在访问某个 key 时,突然这个 key 失效了,导致大量的请求到达 DB。 缓存雪崩描述:在极少的时间内,大量的缓存失效(过期),大量的请求到达 DB。 分布式锁什么是分布式锁原本单机部署时,锁是单机的,可以实现,但搭建了集群后,在多线程的情况下,将使原单机部署情况下的并发控制锁策略失效,这个时候就需要用到分布式锁。 基于 Redis 的分布式锁使用 setnx 命令实现。 上锁:
释放锁
1、如果锁一直没有释放怎么办?
2、上锁之后突然出现异常,无法设置过期时间怎么办?
3、锁之间的冲突问题 4、UUID判断 和 删除锁 之间的原子性问题 我们考虑第 3 中的情况是否还有问题呢?实际上是有的。 这种情况只能通过 lua 脚本来解决,因为 lua 脚本在执行过程中,别人是不可以打断的,因此需要在 Redis 中嵌入 lua 脚本。 Redis 新功能ACL 命令(版本 6 及以上)Redis 版本 5 之前,Redis 的安全规则只有通过密码等来控制,但在 Redis 6 中加入了 ACL 命令来控制用户进行更细分的权限控制。包括: 展示用户权限列表:
查看当前用户
创建用户
创建用户,并设置用户的信息()
切换用户
IO 多线程(版本 6 及以上)简介原理架构
工具支持 Cluster(版本 5 及以上)之前老版本 Redis 想要搭建集群需要单独安装 ruby 环境,Redis 5 将 redis-trib.rb 的功能集成到 redis-cli。另外官方 redis-benchmark 工具开始支持 cluster 模式了,通过多线程的方式对多个分片进行压测。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 23:07:46- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |