当前位置: 首页 > news >正文

Redis 键值对操作全攻略

文章目录

  • 一 . get 和 set
  • 二 . keys *
  • 三 . exists
  • 四 . del
  • 五 . expire
  • 六 . ttl
  • 七 . Redis 的 key 的过期策略
  • 八 . 定时器的实现
    • 8.1 基于优先级队列
    • 8.2 基于时间轮实现的定时器
  • 九 . type
  • 十 . 数据库管理相关命令

Hello , 大家好 , 这个专栏给大家带来的是 Redis 系列 ! 本篇文章给大家带来的是 Redis 一些最基础的命令 , 那这些命令并没有涉及到 Redis 核心数据结构 , 只是简单的操作键值对 , 难度相对更简单一些 .

在这里插入图片描述

本专栏旨在为初学者提供一个全面的 Redis 学习路径,从基础概念到实际应用,帮助读者快速掌握 Redis 的使用和管理技巧。通过本专栏的学习,能够构建坚实的 Redis 知识基础,并能够在实际学习以及工作中灵活运用 Redis 解决问题 .
专栏地址 : Redis 入门实践

一 . get 和 set

get 和 set 是 Redis 中最核心的两个命令
Redis 是按照键值对的方式存储数据的 , 那 get 就是根据 key 去取 value , set 就是把 key 和 value 存储进去

注意 : 必须要先进入到 Redis 客户端 : redis-cli , 才能进行后续操作

set 的语法 : set key value , 其中 key 和 value 都是字符串

127.0.0.1:6379> set key1 value1 # 存储键值对
OK
127.0.0.1:6379> set "key2" "value2" # key 和 value 默认是字符串,我们也可以手动加上引号
OK

对于上面的 key 和 value , 我们并不需要手动加上引号 , 他默认表示的就是字符串 , 加上的话就多此一举了

get 的用法 : get key

127.0.0.1:6379> get key1 # get 命令直接通过 key 就可以找到 value
"value1"
127.0.0.1:6379> get error # 如果当前 key 不存在 , 会返回 nil
(nil)

二 . keys *

Redis 是一个键值对结构 , 那 key 就是固定的字符串 , value 就有很多类型

  1. 字符串
  2. 哈希表
  3. 列表
  4. 集合
  5. 有序集合

那我们主要学习的是这几种数据结构中的命令

而 Redis 中还有一些全局命令 , 可以搭配任意一个数据结构来使用
比如 : keys , 他是用来查询当前服务器上匹配的 key
我们就可以通过一些特殊的符号 (通配符) 来描述 key 的模样 , 那如果有匹配上述模样的 key , 就能被查询出来
语法 : keys pattern

pattern 是一个包含特殊符号的字符串 , 它存在的意义就是去描述想要匹配的字符串是长什么样的 (类比正则表达式)

那 pattern 的写法有很多 , 我们来看一下
image.png

https://redis.io/commands/keys/

?表示可以匹配任意一个字符
*表示匹配任意个数的字符 (0 个 / 多个)
[ae]表示方括号里面的字母可以被匹配到

比如 : [] 这个位置只能匹配到 a / e , 写的就不行

[^e]表示排除 [] 中的内容

比如 : [^e] 只有 e 匹配不了 , 其他的都能匹配

[a-b]: 匹配 a-b 这个范围内的字符 , 包含两侧边界
那我们就来举个例子 , 了解一下每个通配符的用法

