首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

Redis Labs 再次更改开源许可证,但 Redis 本身不受影响

  • 24-03-05 03:21
  • 2408
  • 9328
blog.csdn.net

640?wx_fmt=gif

640?wx_fmt=jpeg

作者 | 局长

本文经授权转自开源中国(ID:oschina2013)

Python这么火,为什么还不学?

https://edu.csdn.net/topic/python115?utm_source=csdn_bw

其实「Redis Labs 再次更改开源许可证」这个说法有标题党的嫌疑,但看到 Redis Labs 的 CTO 也表示这次的变更确实是关于许可证的变更。既然如此,笔者就顺道借题发挥一下,还请各位轻喷。

640?wx_fmt=png

Redis Labs 的官方公告 https://redislabs.com/blog/redis-labs-modules-license-changes/

先解释一下 Redis Labs 这次对许可证的变更具体是什么情况。

首先要明确的是:由始至终,Redis 本身都没有变更过其开源许可证。Redis 作者 antirez 也早已澄清过,Redis 从前,现在,将来都会继续使用 BSD 开源许可证。所以对于「Redis 不再开源」这种以讹传讹的说法,就让它到此为止吧。

640?wx_fmt=png

坚定 BSD 开源许可证不动摇 http://antirez.com/news/120

那改变许可证的是什么产品?根据此前的报道,Redis Labs 自研的某些 Redis 模块(RediSearch, Redis Graph, ReJSON, ReBloom 和 Redis-ML)从 AGPL 变更为 Commons Clause 和 Apache-2.0 相结合的许可证(Apache2 modified with Commons Clause)。也就是说,这些模块将根据 Common Clause 发布(使用 Apache-2.0 作为基本许可证)。其中,Commons Clause 是在开源许可证的基础上实施商业限制的部分。Commons Clause 禁止使用方销售来自采用其许可条款的代码的软件,还阻止他们提供相应的咨询或支持服务。所以该消息一经发布就在业界引起了不小的轰动,许多声音都认为这是在和云厂商正面硬刚。

为什么要这样做?很简单的道理,天下熙熙皆为利来,天下攘攘皆为利往。Redis Labs 认为,现代云计算公司凭借其垄断性的市场地位,利用成功的开源项目赚得盆满钵满,但到头来却不为这些项目做出任何贡献(矛头直指 AWS,认为它是主犯)。

所以说到底,还是商业利益诉求。

而近日,刚获得 6000 万美元融资的 Redis Labs 宣布再次改变其自研 Redis 模块的许可证 —— 变更为 Redis 源码可用许可证(Redis Source Available License, 简称 RSAL)。

640?wx_fmt=png

有了 RSAL 之后,Redis Labs 旗下产品使用的许可证构成

Redis Labs CTO 表示这次变更许可证的举措考虑到了以下三个方面的因素:

  • 使用 Commons Clause 和 Apache-2.0 相结合的许可证引起了用户的困惑,他们认为只受 Apache-2.0 开源许可证条款的约束

  • Commons Clause 中对一些条款的描述不够清楚(比如包括“实质性”的含义)

  • 某些 Commons Clause 支持的限制条款与 Redis Labs 计划围绕 Redis 模块发展生态系统的意图相违背

考虑到所有这些因素,并在与社区成员进行多次讨论后,Redis Labs 决定移除 Commons Clause,并将 Redis 模块的许可证更改为 Redis 源码可用许可证(RSAL)。

什么是 Redis 源码可用许可证(RSAL)?

该许可证适用于 Redis Labs 自研的某些 Redis 模块。用户仍可以获取代码、修改代码,将代码集成到应用程序中并进行分发或提供支持服务,但该应用程序不能是数据库产品、缓存引擎、流处理引擎、搜索引擎、索引引擎或者机器学习/深度学习/AI服务引擎。根据定义,开源许可证不得有限制。而这个新许可证却有很多限制,所以严格来说它不是一种开源许可证。

Redis Labs CTO 写道:“云厂商一再利用成功的开源软件坐享渔翁之利,却没有对社区产生贡献。这些云厂商使用并非由它们开发的开源软件重新打包成竞争性的专有服务产品,并利用其市场地位从这些开源软件中获取可观的收入。”

由此可见,新许可证的目的正是为了阻止这个现象。Redis Labs 不希望其他公司以任何方式从 Redis 身上赚钱。

谈到钱,不可避免就会引起争论。尤其是在「开源」这个背景下。

所以,对于 Redis Labs 的开源立场,云原生计算基金会首席技术官 Chris Aniszczyk 毫不客气地“开喷”了:

640?wx_fmt=png

Aniszczyk 还指出:“一些云提供商正是开源社区的最大贡献者。”比如说,谷歌和微软一直在推动其在云开源方面的工作。实际上,微软也在公司内部正式推动开源的开发模式。

Aniszczyk 并不是唯一一个反对 Redis 开源立场的人。Apache 软件基金会的联合创始人 Jim Jagielski 在推特写道:“谁要是认为开源界20多年来没有遇到过像目前这样必须面对的情况,他要么是无知,要么是故意说假话。”他还表示,Apache Web 服务器的开发者一直很乐于被商业公司“搭便车”,因为这可以进一步确保为所有 Web 用户提供一个开放公平的竞争环境。

640?wx_fmt=png

