Redis在大数据中的应用

 导读

redis是一个基于内存的key-value数据库,相对关系型数据库支持的数据结构更丰富,而且操作封装的非常简单易用。redis也支持主从、分布式、数据持久化等特性。

   redis在业务系统中经常用作缓存系统,即把热点数据或高频数据存到Redis,降低底层数据库负载、提高应用吞吐率;redis灵活的数据结构也能解决特定大数据统计中的痛点,这里结合实际项目,举些典型应用场景,以及个人的理解,当然也是蜻蜓点水,泛泛而谈,希望大方向上能对大家有所帮助,当然有不正之处也请不吝赐教。

Sets

集合的最主要特征是成员唯一性,最常用场景是一些涉及到去重的计算,比如UV计算(去重用户数):每次当用户活跃时简单的调用SADD命令向集合添加UID,然后实时的用SCARD获取元素个数。还支持多个集合之间的交集(SINTER)、差集(SDIFF)和并集( SUNION)运算,交集操作可以很便捷的计算留存率:(今日集合∩昨日集合)/昨日集合。集合是通过哈希表实现的,所以添加、删除、查找的复杂度都是O(1),即复杂度和元素个数无关。

Sorted sets

    有序集合相比集合每个成员多了分数属性,成员会按照分数自动从小到大排序,当然和集合类似,成员也是唯一不重复的。常用查询方法:排名在指定范围的成员、分数在指定范围内的成员。应用场景:

1、TOPN排名,商品浏览量作为排名指标,实时查询TOPN的商品列表,其实现过程是:商品每次被访问时,用ZINCRBY增加商品浏览量,实时用ZREVRANGE key 0 N-1返回集合中TOPN的商品。

2、30分钟在线用户数,APP、WEB都有统计最近在线用户数的需求,是衡量产品当前活跃度的重要指标,有序集合也可以很容易实现:以登录时间戳作为用户分数,每次登录时更新用户分数,“ZADD key 登录时间戳 UID”,然后用“ZCOUNT key 30分钟前时间戳 now时间戳”命令查询最近登录用户数

     有序集合是通过跳表和散列表两个数据结构实现的,添加、删除元素都会执行O(log(N))的操作(N是集合的元素个数)。有序集合的关键是在对分数这个属性的理解上,从合适的角度看问题,会达到事半功倍的效果。

Bitmaps

Redis允许使用二进制的数据作为Key(binary keys) 和二进制的数据作为Value(binary values),bitmap就是用二进制的数据作为value。bitmap不是一个新的数据类型,而是在String类型上进行的扩展,相关的命令有setbit、getbit、bitcount等。

SETBIT key offset value:设置key在第offset处的bit值(只能是0或1)

GETBIT key offset:对key所存储的值,获取指定offset位置的bit位(结果是0或1)

BITCOUNT key:计算key所存储的值,被设置为1的bit位数量

上面提到集合统计UV的例子,如果是大数据量的统计,会占用很大内存空间,如一个上亿用户量的网站,消耗的内存也很恐怖。bitmap也同样可以实现UV统计:当有用户活跃时,只需设置该用户所在bit位为1,而计算UV数就是统计所有bit位为1的数量。比如用户10086的用户活跃:SETBIT key 10086 1,获取某天的DAU:GETBIT key。

bitmap处理大数据的排序、查询效率非常高而且能节省极大内存空间,最大1亿的偏移量大约占用12M内存,但也有几个显而易见缺点:1、元素是否能简单的映射为偏移量,就是待统计的元素是否能映射为Long类型  2、消耗的空间取决于最大偏移量,和基数无关。

HyperLogLog

不像SET和Bitmaps是精确统计的,HyperLogLog(HLL)是一个概率数据结构,用于估计一个集合内的基数(元素个数),又叫基数统计。其统计是有误差的,可能会比实际稍微多一些或者稍微少一些,但会控制在合理的范围内,如果对误差是可接受的,HyperLogLog是一个最佳选择。假设是UV计算,每次用户活跃时,用PFADD添加元素到HLL,随时用PFCOUNT查看集合的基数,就可以实时统计UV。因为不会将元素真正添加到HLL,所以不能判断一个元素是否在HLL里存在。

Hashes

    一个Hash类型有多个字段(属性),很像一个对象,但Hashes字段数量是没有限制的。一般是把一类数据放到一个key里,然后通过字段表示不同含义。

常用命令:HMGET:一次获取多个hash字段的值

HINCYBY:增加hash字段的值,用于计数

原子操作

redis单个命令都是原子操作,比如INCY,多客户端对同一个key进行INCY操作的情况下,不会发生客户端1读取key值1,客户端2同时读取key值1,然后客户端1和客户端2都对key进行加一操作,设置key的值为2;比如MSET,给多个key赋值,要么都设置成功,要么都设置失败,不会存在一部分key设置成功,一部分可以设置失败的情况

总结

在大数据分析架构里,一般是spark、storm作为计算框架,计算后的结果存到redis。要对redis的数据结构有清晰认识,理解各自优缺点、实用场景,redis价值才能最大化。

本文首发于公众号:data之道

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,755评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,369评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,799评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,910评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,096评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,159评论 3 411
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,917评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,360评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,673评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,814评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,509评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,156评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,123评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,641评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,728评论 2 351

推荐阅读更多精彩内容