# 设置键值对
127.0.0.1:6379> set hello 1 
OK
127.0.0.1:6379> set hallo 2
OK
127.0.0.1:6379> set hbllo 3
OK
127.0.0.1:6379> set hllo 4
OK
127.0.0.1:6379> set heeeeeeeeeeeeeeeeeeeeelo 5
OK127.0.0.1:6379> keys h?llo # ? 位置匹配任意一个字符
1) "hbllo"
2) "hallo"
3) "hello"
127.0.0.1:6379> keys h*llo # * 位置匹配任意个数个字符
1) "hbllo"
2) "hallo"
3) "hllo"
4) "hello"
127.0.0.1:6379> keys h[abe]llo # [] 位置可以匹配到 a、b、e
1) "hbllo"
2) "hallo"
3) "hello"
127.0.0.1:6379> keys h[^ae]llo # [] 位置匹配不到 a 和 e
1) "hbllo"
127.0.0.1:6379> keys h[a-e]llo # [] 位置可以匹配到 [a,e] 之间的字符
1) "hbllo"
2) "hallo"
3) "hello"

那 keys 这个命令 , 他的时间复杂度是 O(N) , 所以在生产环境中一般都会禁止使用 keys 这个命令

尤其是 keys * , keys * 直接将 Redis 中所有的 key 都会查询出来

那 Redis 通常会被用作缓存 , 也就是说他是挡在 MySQL 前面的 , 那万一 Redis 被 keys * 阻塞住了 , 此时其他的查询 Redis 操作就会超时 , 此时这些请求就会直接查数据库 , 那突然一大波请求过来了 , MySQL 也承受不住压力 , 也会崩溃掉

三 . exists

exists 的作用是判断某个 key 是否存在
语法 : exists key1 [key2 …]

可以查询多个 key 是否存在

他的返回值是给定的 key 存在的个数

他指的是针对多个 key , 判断存在的个数 .
而不是说我们在设置键值对的时候 , key 是可以重复的 , 然后统计同一个 key 对应的 value 的个数

时间复杂度 : O(1) , 但是并不绝对 , 有可能很多数据 , 那时间复杂度就变成了 O(N)

Redis 组织数据就是按照哈希表的方式来组织的 , 所以操作的时间复杂度一般都是 O(1)

127.0.0.1:6379> keys * # 查看所有键值对
1) "heeeeeeeeeeeeeeeeeeeeelo"
2) "hbllo"
3) "key2"
4) "hallo"
5) "\xac\xed\x00\x05t\x00\x132023-10-30 04_41_36"
6) "hllo"
7) "key1"
8) "hello"
127.0.0.1:6379> exists hello # 判断某个 key 是否存在
(integer) 1
127.0.0.1:6379> exists hello hbllo # 判断多个 key 是否存在
(integer) 2 # 返回值代表多个 key 存在的个数
127.0.0.1:6379> exists hello nonono # 只返回 key 存在的个数
(integer) 1

❓ 那比如这条语句 : exists hello hbllo , 我们为什么不选择写两次 exists 呢 ?
✔️ Redis 是一个 “客户端-服务器” 结构的程序 , 那客户端和服务器之间是通过网络来进行通信的 . 如果分开多次写 , 就会产生更多次数的网络通信 , 网络通信相比于操作内存效率又低、成本又高 , 所以能够一次传输的话就尽量一次进行传输

四 . del

del 的用途是删除指定的 key , 他也可以一次删除一个或者一次删除多个
语法 : del key1 [key2 …]
时间复杂度 : O(1)

删除 n 个数据 , 那时间复杂度同 exists , 都是 O(N)

返回值 : 删除掉的 key 的个数 , 如果 key 不存在返回 0

127.0.0.1:6379> keys * # 查看当前所有的键
1) "k1"
2) "k4"
3) "k3"
4) "k2"
127.0.0.1:6379> del k1 # 删除键值对
(integer) 1
127.0.0.1:6379> del k2 k3 # 返回值代表删除元素的个数
(integer) 2
127.0.0.1:6379> del notexist # 如果 key 不存在返回 0
(integer) 0

五 . expire

expire 的作用是给指定的 key 设置过期时间 , 如果 key 超过这个指定的时间就会被自动删除

使用场景比如 : 手机验证码、指定时间内有效的优惠券等

语法 : expire key 秒

还有一个命令 , 是 pexpire key 毫秒 , 这个命令将时间更加细化了

时间复杂度 : O(1)

