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复用网络模型,即多线程Reactor模型。。分为 listener主线程 和 worker子线程,listener线程监听网络连接,接受请求后将连接描述字pipe传递给worker(一般的高复用都是这种处理方式),进行读写IO,网络层使用的libevent封装的事件库,多线程模型可以发挥多核作用,但是也引入了cache coherency 和 锁的问题,比如:memcached最常用的stats命令,实际memcached所有的操作都要对这个全局变量加锁,进行计数等工作,这会带来性能损耗。
    2. Redis 使用单线程的多路 IO 复用模型,即单线程Reactor模型,自己封装了一个简单的文件事件处理器。单线程避免了线程切换的开销,并且实现起来比较简单,该特性还使得Redis被用于实现分布式锁,但是Redis 6.0 引入了多线程,主要是用于提升在网络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学习博客!

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘Java

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值