Redis的概述以及与memecached的区别

Posted 刘Java

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis的概述以及与memecached的区别相关的知识,希望对你有一定的参考价值。

详细介绍了Redis的概念,以及与memecached的区别。

1 redis的概述

Redis (Remote Dictionary Server)是用C语言编写的一个开源(BSD许可)的,内存中的数据结构存储系统,它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。

Redis 的数据读写操作都是基于内存的,也就是它是内存数据库(也支持持久化),所以读写速度非常快,Redis能读的速度是110000次/s,写的速度是81000次/s,因此 Redis 被广泛应用于缓存方向。不仅仅是性能很强,Redis 也经常用来做分布式锁(Distributed locks),甚至是简单的消息中间件。

Redis 还内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) ,Pub/Sub,key过期时间(Keys with a limited time-to-live),管道(pipeline)和不同级别的磁盘持久化(persistence)等功能的支持, 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。

Redis的主要缺点是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。

2 redis和 memecached有什么区别?

相同点:

Redis和Memcached都是将数据的缓存在内存中,都是基于内存的数据库,性能都非常高。Redis和Memcached都支持key过期策略。

不同点:

  1. 网络IO模型
    1. memcached是多线程的,非阻塞IO复用网络模型。分为 listener主线程 和 worker子线程,listener线程监听网络连接,接受请求后将连接描述字pipe传递给worker(一般的高复用都是这种处理方式),进行读写IO,网络层使用的libevent封装的事件库,多线程模型可以发挥多核作用,但是也引入了cache coherency 和 锁的问题,比如:memcached最常用的stats命令,实际memcached所有的操作都要对这个全局变量加锁,进行计数等工作,这会带来性能损耗。
    2. Redis 使用单线程的多路 IO 复用模型(Redis 6.0 引入了多线程 IO )。自己封装了一个简单的AeEvent事件处理框架(可以去看源码哦C++丢了好久,马马虎虎磕磕碰碰的看了一点),主要实现了epoll,kquue 和 select,对于单存只有 IO操作来说,单线程可以将速度发挥大最大优势,但是redis也提供了简单的计算功能,比如排序、聚合等,对于这些操作,单线程模型会严重影响整体的吞吐量,CPU计算过程中,整个IO调度都是被阻塞的。
  2. 数据类型支持
    1. memcached只支持key-value类型。在内存中维护一张巨大的Hashtable,使得对数据的查询复杂度降低到O(1),保证了对数据访问的高性能
    2. Redis不仅支持简单的k/v类型,同时还提供list,set,hash等数据结构的存储;
  3. 数据存储及持久化
    1. memcached不支持内存数据的持久化操作,所有的数据都存储在内存中,重启之后数据丢失。
    2. Redis 支持数据的持久化,可以将内存中的数据按照指定的方式存储在磁盘中,重启之后可以再次加载到内存中进行使用,因此redis也支持灾难恢复,数据丢失后可以通过持久化文件恢复,因此Redis也支持master-slave模式的数据备份。redis提供了两种不同的持久化方法来讲数据存储到硬盘里面,一种是RDB(Redis DataBase),它可以将存在于某一时刻的所有数据都以快照(snapshotting)的形式写入硬盘里面,即全量备份。另一种方法叫AOF(append-only file, AOF) 只追加文件,它会在执行写命令时,将被执行的写命令复制到硬盘里面,即日志记录。
  4. 数据一致性
    1. Memcached提供了cas命令,可以保证多个并发访问操作同一份数据的一致性问题。
    2. Redis没有提供cas 命令,但Redis是单线程操作数据,不存在并发的问题,并且Redis提供了事务的功能,可以保证一串命令的原子性,中间不会被任何操作打断。
  5. 内存满了的处理
    1. Memcached 在内存使用完之后,会使用LRU策略来剔除掉一些数据,无法指定其他策略。
    2. Redis当服务器内存用完时,可以使用更多的内存淘汰策略,清除掉那些占用内存并且使用不太频繁的数据。可选策略有noeviction、allkeys-lru、volatile-lru、allkeys-random、volatile-random、volatile-ttl。
  6. 过期数据清理策略
    1. Memcached 过期数据的删除策略只用了惰性(消极)删除。
    2. Redis 同时使用了惰性删除与定期(积极)删除。
  7. value大小
    1. redis的value最大可以达到512MB,实际上不同的类型的value都是字符串,只不过格式不一样。
    2. memcached的value默认最大是1MB,但可以通过修改配置调整大小。
  8. 集群
    1. Memcached 没有原生的集群模式,需要依赖客户端实现,首先在客户端中计算出该条数据在集群中的目标结点,然后往该节点写入数据。
    2. Redis3.x 版本中,支持服务器 Cluster 模式,支持分布式存储,自动将数据进行分片,每个 master 上放一部分数据,客户端的工作量很少;提供内置的高可用支持(master+slave),部分 master 不可用时,还是可以主从切换继续工作的。

如有需要交流,或者文章有误,请直接留言。另外希望点赞、收藏、关注,我将不间断更新各种Java学习博客!

以上是关于Redis的概述以及与memecached的区别的主要内容,如果未能解决你的问题,请参考以下文章

Redis&mencache的区别

Memcache 与Redis 的区别都有哪些?

redis和memcache的区别

Memecached缓存原理及基本操作分布式(一致性hash)

redis 和 memcached 的区别

Memecached 服务器安装