127.0.0.1:6379> set k1 v1
OK 
127.0.0.1:6379> expire k1 3 # 设定过期时间 -> 必须针对已经存在的 key 才能设置
(integer) 1 # 设置成功返回 1
127.0.0.1:6379> expire k2 3 # 针对不存在的 key 设置过期时间就会失败
(integer) 0 # 设置失败返回 0
127.0.0.1:6379> expire k1 3 # 到达过期时间自然就会失效, 再去设置就会失败
(integer) 0

六 . ttl

ttl (time to live) 的作用是用来查询过期时间的

127.0.0.1:6379> set k1 v1 # 设置键值对
OK
127.0.0.1:6379> expire k1 10 # 设置过期时间
(integer) 1
127.0.0.1:6379> ttl k1 # 查询过期时间
(integer) 7
127.0.0.1:6379> ttl k1 # 返回值为 -2 代表已经过期
(integer) -2

七 . Redis 的 key 的过期策略

❓ 我们思考一个问题 : Redis 的 key 的过期策略是怎样实现的 ?
一个 Redis 中可能同时存在很多很多 key , 这些 key 中可能有很大一部分都有过期时间 , 此时 Redis 服务器是怎样知道哪些 key 已经过期要被删除 , 哪些 key 还没过期呢 ?
✔️
如果遍历所有的 key , 显然是行不通的 , 它的效率是非常低的 .
那 Redis 整体的策略是两点 :

  1. 定期删除 : 隔一段时间删除一批过期的 key
  2. 惰性删除 : 假设这个 key 已经到过期时间了 , 但是暂时不删除他 , 那他的 key 还存在 . 后续再一次访问 , 正好又访问到了这个 key , 于是这次 Redis 服务器就会触发删除操作 , 返回 nil

比如超市卖饮料 , 老板并不知道这个饮料过没过期 , 超市老板就有两种方案
定期删除 : 每隔一段时间就看饮料过没过期
惰性删除 : 有人买的时候再检查过没过期 , 过期了就不卖了

Redis 采取的策略是每次抽取一部分键值对验证过期时间 , 并且要保证抽查的过程足够快

那为什么要让抽查的过程足够快呢 ?
因为 Redis 是单线程的程序 , 主要任务并不是扫描过期的 key , 如果扫描过期的 key 消耗的时间太多 , 就可能导致正常处理请求的命令就被阻塞了

八 . 定时器的实现

定时器指的是在某个时间到达之后 , 执行指定的任务
那定时器的实现有两种思路

  1. 基于优先级队列
  2. 基于时间轮实现的定时器

8.1 基于优先级队列

正常的队列是符合先进先出的规则的 , 但是优先级队列则是按照指定的优先级进行先出操作的 .
那优先级一般来说是可以自定义的 , 那在 Redis 中一般就是 “越早过期 , 优先级越高” .
那现在假设有很多 key 设置了过期时间 , 就可以将这些 key 加入到优先级队列中 , 指定过期时间早的先出队列
我们只需要给定时器分配一个线程 , 让这个线程去检查队首元素 , 看一下是否过期即可 , 如果说队首元素还没过期 , 那后续元素就一定没过期 , 此时扫描线程就不需要遍历所有 key , 只需要关注队首元素即可
另外 , 在扫描队首元素过期时间的时候 , 也不能检查的太过于频繁 , 这样会消耗额外的资源 .
那我们的做法就可以在检查队首元素的时候去看一下队首元素的过期时间 , 然后设置等待时间为当前时刻和队首元素的过期时间的差 , 当过期时间到了就去唤醒队首元素这个线程
但是万一在线程休眠的时候 , 来了一个新任务 , 那我们就需要唤醒一下线程 , 重新检查一下队首元素的过期时间以及新任务的过期时间 , 如果新的线程过期时间更小了 , 那就需要将该任务添加到队首 , 并且更新线程阻塞等待的时间

8.2 基于时间轮实现的定时器

