深入了解Redis


文将主要从Redis适用范围,与Memcached, Java容器对比,核心功能(Pipelining,

Pub/Sub,LRU,Transactions, Persistence, Replication),分布式架构设计,Cluster,

内部实现及数据结构来深入了解Redis,适用于已经了解并有Redis操作经验之程序员

1. Redis介绍 

REmote DIctionary Server(Redis)是一个开源(BSD协议)的,使用ANSI C语言编写

基于内存in-memory数据存储结构,可以当作NoSQL数据库,缓存和消息代理来使用。支持

多种数据结构,包括string, hashes, lists, set, sorted sets, bitmaps, hyperloglogs等。此外,

Redis还支持内置replication, LRU (Least Recently Used )算法管理缓存,Pub/Sub,部分

原子性操作,简单事务支持,基于磁盘的数据持久化以及3.0实现了分布式Redis支持HA,

久违的Redis Cluster。从2013年5月开始,Redis的开发由Pivotal公司主持。

2. Redis之父Antirez

饮水思源,Redis之父Salvatore Sanfilippo, 一名来自意大利西西里岛(Sicily)出生于

1977年的程序员,网名Antirez, 常居住于Catania。Antirez的IT职业生涯开始于系统管理员,

IT安全,并于Web 2.0的年代创立一家web网络公司,主要开发社交应用。之后,在一次实时

统计分析产品开发中,为了节省成本以及高性能扩展性,Antirez意识到需要一种支持多种复杂

数据结构的in-memory数据库,并且支持快速操作。Redis就此诞生并开源。之后,VM慧眼相

中了Redis, 并雇佣Antirez去全职开发,而之后又衍生出Pivotal公司,Antirez则继续主持Redis

开发。

3. Redis适用场景 

Redis通常被大家称为数据结构服务器,一种轻量级K/V数据存储,如我们上文介绍,支持丰富

的数据类型。Redis以其速度而闻名,这使得其称为某一特定领域适用的最优选择。

那请问大家是在什么场景下选用Redis呢?有小伙伴说大多数情况是大量数据需要缓存吧。

那又请问这种情况为什么不用Memcached呢?又或者干脆选择Java自带容器ArrayList, HashMap,

ConcurrentHashMap, HashSet呢?我们带着这两个问题往下看。


3.1 互联网/社交

Redis的用户多为互联网公司如Twitter, Weibo(微博), Uber, StackOverflow, Airbnb, Alibaba等。

对于社交网站Twitter, Weibo,这些网站主要使用Redis进行高效的社交关系管理,缓存用户好友,

粉丝,关注等,并且可以通过Redis内置数据模型快速计算共同好友等。


我们先看各大社交网站Twitter, Weibo(微博是国内最大的Redis用户)。这些网站的每个用户都有

好友,粉丝,关注等,并且可以相互查看共同好友等。Redis可以用来帮助高效管理这些社交关系, 

如求共同好友:


如上,Redis很方便的使用有序集合的交集功能实现。其中user:100000:follow为用户1的粉丝列表,

user:200000:follow为用户2的粉丝列表,out:100000:200000为交集共同好友列表。

又如另一个常用场景,电商各种计数,如商品维度计数(关注度,喜欢数,评论数,浏览数等)。

可以采用Redis的Hash类型,并借助其原子性操作来维护计数。


用户维度计数(动态,关注数,粉丝数,发帖数等


当然除了这些互联网用途,Redis最常用的功能还是被当作缓存。提到缓存,大家当然会想到memcached。

Redis v.s. Memcached

  • 数据类型与操作:Redis拥有更多丰富的数据结构支持与操作,而Memcached则需客户端自己处理并进行网络交互


  • 内存使用率:简单K/V存储,Memcached内存利用率更高(使用了slab与大小不同的chunk来管理内存),而如果采用Redis Hash来存储则其组合压缩,内存利用率高于Memcached

  • 性能:总体来说,二者性能接近;Redis使用了单核(单线程IO复用,封装了AeEvent事件处理框架,实现了epoll,kqueue,select),Memcached采用了多核,各有利弊;当数据大于100K的时候,Memcached性能高于Redis

  • 数据持久化:Redis支持数据文件持久化,RDB与AOF两种策略;Memcached则不支持

  • 分布式:Memcached本身并不支持服务器端分布式,客户端只能借助一致性哈希分布式算法来实现Memcached分布式存储;当然Redis也是从3.0版本开始才支持服务器端cluster的,重要的是现在支持了。

  • 其他方面:Redis提供其他一些功能,如Pub/Sub, Queue, 简单Transacation, Replication等。

好了,千言不抵一图:



Redis v.s. HashMap

作为单机数据缓存,Java自带容器也是备选方案之一。我们进行压力测试,采用ConcurrentHashMap, Memcached(假设近似于Redis), MySQL进行Benchmark。


具体数据如下:


可以看出,HashMap(上图显示为一根线)整体操作插入/查询/移除都 25 - 90倍快于Memcached/Redis; 而Memcached/Redis又 5 -12 倍快于MySQL InnoDB,符合预期。究其原因,Java容器单机内存直接读取,无网络开销,无须序列化等。

而反之之所以要用Redis的原因与好处则包括:


HashMap单机受限于内存容量,而正是Redis分布式之优势

  • HashMap当数据量超过一定限制后,需要妥善管理堆内存,不然会造成内存溢出或者Memory Leak;Redis则具备了文件持久性,以及Failover达到HA.

  • HashMap只能受限于本机,而Redis天生分布式,可以让多个App Server访问,负载均衡。

所以Redis适合全部数据都在内存的场景包括需要临时持久化,尤其作为缓存来使用,并支持对缓存数据进行简单处理计算;如涉及Redis与RDBMS双向同步的话,则需要引入一些复杂度。


4. Redis核心功能  

  • 5
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值