早些时候,开源促进会(OSI)重申了对开源定义的支持,这个举动也得到了 Debian、Mozilla 和 Document 基金会等众多组织的支持。OSI 表示:“如果没有对开源的标准定义,软件开发是不可能走下去的。如果任何人都可以提出自己对开源的定义,那么这个世界就会缺乏信任,而如果没有了信任,就不会有社区,不会有合作,也不会有创新。”

围绕 Redis Labs 等开源软件和云厂商之间的纠葛已经产生了足够多的争论。现在,Redis Labs 又使用了新的 RSAL 许可证,并且不是开源的。最后的结果会是如何?我们静待观察吧。

90%的程序员学Python这么认为:

https://edu.csdn.net/topic/python115?utm_source=csdn_bw

640?wx_fmt=jpeg

 热 文 推 荐 

对不起,我的代码评审毁了一个程序员!

京东末位淘汰 10% 高管:稳定不是常态,淘汰才是

前端主流的 Javascript,缺失了哪些技能?

☞ 那些简历造假拿 Offer 的程序员,后来都怎么样了?

☞ 被V神点赞, 我是如何用五子棋打败以太坊排名最高的应用的? |人物志

☞ 50个最有价值的数据可视化图表(推荐收藏)

一键免费自动AI抠图,效果连PS大哥也点赞!

史上最难的一道Java面试题

 

print_r('点个好看吧!');
var_dump('点个好看吧!');
NSLog(@"点个好看吧!");
System.out.println("点个好看吧!");
console.log("点个好看吧!");
print("点个好看吧!");
printf("点个好看吧!\n");
cout << "点个好看吧!" << endl;
Console.WriteLine("点个好看吧!");
fmt.Println("点个好看吧!");
Response.Write("点个好看吧!");
alert("点个好看吧!")
echo "点个好看吧!"

640?wx_fmt=gif点击阅读原文,输入关键词,即可搜索您想要的 CSDN 文章。

640?wx_fmt=png喜欢就点击“好看”吧!

CSDN
微信公众号
成就一亿技术人

介绍

流式写入直接将数据流写入用户磁盘,避免传统方法(如Blob或URL.createObjectURL)因内存限制导致的大文件下载问题。

StreamSaver.js库使用浏览器原生的 Streams API,逐块写入数据到磁盘。通过 Service Worker 和中间人(MITM)技术,模拟服务器响应,绕过浏览器对下载文件大小的限制。而且,不需要服务端做任何修改。

使用

StreamSaver文档

安装:

bash
代码解读
复制代码
npm i streamsaver

使用:

js
代码解读
复制代码
import { createWriteStream } from 'streamsaver'; const fileStream = createWriteStream('download.json'); const writer = fileStream.getWriter(); function download () { const response = await fetch(''); const contentLength = response.headers.get('content-length'); let receivedBytes = 0; const reader = response.body.getReader(); // 分块处理 while (true) { const { done, value } = await reader.read(); if (done) break; // 写入文件流 await writer.write(value); // 更新进度(如果有内容长度) if (contentLength) { receivedBytes += value.length; } } await writer.close(); }

原理

  1. 用户点击下载按钮;
  2. 动态创建一个隐藏的iframe,加载MITM脚本;
  3. MITM脚本在iframe中注册Service Worker,并声明其作用域;
  4. 主页面和iframe通过postMessage通信,传递数据快;
  5. Service Worker接收数据,通过流式API写入本地文件;

浏览器要求文件下载必须由用户主动触发,如点击事件。iframe的创建和MITM脚本的加载会在用户点击事件的同步上下文中完成。这样,后续通过iframe触发的下载操作仍然被视为用户手势的延续,避免被浏览器阻止。

浏览器默认禁止脚本直接操作本地文件系统,且下载操作通常需要与当前页面同源。该iframe的源被设置为一个独立的、与主页面不同的虚拟URL,从而创建一个“隔离的上下文”。这个隔离的上下文可以绕过主页面的一些安全策略,允许直接与Service Worker通信并触发下载。

Service Worker需要注册在特定的作用域下,且通常需要与页面同源。iframe中加载的MIMT脚本会动态注册一个Service Worker,并控制其作用域。通过将Service Worker隔离在iframe中,可以避免与主应用的Service Worker冲突,同时确保下载逻辑的独立性。

主页面通过postMessage向iframe发送数据库,iframe中的MIMT脚本将数据转发给Service Worker,Service Worker将数据流式写入磁盘。

缺点

因为通过iframe处理下载逻辑,生产环境需要使用https,否则会有不安全混合内容限制。
如果不是https,则 StreamSaver 会改用popup,下载时页面左上角会有小弹窗闪现。

更好的方法

如果不考虑浏览器兼容性,可以用这个方法。

js
代码解读
复制代码
try { const response = await fetch(...); const reader = response.body?.getReader(); const chunks = []; while (true) { const { done, value } = await reader!.read(); if (done) break; chunks.push(value); } const blob = new Blob(chunks); const link = document.createElement('a'); link.href = URL.createObjectURL(blob); link.download = 'download.zip'; link.click(); URL.revokeObjectURL(link.href); } catch (error) { ElMessage.error('导出失败'); console.error(error); }

总结

streamsaver最好在https环境中使用,getReader可能不兼容旧浏览器。

streamsaver先选择保存位置再下载,getReader先下载再选择保存位置。

注:本文转载自blog.csdn.net的CSDN资讯的文章"https://blog.csdn.net/csdnnews/article/details/87899181"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top