基于时间轮实现的定时器.png

但是 Redis 并没有采取上述的两种方案 , 在这里只是给大家介绍一下

九 . type

type 的作用就是查看 key 对应的 value 的数据类型

Redis 中所有的 key 都是 String 类型 , 而 value 是不同的数据类型

127.0.0.1:6379> set k1 v1 # 设置键值对
OK
127.0.0.1:6379> type k1 # 获取 key 对应的 value 的数据类型
string
127.0.0.1:6379> lpush k2 111 222 333 # 设置列表
(integer) 3
127.0.0.1:6379> type k2 # 获取 key 对应的 value 的数据类型
list

时间复杂度 : O(1)


小结 :
set : 设置键值对
get : 获取键值对
keys : 查看匹配规则的 key
exists : 用来判定指定的 key 是否存在
del : 删除指定的 key
expire : 给 key 设置过期时间
ttl : 查询 key 的过期时间
type : 查询 key 对应的 value 的类型

十 . 数据库管理相关命令

在我们之前学习 MySQL 的时候 , 有一个概念 : database , 一个 MySQL 服务器上可以有很多个 database , 那一个 database 里面还有很多表 .
其实 Redis 中也有 database 这样的概念 , 但是不像在 MySQL 中使用那么随意 , 想创建多少个就多少个 .
在 Redis 中的 database 是现成的 , 我们不能创建新的数据库 , 也不能删除提供的数据库 .
Redis 提供给了我们 16 个数据库 , 编号从 0 到 15 , 那这 16 个数据库之间是相互隔离的 (相互之前都不会有影响) , 默认使用的是 0 号数据库 .

我们可以通过 select dbIndex 来去切换数据库

127.0.0.1:6379> set k1 v1 # 在 0 号数据库中设置键值对
OK
127.0.0.1:6379> get k1 # 在 0 号数据库中能够获取到该键值对
"v1"
127.0.0.1:6379> select 6 # 切换到 6 号数据库
OK
# [6] 表示第 6 号数据库
127.0.0.1:6379[6]> get k1 # 此时就获取不到该键值对了
(nil)
127.0.0.1:6379[6]> select 0 # 此时在切换回 0 号数据库
OK
127.0.0.1:6379> get k1 # 就又可以获取到该键值对了
"v1"

我们还可以通过 dbsize 获取当前数据库中 key 的个数

127.0.0.1:6379> set k1 v1 # 在 0 号数据库设置键值对
OK
127.0.0.1:6379> dbsize # 获取当前数据库的键值对个数
(integer) 1
127.0.0.1:6379> select 6 # 切换到 6 号数据库
OK
127.0.0.1:6379[6]> dbsize # 此时 6 号数据库没设置过任何数据
(integer) 0 # 就会检索到 0 个键值对

接下来就是两个危险又刺激的命令了 : flushdb、flushall
flushdb : 清空当前数据库
flushall : 清空所有数据库
以后在公司中千万不能使用 , 尤其是在生产环境上 , 不然会有很严重的后果 .


对于 Redis 操作键值对的常见命令就已经讲解完毕了 , 如果对你有帮助的话请一键三连~
在这里插入图片描述

相关文章:

Redis 键值对操作全攻略

文章目录 一 . get 和 set二 . keys *三 . exists四 . del五 . expire六 . ttl七 . Redis 的 key 的过期策略八 . 定时器的实现8.1 基于优先级队列8.2 基于时间轮实现的定时器 九 . type十 . 数据库管理相关命令 Hello , 大家好 , 这个专栏给大家带来的是 Redis 系列 ! 本篇文章…...

【C语言】---- return的作用

return 是C语言中的一个关键字,用于从函数中返回值。它有以下几个作用: 1 返回值 return 用于将函数的结果返回给调用者。在函数执行过程中,当遇到 return 语句时,函数将立即停止执行,并将其后的表达式的值作为函数的…...

如何制作新生资料收集系统?

