首页 >>  正文

redis如何缓存对象

来源:baiyundou.net   日期:2024-09-22

作者 | 屠敏

出品 | CSDN(ID:CSDNnews)

ChatGPT 的火爆,超出了很多人的想象。今年初,根据 UBS(瑞士银行巨头瑞银集团)的一份报告显示,ChatGPT 推出仅两个月后,它在 2023 年 1 月末的月活用户已经突破了 1 亿,成为史上用户数增长最快的消费者应用。

不过,就是这样一款应用,最近却被推上风口浪尖,只因不少用户发现自己竟然可以看到别人与 ChatGPT 的聊天记录。

聊天信息被看光了可还行?

这导致 OpenAI 曾一度选择紧急关闭 ChatGPT。经过几天的排查,直至近日,OpenAI 正式公开了此次事件的技术原因,其表示,是开源库 Redis 中的一个 Bug 才导致了 ChatGPT 服务暴露了其他用户的个人信息和聊天标题。

而这究竟是怎么一回事,我们将通过 OpenAI 的官方公告了解事情的真相。

事件始末

在上周,CSDN 报道过此事,彼时有一位 Reddit 用户率先发现,在与 ChatGPT 聊天记录栏中,多出了许多陌生的对话标题,这也让他产生了“ChatGPT 或我是被黑了吗?”的错觉。

没想到的是,这条帖子迅速引发了多人的关注,也有很多用户在下方留言称自己也遇到了同样的问题,一位 Twitter 用户 Jordan L Wheeler 表示:“我看不到内容,但可以看到他们最近的对话标题。”

OpenAI 在公告中对这种情况进行了解释,「如果两个用户大约同时在线活跃,那么新创建的对话的第一条消息也有可能在其他人的聊天记录中可见」。

技术细节

至于为什么会出现这种状况,OpenAI 进一步补充说,该错误是在 Redis 客户端开源库 redis-py 中发现的。以下是 Bug 的工作原理:

OpenAI 使用 Redis 在其服务器中缓存用户信息,因此他们不需要为每个请求检索一遍数据库。

该团队使用 Redis Cluster 将此负载分布到多个 Redis 实例中。

OpenAI 使用 redis-py 库,从基于 Asyncio 运行的 Python 服务器与 Redis 交互。

该库在服务器和集群之间维护一个共享连接池,并在完成后回收连接以用于另一个请求。

当使用 Asyncio 时,redis-py 的请求和响应表现为两个队列:调用者将请求推送到传入队列,然后从传出队列弹出响应,并将连接返回到池中。

如果在请求被推送到传入队列之后,但在响应从传出队列中弹出之前,请求被取消,OpenAI 便可以看到错误所在:连接因此被破坏,下一个为不相关的请求去排队的响应可以接收连接中留下的数据。

在大多数情况下,这会导致不可恢复的服务器错误,用户将不得不再次尝试他们的请求。

但在某些情况下,损坏的数据恰好与请求者期望的数据类型相匹配,因此从缓存中返回的数据看起来是有效的,即使它属于另一个用户。

太平洋时间 3 月 20 日星期一凌晨 1 点,OpenAI 无意中对服务器进行了更改,导致 Redis 请求取消数量激增。这为每个连接返回错误数据带来了一个小概率事件。

OpenAI 表示,这个错误只出现在 Redis Cluster 的 Asyncio redis-py 客户端中,在发现的第一时间,便联系了 Redis 维护者,现已修复。

不过,OpenAI 也承认这个错误会在其他地方带来一些影响,比如可能导致 1.2% 的 ChatGPT Plus 订阅者在特定的 9 小时(太平洋时间 3 月 20 日星期一凌晨 1 点到 10 点)无意中看到了别人与支付相关的信息,包括会看到另一个活跃用户的名字和姓氏、电子邮件地址、支付地址、信用卡号的最后四位(仅)和信用卡到期时间日期。

OpenAI 称已经联系受影响的用户并通知他们的付款信息可能已被泄露。同时,该研发团队也添加了冗余检查以确保 ChatGPT 应用程序的 Redis 缓存返回的数据与请求用户匹配。

OpenAI 也修复了关键账户接管漏洞

在另一个与缓存相关的问题中,OpenAI 还解决了一个关键的帐户接管漏洞。

该漏洞最初由安全研究员 Gal Nagli 发现,它绕过了 OpenAI 在 chat.openai[.]com 上实施的保护措施,可以被利用来控制另一个用户的帐户,查看他们的聊天记录,并在他们不知情的情况下访问账单信息。

实现这一目标的方法是,首先创建一个特制的链接,将一个 .CSS 资源加载到 "chat.openai[.]com/api/auth/session/"端点上,并诱使用户点击该链接,导致包含有 accessToken 字符串的 JSON 对象的响应被缓存在 Cloudflare 的 CDN 中。

对 CSS 资源的缓存响应(其 CF-Cache-Status header 值设置为HIT)然后被攻击者滥用,以收获目标的 JSON Web Token(JWT) 凭证并接管账户。

Nagli 表示,OpenAI 在负责任的披露后两小时内就修复了该漏洞,表明了问题的严重性。

开源维护者是否要为商业公司的使用负责到底?

不过,虽然 OpenAI 在公告中一直强调,“Redis 开源维护者是出色的合作者,他们迅速解决了错误并推出了补丁。Redis 和其他开源软件在我们的研究工作中发挥着至关重要的作用。它们的重要性不可低估——如果没有 Redis,我们将无法扩展 ChatGPT。”

