0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

redis几个认识误区

lhl545545 来源:电子发烧友网 2018-02-09 13:46 次阅读

前言

Redis性能惊人,国内前十大网站的子产品估计用1台Redis就可以满足存储及Cache的需求。除了性能印象之外,业界其实普遍对Redis的认识存在一定误区。下文是对对Redis研究的一个总结,澄清了一些认识上的误区,提出一些观点供大家探讨。

1. Redis是什么

这个问题的结果影响了我们怎么用Redis。如果你认为Redis是一个key value store, 那可能会用它来代替MySQL;如果认为它是一个可以持久化的cache, 可能只是它保存一些频繁访问的临时数据。Redis是REmote DIctionary Server的缩写,在Redis在官方网站的的副标题是A persistent key-value database with built-in net interface written in ANSI-C for Posix systems,这个定义偏向key value store。还有一些看法则认为Redis是一个memory database,因为它的高性能都是基于内存操作的基础。另外一些人则认为Redis是一个data structure server,因为Redis支持复杂的数据特性,比如List, Set等。对Redis的作用的不同解读决定了你对Redis的使用方式。

互联网数据目前基本使用两种方式来存储,关系数据库或者key value。但是这些互联网业务本身并不属于这两种数据类型,比如用户在社会化平台中的关系,它是一个list,如果要用关系数据库存储就需要转换成一种多行记录的形式,这种形式存在很多冗余数据,每一行需要存储一些重复信息。如果用key value存储则修改和删除比较麻烦,需要将全部数据读出再写入。Redis在内存中设计了各种数据类型,让业务能够高速原子的访问这些数据结构,并且不需要关心持久存储的问题,从架构上解决了前面两种存储需要走一些弯路的问题。

2. Redis不可能比Memcache快

很多开发者都认为Redis不可能比Memcached快,Memcached完全基于内存,而Redis具有持久化保存特性,即使是异步的,Redis也不可能比Memcached快。但是测试结果基本是Redis占绝对优势。一直在思考这个原因,目前想到的原因有这几方面。

Libevent。和Memcached不同,Redis并没有选择libevent。Libevent为了迎合通用性造成代码庞大(目前Redis代码还不到libevent的1/3)及牺牲了在特定平台的不少性能。Redis用libevent中两个文件修改实现了自己的epoll event loop(4)。业界不少开发者也建议Redis使用另外一个libevent高性能替代libev,但是作者还是坚持Redis应该小巧并去依赖的思路。一个印象深刻的细节是编译Redis之前并不需要执行。/configure。

CAS问题。CAS是Memcached中比较方便的一种防止竞争修改资源的方法。CAS实现需要为每个cache key设置一个隐藏的cas token,cas相当value版本号,每次set会token需要递增,因此带来CPU和内存的双重开销,虽然这些开销很小,但是到单机10G+ cache以及QPS上万之后这些开销就会给双方相对带来一些细微性能差别(5)。

3. 单台Redis的存放数据必须比物理内存小

Redis的数据全部放在内存带来了高速的性能,但是也带来一些不合理之处。比如一个中型网站有100万注册用户,如果这些资料要用Redis来存储,内存的容量必须能够容纳这100万用户。但是业务实际情况是100万用户只有5万活跃用户,1周来访问过1次的也只有15万用户,因此全部100万用户的数据都放在内存有不合理之处,RAM需要为冷数据买单。

这跟操作系统非常相似,操作系统所有应用访问的数据都在内存,但是如果物理内存容纳不下新的数据,操作系统会智能将部分长期没有访问的数据交换到磁盘,为新的应用留出空间。现代操作系统给应用提供的并不是物理内存,而是虚拟内存(Virtual Memory)的概念。

基于相同的考虑,Redis 2.0也增加了VM特性。让Redis数据容量突破了物理内存的限制。并实现了数据冷热分离。

4. Redis的VM实现是重复造轮子

Redis的VM依照之前的epoll实现思路依旧是自己实现。但是在前面操作系统的介绍提到OS也可以自动帮程序实现冷热数据分离,Redis只需要OS申请一块大内存,OS会自动将热数据放入物理内存,冷数据交换到硬盘,另外一个知名的“理解了现代操作系统(3)”的Varnish就是这样实现,也取得了非常成功的效果。

