此文作者是新浪微博平台架构师杨卫华timyang大师,是他对Redis研究的一个总结,澄清了一些认识上的误区,值得一读。

James Hamilton在On Designing and Deploying Internet-Scale Service中的第一条经验“Design for failure”是所有互联网架构成功的一个关键。

这1年我们经历了很多眼花缭乱的key value存储产品的诱惑,从Cassandra的淡出(Twitter暂停在主业务使用)到HBase的兴起(Facebook新的邮箱业务选用HBase),当再回头再去看Redis,发现这个只有1万多行源代码的程序充满了神奇及大量未经挖掘的特性。Redis性能惊人,国内前十大网站的子产品估计用1台Redis就可以满足存储及Cache的需求。除了性能印象之外,业界其实普遍对Redis的认识存在一定误区。本文提出一些观点供大家探讨。

目录

[隐藏]

  • 1 Redis是什么
  • 2 Redis不可能比Memcache快?
  • 3 单台Redis的存放数据必须比物理内存小?
  • 4 Redis的VM实现是重复造轮子?
  • 5 用get/set方式使用Redis
  • 6 使用aof代替snapshot?
  • 7 小结
  • 8 艺搜参考

Redis是什么

这个问题的结果影响了我们怎么用Redis。如果你认为Redis是一个key value store, 那可能会用它来代替MySQL;如果认为它是一个可以持久化的cache, 可能只是用它保存一些频繁访问的临时数据。还有一些看法则认为Redis是一个memory database,因为它的高性能都是基于内存的。另外一些人则认为Redis是一个data structure server,因为Redis支持复杂的数据特性,比如List, Set等。对Redis作用的不同解读决定了你对Redis的使用方式。

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

Redis不可能比Memcache快?

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

  • Libevent。和Memcached不同,Redis并没有选择libevent。Libevent为了迎合通用性造成代码庞大(目前Redis代码还不到libevent的1/3)及牺牲了在特定平台的不少性能。Redis对libevent中的两个文件进行修改实现了自己的epoll event loop。业界不少开发者也建议Redis使用另外一个libevent的高性能替代libev,但是作者还是坚持Redis应该小巧并去依赖的思路。一个印象深刻的细节是编译Redis之前并不需要执行./configure。
  • CAS问题。CAS(Check and Set)是Memcached中比较方便的一种防止竞争修改资源的方法。CAS实现需要为每个cache key设置一个隐藏的cas token,cas相当value版本号,每次set会token需要递增,因此带来CPU和内存的双重开销,虽然这些开销很小,但是到单机10G+ cache以及QPS(Query Per Second)上万之后这些开销就会给双方相对带来一些细微性能差别。

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

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

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

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

Redis的VM实现是重复造轮子?

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

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

用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。

使用aof代替snapshot?

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

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

小结

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

艺搜参考

http://blog.nosqlfan.com/html/868.html

http://timyang.net/data/redis-misunderstanding/

Redis的几个认识误区相关推荐

  1. Redis几个认识误区

    http://timyang.net/data/redis-misunderstanding/ 前几天微博发生了一起大的系统故障,很多技术的朋友都比较关心,其中的原因不会超出James Hamilto ...

  2. NoSQL and Redis

    首先谈谈为什么需要NoSQL? 这儿看到一篇blog说的不错http://robbin.iteye.com/blog/524977, 摘录一下 首先是面对Web2.0网站, 出现的3高问题, 1.Hi ...

  3. Redis数据库教程——系统详解学习Redis全过程

    Redis数据库教程--系统详解学习Redis全过程 Redis快速入门:Key-Value存储系统简介 Key-Value存储系统:     Key-Value Store是当下比较流行的话题,尤其 ...

  4. note.. redis五大数据类型

    redis 五大数据类型使用 nosql介绍,由来 什么是nosql 阿里巴巴的架构 nosql 四大分类 redis入门 概述 redis 安装 (docker) 基础的知识 redis五大数据类型 ...

  5. redis的内存优化【转】

    Redis所有的数据都在内存中,而内存又是非常宝贵的资源.对于如何优化内存使用一直是Redis用户非常关注的问题.本文让我们深入到Redis细节中,学习内存优化的技巧.分为如下几个部分: 一.redi ...

  6. Redis 5种数据结构使用及注意事项

    1优缺点 非常非常的快,有测评说比Memcached还快(当大家都是单CPU的时候),而且是无短板的快,读写都一般的快,所有API都差不多快,也没有MySQL Cluster.MongoDB那样更新同 ...

  7. 关于Redis的常识

    为什么80%的码农都做不了架构师?>>>    版本:V3.1 2014-3-36 (@江南白衣 版权所有,转载请保留出处),针对Redis 2.8版. 1. Overview 1. ...

  8. redis存储对象_redis内存优化总结

    本文主要参考<>一书,主要分为以下六个部分: 1.redisObject对象 2.缩减键值对象 3.共享对象池 4.字符串优化 5.编码优化 6.控制key的数量 一. redisObje ...

  9. 2021-10-01 REDIS全网最超级详细

    redis 编译安装 版本 redis-6.0.6 编译 wget http://download.redis.io/releases/redis-6.0.6.tar.gz tar -xvf redi ...

最新文章

  1. Failed to load module script: The server responded with a non-JavaScript MIME type of “text/plain“.
  2. jython在MyEclipse控制台出现Failed to install
  3. Android OpenGL射线拾取手势旋转(二)
  4. 【错误记录】Android 编译时技术版本警告 ( 注解处理器与主应用支持的 Java 版本不匹配 )
  5. FFLIb Demo CQRS
  6. 动手学无人驾驶(2):车辆检测
  7. 正则表达式 判断 连号如“123456”、同号如“888888”、连同号如“112233”“222333”...
  8. ubuntu16 kickstart pxe 安装系统
  9. VirtualBox中虚拟XP共享文件夹设置
  10. 如何成都报计算机考试,成都学院2017上半年计算机考试报名通知
  11. SQL Server常用的字符串/日期/系统函数
  12. 数学中有关c语言的知识点总结,七年级数学基本函数的基本知识点归纳
  13. word2007导出pdf带书签
  14. 惠普打印机换硒鼓图解_hp硒鼓怎么安装 hp硒鼓安装方法这图文教程】
  15. RCC_APB2Periph_AFIO的理解。。。重映射的一点心得
  16. 电脑任务栏应用图标变成白色怎么恢复
  17. 读书笔记--关键对话
  18. 超过1M的网络动图添加到微信表情包
  19. (二十四) 单链表的逆置(java)
  20. Debug签名时候数据正常正式签名的时候数据不正常,不显示,或者数据错乱问题

热门文章

  1. Dividing the numbers CodeForces - 899C (构造)
  2. 第4课 - 深入浅出处理器(续)
  3. 2016年第6本:简约至上--交互式设计四策略
  4. Android L(5.0)源码之图形与图像处理之动画——Frame、Tween、属性动画、SurfaceView...
  5. 设计模式 ( 十七 ):Observer 观察者模式 -- 行为型
  6. Python基础-python核心编程
  7. T-sql检测文件夹是否存在
  8. vs2010本地调试打不开网页
  9. 监控 线程 php,Linux平台PHP5.4设置FPM线程数量的方法
  10. uvc音频传输协议_干货|太全了!常见的音频接口,你知道几种?