`
youyu4
  • 浏览: 435526 次
社区版块
存档分类
最新评论

Redis几个认识误区

 
阅读更多

Redis几个认识误区

 

 

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

 

 

 

单台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会自动将热数据放入物理内存,冷数据交换到硬盘,另外一个知名的“理解了现代操作系统(3)”的Varnish就是这样实现,也取得了非常成功的效果。

 

      作者antirez在解释为什么要自己实现VM中提到几个原因(6)。主要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,详细方法见参考文献(7)。

 

 

 

 

使用aof代替snapshot

 

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

 

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

 

 

 

 

参考文献

1. On Designing and Deploying Internet-Scale Service(PDF)

2. Facebook’s New Real-Time Messaging System: HBase To Store 135+ Billion Messages A Month

3. What’s wrong with 1975 programming

4. Linux epoll is now supported(Google Groups)

5. CAS and why I don’t want to add it to Redis(Google Groups)

6. Plans for Virtual Memory(Google Groups)

7. Full of keys(Salvatore antirez Sanfilippo)

分享到:
评论

相关推荐

    redis基础认识与使用

    综上所述,Redis以其丰富的数据结构和高效的性能,广泛应用于缓存、计数、排行榜、发布/订阅系统等多个领域。学习和掌握Redis的基本概念和使用,对于提升应用性能和解决复杂问题具有重要意义。提供的参考资料可帮助...

    一个简单的支持多个db的redis连接池

    一个简单的支持多个db的redis连接池一个简单的支持多个db的redis连接池一个简单的支持多个db的redis连接池一个简单的支持多个db的redis连接池一个简单的支持多个db的redis连接池一个简单的支持多个db的redis连接池一...

    REDIS_redis的工具包_redisinlabview_labviewredis_labview调用redis_redis

    在LabVIEW中,调用Redis主要涉及以下几个步骤: 1. **连接Redis服务器**:首先,需要创建一个连接到Redis服务器的VI,这通常涉及到设置服务器地址、端口号、超时时间等参数。 2. **执行命令**:连接成功后,可以...

    redis和redisdesktop

    4. **主从复制**:Redis支持主从复制,可以将一个Redis实例的数据复制到多个从实例,实现读写分离,提高系统的读取性能。 5. **事务**:Redis提供了简单的事务功能,允许多个操作在原子性下执行,确保数据一致性。 ...

    Windows版 Redis 5.0.14

    Redis 是一个开源的内存数据结构存储系统,常被用作数据库、缓存和消息代理。在Windows环境下,Redis 的安装和使用与在Linux系统中有所不同。这里我们将详细讨论Windows版Redis 5.0.14的相关知识点。 1. **Redis ...

    StackExchange.Redis Redis客户端

    最近需要在C#中使用Redis,在Redis的官网找到了ServiceStack.Redis,最后在测试的时候发现这是个坑,4.0已上已经收费,后面只好找到3系列的最终版本,最后测试发现还是有BUG或者是我不会用。没有办法,最好找到了...

    redis-5.0.3 redis-5.0.4 redis-5.0.5

    redis-5.0.3 redis-5.0.4 redis-5.0.5

    redis-windows-redis7.0.5.zip

    在Windows环境下运行Redis,通常需要安装一个兼容的二进制版本,这个压缩包可能包含了所有必要的文件,如服务配置、启动脚本、二进制可执行文件等,使得用户能在Windows操作系统上顺利搭建和使用Redis服务器。...

    redis-5.0.4.tar.gz下载及redis安装过程

    9: make install之后,cd /usr/local/redis/bin得到如下几个文件 redis-benchmark 性能测试工具 redis-check-aof 日志文件检测工(比如断电造成日志损坏,可以检测并修复) redis-check-dump 快照文件检测工具,效果...

    redis客户端连接工具 RedisDesktopManager

    1. **什么是Redis**:Redis是一个开源的、基于键值对的数据存储系统,支持多种数据结构,如字符串、哈希、列表、集合、有序集合等。它以内存中的数据作为主要存储方式,同时提供了持久化功能,确保数据在断电后不会...

    Redis实战Redis实战

    《Redis实战》这本书深入浅出地探讨了Redis这一高性能、键值存储系统在实际应用中的各种技巧和策略。Redis作为一款内存数据结构存储系统,因其快速的数据读写能力,广泛应用于缓存、消息队列、计数器以及分布式锁等...

    redis缓存 redis缓存

    redis缓存 redis缓存

    redis在win上的运行脚本redis.bat

    下载完成后,你会得到一个包含多个文件的压缩包,其中包括`redis-server.exe`(Redis服务器)、`redis-cli.exe`(Redis命令行客户端)以及其他辅助文件。`redis.bat`脚本通常位于解压后的根目录下,它的作用是启动...

    redis校验工具redis-full-check

    `redis-full-check` 工具主要功能包括但不限于以下几个方面: 1. **键空间一致性检查**:工具会比较不同 Redis 实例间的键空间,查找并报告任何不一致的键或值,确保数据的一致性。 2. **键过期检查**:检查已过期...

    redis-windows-7.0.11

    其中最常用的是redis-windows,它是一个Windows下的Redis管理工具,可以方便地安装、配置和管理Redis服务器。 redis-windows提供了一个简单易用的界面,可以让用户轻松地启动、停止和重启Redis服务器,以及管理...

    redis 免安装 redis客户端 redis-desktop-manager-0.8.8.384

    Redis 是一个高性能的键值数据库,它以键值对的形式存储数据,广泛应用于缓存、消息中间件、实时分析等领域。在 Windows 环境下,通常需要通过安装过程来设置 Redis 服务,但这里提供的资源是“redis 免安装”,意味...

    Redis使用教程,详解

    Redis 是一个高性能的 NoSQL 键值存储数据库,广泛应用于缓存、任务列表、网站访问统计数据、过期处理、应用排行榜、分布式集群架构中的 session 分离等领域。下面是 Redis 的详细使用教程。 NoSQL 概述 NoSQL,即...

    windows版Redis1

    标题“windows版Redis1”表明我们讨论的是一个适用于Windows操作系统的Redis安装包。这个压缩包包含了运行和管理Windows上的Redis所需的所有基本组件。 描述中提到,这个Windows版本的Redis可以直接解压后使用,这...

    Redis使用+redis工具

    Redis的使用通常涉及以下几个方面: 1. **安装与启动**:首先,你需要下载Redis的源码,通过编译和安装在你的操作系统上部署Redis服务器。启动Redis服务时,可以使用`redis-server`命令。 2. **客户端连接**:...

Global site tag (gtag.js) - Google Analytics