新学年伊始,学校需要高效收集学生信息和证件照。易查分提供了一个便捷的解决方案,通过创建一个集成信息和图片的收集系统,可以快速完成这项工作,并将信息导出为PDF,方便打印和存档。 制作步骤如下: 1. 准备…...

pyecharts可视化数据大屏

1. 简介 1.1. 概述 PyECharts 是一个用于生成 ECharts 图表的 Python 库。ECharts 是一款由阿里巴巴开发的开源 JavaScript 图表库,广泛应用于网页端的数据可视化。而 PyECharts 将 ECharts 的功能带到了 Python 环境中,使得 Python 开发者可以方便地在数据分析、机器学习等…...

uniapp - H5 在 UC 浏览器中返回上一页失效的解决方案

1. 前言 最近使用 uniapp 开发的 H5 在测试中遇到的问题:有A、B两个页面,反复从A页面进入B页面后,在B页面会存在返回函数失效问题。经过测试发现,如果反复进入B页面的参数相同,在第三次进入后,返回就会失效,不管是 uniapp 自带的头部导航,还是 uni.navigateBack API 都…...

利用KMeans重新计算自己数据集的anchor

在YOLOv5或YOLOv7中,anchors(锚框)是预设的一组不同大小、不同长宽比的边界框,它们用于在图像中的每个网格单元上进行偏移和缩放,以生成目标的候选框。这些anchors的设定对于提高目标检测的效率和准确性至关重要。 并…...

分类任务实现模型集成代码模版

分类任务实现模型(投票式)集成代码模版 简介 本实验使用上一博客的深度学习分类模型训练代码模板-CSDN博客,自定义投票式集成,手动实现模型集成(投票法)的代码。最后通过tensorboard进行可视化&#xff0…...

从Milvus迁移DashVector

本文档演示如何从Milvus将Collection数据全量导出,并适配迁移至DashVector。方案的主要流程包括: 首先,升级Milvus版本,目前Milvus只有在最新版本(v.2.3.x)中支持全量导出其次,将Milvus Collection的Schema信息和数据…...

彻底改变计算机视觉的 Vision Transformer (ViT) 综合指南(视觉转换器终极指南)

欢迎来到雲闪世界。大家好!对于那些还不认识我的人,我叫 Francois,我是 Meta 的研究科学家。我热衷于解释先进的 AI 概念并使其更容易理解。 今天,让我们深入探讨计算机视觉领域最重要的贡献之一:Vision Transformer&…...

vue3 v-bind=“$attrs“ 的一些理解,透传 Attributes相关说明及事例说明

1、可能小伙伴们经常会在自己的项目中看到v-bind"$attrs"&#xff0c;这个一般是在自定义组件中看到。 比如&#xff1a; <template><BasicModalv-bind"$attrs"register"registerModal":title"getTitle"ok"handleSubm…...

鸿蒙开发基础知识-页面布局【第四篇】

1.类型转换 2.交互点击事件 3.状态管理 4.forEch渲染和右上角图标 测试案例 Stack 层叠布局一个生肖卡 5. 动画展示图片 6. Swiper 轮播组件的基本使用 图片等比显示 aspectRatio&#xff08;&#xff09;...

用CSS实现前端响应式布局

一、响应式布局的重要性 随着移动设备的普及&#xff0c;越来越多的用户通过手机、平板电脑等设备访问网页。如果网页不能适应不同的屏幕尺寸&#xff0c;就会出现布局混乱、内容显示不全等问题&#xff0c;严重影响用户体验。响应式布局可以确保网页在各种设备上都能保持美观…...

【docker】docker启动sqlserver

sqlserver-docker官方地址 # sqlserver不是从docker的中央仓库拉取的&#xff0c;而是从ms的仓库拉取的。 docker pull mcr.microsoft.com/mssql/server:2019-latest# 宿主机即docker程序运行的linux服务器 docker run -d \ --user root \ --name mssql2019 \ -e "ACCEPT…...