作者antirez在解释为什么要自己实现VM中提到几个原因(6)。主要OS的VM换入换出是基于Page概念,比如OS VM1个Page是4K, 4K中只要还有一个元素即使只有1个字节被访问,这个页也不会被SWAP, 换入也同样道理,读到一个字节可能会换入4K无用的内存。而Redis自己实现则可以达到控制换入的粒度。另外访问操作系统SWAP内存区域时block进程,也是导致Redis要自己实现VM原因之一。

5. 用get/set方式使用Redis

作为一个key value存在,很多开发者自然的使用set/get方式来使用Redis,实际上这并不是最优化的使用方法。尤其在未启用VM情况下,Redis全部数据需要放入内存,节约内存尤其重要。

假如一个key-value单元需要最小占用512字节,即使只存一个字节也占了512字节。这时候就有一个设计模式,可以把key复用,几个key-value放入一个key中,value再作为一个set存入,这样同样512字节就会存放10-100倍的容量。

这就是为了节约内存,建议使用hashset而不是set/get的方式来使用Redis,详细方法见参考文献(7)。

6. 使用aof代替snapshot

Redis有两种存储方式,默认是snapshot方式,实现方法是定时将内存的快照(snapshot)持久化到硬盘,这种方法缺点是持久化之后如果出现crash则会丢失一段数据。因此在完美主义者的推动下作者增加了aof方式。aof即append only mode,在写入内存数据的同时将操作命令保存到日志文件,在一个并发更改上万的系统中,命令日志是一个非常庞大的数据,管理维护成本非常高,恢复重建时间会非常长,这样导致失去aof高可用性本意。另外更重要的是Redis是一个内存数据结构模型,所有的优势都是建立在对内存复杂数据结构高效的原子操作上,这样就看出aof是一个非常不协调的部分。

其实aof目的主要是数据可靠性及高可用性,在Redis中有另外一种方法来达到目的:Replication。由于Redis的高性能,复制基本没有延迟。这样达到了防止单点故障及实现了高可用。

小结

要想成功使用一种产品,我们需要深入了解它的特性。Redis性能突出,如果能够熟练的驾驭,对国内很多大型应用具有很大帮助。希望更多同行加入到Redis使用及代码研究行列。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Redis
    +关注

    关注

    0

    文章

    374

    浏览量

    10872