但是,对于 ChatGPT 具备捉 Bug 能力,却避免不了自己的 Bug,而且 Redis 承担主责这一情况,也引发了不少网友的讨论,甚至称「ChatGPT 惹的祸,终是要让开源软件来担着了」。

这也让很多人联想到了当初风靡全球的 Log4j 2 漏洞,以及

第三方公司在商业化产品中使用开源项目,从中赚得盆满钵满,而自己从未提供技术资金支持,当遇到问题时,又推回给开源开发者,一味“白嫖”只拿钱不办事,再次增加了开源开发者的负担。

对此,你认为开源维护者是否要为商业软件的安全问题负责到底?

","gnid":"954eb5a1b28ecaf92","img_data":[{"flag":2,"img":[{"desc":"","height":"80","s_url":"https://p0.ssl.img.360kuai.com/t013d73ffee4a20366b_1.gif","title":"","url":"https://p0.ssl.img.360kuai.com/t013d73ffee4a20366b.gif","width":"640"},{"desc":"","height":"222","title":"","url":"https://p0.ssl.img.360kuai.com/t01fa6a91e11e5a81bc.jpg","width":"1080"},{"desc":"","height":"934","title":"","url":"https://p0.ssl.img.360kuai.com/t01e3c363ae02193e38.jpg","width":"1080"},{"desc":"","height":"267","title":"","url":"https://p0.ssl.img.360kuai.com/t01f9e8809730232d1c.jpg","width":"729"},{"desc":"","height":"80","s_url":"https://p0.ssl.img.360kuai.com/t018e6f0fcf6c9df4ee_1.gif","title":"","url":"https://p0.ssl.img.360kuai.com/t018e6f0fcf6c9df4ee.gif","width":"960"}]}],"original":0,"pat":"art_src_1,fts0,sts0","powerby":"cache","pub_time":1680082751000,"pure":"","rawurl":"http://zm.news.so.com/6567e1185dc12807bcc3c3d01c75f3f4","redirect":0,"rptid":"e9faa44923c23d92","rss_ext":[],"s":"t","src":"CSDN","tag":[{"clk":"ktechnology_1:聊天记录","k":"聊天记录","u":""}],"title":"ChatGPT 修得了别人的 Bug,修不了自己的!OpenAI 直指开源数据库 Redis 漏了底

卫刘汤1038redis怎么存储 -
凌软饰19445241676 ______ 1. redis是一个性能非常优秀的内存数据库,通过key-value存储系统.2. 和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hashs(哈希类型).3. 这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的.4. 与memcached一样,为了保证效率,数据都是缓存在内存中.区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步.

卫刘汤1038如何设置数据库缓存 -
凌软饰19445241676 ______ 内存数据库有现成的redis,高效存取键值对,键设为你的查询条件,值设为你的查询结果转为字符串 查询时先从redis取,没有再查数据库,并且设置redis的过期时间,这种方式需要项目对实时性要求不高,这样你才能用缓存,而且如果你的项...

卫刘汤1038redis怎么统计点击量java -
凌软饰19445241676 ______ 调用一次点击,就把值放到redis里面,下次来,就从redis里面取值然后+1,最后设置到redis里面就行了.

卫刘汤1038使用redis作为缓存,数据还需要存入数据库中吗 -
凌软饰19445241676 ______ 对于变化频率非常快的数据来说,如果还选择传统的静态缓存方式(Memocached、File System等)展示数据,可能在缓存的存取上会有很大的开销,并不能很好的满足需要,而Redis这样基于内存的NoSQL数据库,就非常适合担任实时数据的...

卫刘汤1038如何提高redis存储效率 java -
凌软饰19445241676 ______ 楼主您好 把Redis作为缓存,将一些热点数据放到Redis中,读取时先读redis,载读db.至于减少内存,注意:Redis中数据的过期策略;选择合适的数据结构,例如:选择hash而非string;数据存储进redis前使用序列化工具压缩,推荐MsgPack.推荐知乎:

卫刘汤1038如何搭建redis扩展 -
凌软饰19445241676 ______ 上海蓝盟为您解答:安装redis扩展:1.通过composer进行安装,到项目根目录cmd运行(推荐) php composer.phar require --prefer-dist yiisoft/yii2-redis 或者添加"yiisoft/yii2-redis": "~2.0.0" 到对应项目的composer.json文件中2.手动安装 点...

卫刘汤1038如何使用redis缓存加索引处理数据库百万级并发 -
凌软饰19445241676 ______ 1.总的老说,优化方案中只有两种,一种是给查询的字段加组合索引.另一种是给在用户和数据库中增加缓存 2.添加索引方案:面对1~2千的并发是没有压力的,在往上则限制的瓶颈就是数据库最大连接数了,在上面中我用show global status ...

卫刘汤1038如何将分页数据 放入redis -
凌软饰19445241676 ______ 普通分页 一般分页做缓存都是直接查找出来,按页放到缓存里,但是这种缓存方式有很多缺点.如缓存不能及时更新,一旦数据有变化,所有的之前的分页缓存都失效了.比如像微博这样的场景,微博下面现在有一个顶次数的排序.这个用传统...

卫刘汤1038如何配置多个redis缓存并且是主从关系 -
凌软饰19445241676 ______ redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)和zset(有序集合).这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的.

卫刘汤1038redis 查看是什么时候设置的缓存 -
凌软饰19445241676 ______ redis 缓存是在内存中存的,如果开启了持久化保存,可以在 redis.conf中查看: dir 和 dbfilename 配置项

(编辑:自媒体)
关于我们 | 客户服务 | 服务条款 | 联系我们 | 免责声明 | 网站地图 @ 白云都 2024