Python爬虫01

requests模块 文档 安装 pip/pip3 install requestsresponse.text 和 response.content的区别 1.response.text 等价于 response.content.decode("推测出的编码字符集")response.text 类型&#xff1a;str 编码类型&#xff1a;requests模块自动根据Http头部对…...

关于vue项目启动报错Error: error:0308010C:digital envelope routines::unsupported

周五啦&#xff0c;总结一下这周遇到的个别问题吧&#xff0c;就是关于启动项目的时候其他的东西都准备好了&#xff0c;执行命令后报错Error: error:0308010C:digital envelope routines::unsupported 这里看一下我标注的地方&#xff0c;然后总结一下就不难发现问题所在 查看…...

随笔1:数学建模与数值计算

目录 1.1 矩阵运算 1.2 基本数学函数 1.3 数值求解 数学建模与数值计算 是将实际问题通过数学公式和模型进行描述&#xff0c;并通过计算获得模型解的过程。这是数学建模中最基本也是最重要的环节之一。下面是详细的知识点讲解及相应的MATLAB代码示例。 1.1 矩阵运算 知识点…...

SDN架构详解

目录 1&#xff09;经典的IP网络-分布式网络 2&#xff09;经典网络面临的问题 3&#xff09;SDN起源 4&#xff09;OpenFlow基本概念 5&#xff09;Flow Table简介 6&#xff09;SDN的网络架构 7&#xff09;华为SDN网络架构 8&#xff09;传统网络 vs SDN 9&#xf…...

platform框架

platform框架 注册设备进入总线platform_device_register函数 注册驱动进入总线platform_driver_register函数 注册设备进入总线 platform_device_register函数 int platform_device_register(struct platform_device *pdev) struct platform_device {const char * name; 名…...

零成本搞定静态博客——十分钟安装hugo与主题

文章目录 hugo介绍hugo安装与使用方式一&#xff1a;新建站点自建主题方式二&#xff1a;新建站点使用系统推荐的主题 hugo介绍 通过 Hugo 你可以快速搭建你的静态网站&#xff0c;比如博客系统、文档介绍、公司主页、产品介绍等等。相对于其他静态网站生成器来说&#xff0c;…...

windows C++ 并行编程-转换使用取消的 OpenMP 循环以使用并发运行时

某些并行循环不需要执行所有迭代。 例如&#xff0c;搜索值的算法可以在找到值后终止。 OpenMP 不提供中断并行循环的机制。 但是&#xff0c;可以使用布尔值或标志来启用循环迭代&#xff0c;以指示已找到解决方案。 并发运行时提供允许一个任务取消其他尚未启动的任务的功能。…...

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念&#xff0c;确保一个租户&#xff08;在这个系统中可能是一个公司或一个独立的客户&#xff09;的数据对其他租户是不可见的。在 RuoYi 框架&#xff08;您当前项目所使用的基础框架&#xff09;中&#xff0c;这通常是通过在数据表中增加一个…...

Java求职者面试指南:计算机基础与源码原理深度解析

Java求职者面试指南&#xff1a;计算机基础与源码原理深度解析 第一轮提问&#xff1a;基础概念问题 1. 请解释什么是进程和线程的区别&#xff1f; 面试官&#xff1a;进程是程序的一次执行过程&#xff0c;是系统进行资源分配和调度的基本单位&#xff1b;而线程是进程中的…...

快刀集(1): 一刀斩断视频片头广告

一刀流&#xff1a;用一个简单脚本&#xff0c;秒杀视频片头广告&#xff0c;还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农&#xff0c;平时写代码之余看看电影、补补片&#xff0c;是再正常不过的事。 电影嘛&#xff0c;要沉浸&#xff0c;…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践

作者&#xff1a;吴岐诗&#xff0c;杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言&#xff1a;融合数据湖与数仓的创新之路 在数字金融时代&#xff0c;数据已成为金融机构的核心竞争力。杭银消费金…...