收藏 人收藏

    评论

    相关推荐

    DFT的常见误区与解决方案

    DFT(离散傅里叶变换)在信号处理领域具有广泛的应用,但在使用过程中也常会遇到一些误区。以下是对DFT常见误区的总结以及相应的解决方案: 常见误区 混叠现象 : 误区描述:在采样过程中
    的头像 发表于 12-20 09:32 149次阅读

    Redis缓存与Memcached的比较

    Redis和Memcached都是广泛使用的内存数据存储系统,它们主要用于提高应用程序的性能,通过减少对数据库的直接访问来加速数据检索。以下是对Redis和Memcached的比较,涵盖了它们的一些
    的头像 发表于 12-18 09:33 125次阅读

    编程语言的误区与常见问题

    : 选择编程语言时,应考虑项目需求、个人兴趣以及语言的适用性。例如,如果你对Web开发感兴趣,那么学习JavaScript可能是一个好选择。 认识到没有一种编程语言是万能的。不同的语言有不同的优势和适用场景,灵活选择是关键。 误区二:忽
    的头像 发表于 11-15 09:35 283次阅读

    认识差分信号的常见误区

    差分信号因其优异的抗干扰性能和良好的信号完整性而被广泛应用。然而,围绕差分信号的认识却存在一些常见的误区。为了帮助设计工程师更好地理解和应用差分信号,本文将针对这些误区进行详细解析。 1. 回流路径
    的头像 发表于 10-04 14:48 296次阅读

    必看!光伏并网逆变器的3个典型认识误区

    总是下意识地、第一时间从逆变器入手,去寻找原因和解决方案。在日常交流中发现尽管分布式光伏在国内已经高速发展了多年,但仍然有几个典型的对逆变器的认识误区存在。今天就来聊一聊。 01 逆变器输出电压吗? “交流输出电压”这
    的头像 发表于 07-11 16:32 991次阅读
    必看!光伏并网逆变器的3个典型<b class='flag-5'>认识</b><b class='flag-5'>误区</b>

    Redis 开源协议调整,我们怎么办?

    2 024 年 3 月 20 日, Redis 官方宣布,从 Redis 7.4 版本开始,Redis 将获得源可用许可证 ( RSALv2 ) 和服务器端公共许可证 ( SSPLv1 ) 的双重
    的头像 发表于 05-09 22:59 430次阅读
    <b class='flag-5'>Redis</b> 开源协议调整,我们怎么办?

    Redis开源版与Redis企业版,怎么选用?

    点击“蓝字”关注我们数以千计的企业和数以百万计的开发人员Redis开源版来构建应用程序。但随着用户数量、数据量和地区性的增加,成本、可扩展性、运营和可用性等问题也随之而来。Redis企业版
    的头像 发表于 04-04 08:04 1064次阅读
    <b class='flag-5'>Redis</b>开源版与<b class='flag-5'>Redis</b>企业版,怎么选用?

    数据安全没保障?GaussDB(for Redis) 为你保驾护航

    近日,一些用户反馈,使用的开源 Redis 中新增了几个未知来源的 Key。通过分析发现,用户使用的开源 Redis 没有设置密码,很可能是遭到了 Redis 扩散病毒的攻击,表面上只
    的头像 发表于 03-28 22:09 673次阅读
    数据安全没保障?GaussDB(for <b class='flag-5'>Redis</b>) 为你保驾护航

    GaussDB(for Redis) 特性揭秘:大 key 治理

      从 DBA 的视角看,大 Key 无疑是引起 Redis 线上问题的常见原因。为了解决大 Key 隐患,业务首先要遵守合理的开发规范,减少大 Key 的产生和访问依赖。但有时大 Key 是在程序
    的头像 发表于 03-28 22:06 666次阅读
    GaussDB(for <b class='flag-5'>Redis</b>) 特性揭秘:大 key 治理

    新版 Redis 不再“开源”,对使用者都有哪些影响?

    2024 年 3 月 20 日,Redis Labs 宣布从 Redis 7.4 开始,将原先比较宽松的 BSD 源码使用协议修改为 RSAv2和 SSPLv1协议。该变化意味着 Redis
    的头像 发表于 03-27 22:30 490次阅读
    新版 <b class='flag-5'>Redis</b> 不再“开源”,对使用者都有哪些影响?

    选购安规电容的几个常见误区你中了几个

    安规电容在电子设备中扮演重要角色,但选购时易陷误区。新手常错将普通电容当安规电容,忽视品质与认证,不考虑品牌和制造商。选购安规电容应了解性能,选择品质好的产品,这样才能确保电子设备工作的稳定性。
    的头像 发表于 03-25 09:55 456次阅读
    选购安规电容的<b class='flag-5'>几个</b>常见<b class='flag-5'>误区</b>你中了<b class='flag-5'>几个</b>?

    路由器代理商如何避免常见的误区

    作为路由器代理商,要成功在竞争激烈的市场环境中立足,需对常见误区保持清醒认识,并制定相应策略避免。从产品定位、渠道选择和营销策略等方面剖析,为可持续发展提供指导。
    的头像 发表于 03-03 16:51 430次阅读

    Redis官方搜索引擎来了,性能炸裂!

    RediSearch 是一个 Redis 模块,为 Redis 提供查询、二级索引和全文搜索功能。
    的头像 发表于 02-21 10:01 2348次阅读
    <b class='flag-5'>Redis</b>官方搜索引擎来了,性能炸裂!

    低功耗设计的几个误区分享

    误区一:我们这系统是220V供电,就不用在乎功耗问题了 点评:低功耗设计并不仅仅是为了省电,更多的好处在于降低了电源模块及散热系统的成本、由于电流的减小也减少了电磁辐射和热噪声的干扰。随着设备
    发表于 01-09 08:04

    linux下Redis常用命令使用

    redis重启,缓存数据还在,redis清缓存数据
    的头像 发表于 12-27 09:56 6573次阅读
    linux下<b class='flag-5'>Redis</b>常用命令使用