沃梦达 / IT编程 / 数据库 / 正文

redis入门介绍及社交行业应用

背景最近工作中开始使用redis,本文就本人目前的理解对redis做一个概括性的介绍,并简单举例几个工作中的应用,最后总结redis使用中的规范,期望以比较全面的方式整理redis相关知识给大家。redis介绍Redis(Remot...

背景

最近工作中开始使用redis,本文就本人目前的理解对redis做一个概括性的介绍,并简单举例几个工作中的应用,最后总结redis使用中的规范,期望以比较全面的方式整理redis相关知识给大家。

redis介绍

Redis(Remote Dictionary Server)可以理解是一个基于内存的key-value存储数据结构。“基于内存”表示所有数据直接存在内存中,拥有较快的IO速度,“基于key-value”表示它很适合与基于key的查找操作,达到O(1)的复杂度。

redis拥有简单key-value数据结构存储功能,主要数据结构包括string、hash、set、list、zset和不常见的复杂数据结构bitmap和Hyperloglogs。

下面列举不同数据结构的操作来加深对redis提供数据结构的理解:

1、string数据结构
set  box  “hello"   (添加元素,表示设置key为box,value为hello)
get box  (获取key为box对应的value值)

2、list数据结构
LPUSH friends “sandy”  (向列表左边加入元素)
RPUSH friends “bruce"    (向列表右边加入元素)
LRANGE friends 0 -1  (两个参数,左右封闭,第二个参数-1表示显示所有元素)
LLEN friends    (返回list的长度)
LPOP friends  (删除左边元素,并返回该值)
RPOP friends  (删除右边元素,并返回该值)

可以应用list数据结构实现队列和栈的效果

3、set数据结构(同一个key里面的元素集合没有重复)
SADD home_member “xwc"  (添加元素)
SREM home_member “xwc”  (删除元素)
SISMEMBER home_member “xwc”  (判断是否存在xwc,存在返回1,不存在返回0)
SMEMBERS home_member   (返回set中所有元素)
SRANDMEMBER key [count]  随机返回count个数元素
SUNION  A B  (将A,B集合放一起)

4、hash数据结构
命令结构:HSET key field value
HSET user name "John Smith”    (给key为user,属性为name的字段赋值John Smith)
HSET user email "john.smith@example.com"   (给key为user,属性为email的字段赋值john.smith@example.com)
HGETALL user    (获取key为user的所有属性值)
HINCBY user age 5    (给key为user,属性为age的值加上5)

5、zset数据结构
命令结构:ZADD key score value
ZADD xwc 112 "apple”  (设置key为xwc,value为apple,分数score为102分,zset会根据score字段排序)
ZADD xwc 120 "banana”   (同上)
ZRANGE xwc 0 -1  (返回key为xwc,value为从小到大排序的集合所有元素)
zrevrange xwc 0 2 (返回按分数从大到小排序的前3个元素)

redis应用

相对于传统关系型数据库,redis具有简单数据结构、单线程,内存存储和支持高并发的特点,适合很多社交应用。

1、指标计数

社交应用一般会有帖子广场(feed 流),可以实时采集用户行为信息日志,对每个帖子的点击、点赞、转发、分享哥和曝光进行计数统计。

使用hash数据结构可以对不同feedID的几个属性指标统计。

2、排行榜

排行榜例如feed热门榜需要实时计算热度,根据热度来排名。redis的zset数据结构就非常合适,因为zset的每一个元素都有score,可以更新score来实现排行榜功能。

具体实现有两种:

  • 离线计算,使用一个list来维护需要排序的候选集,定时对list里面的元素计算score更新zset。
  • 实时计算,使用flink、spark streaming实时消费用户对帖子的行为日志,对新行为帖子计算score分数。实现较复杂,但是几乎实时更新帖子榜单。
3、过滤与去重

使用redis存储用户访问帖子历史记录来实现去重功能。

4、热门数据存储

数据如果分为冷热,将热数据放到redis,当访问数据时如果redis没有则可以从传统数据库读取。利用redis内存存储访问快的特点来优化服务性能。

5、记录近一段时间信息

很多时候我们只需要保留最近2天活跃的用户信息,这个时候可以使用zset数据结构,score使用用户最近访问的timestamp,这样可以根据score维持两天内用户信息,超过2天的删除。

6、pub/sub 消息订阅发布

Redis的Pub/Sub非常非常简单,运行稳定并且快速,支持模式匹配,能够实时订阅与取消频道。redis与kafka的pub/sub不同之处在于没有持久化,如果订阅者挂掉,那么在从挂掉到恢复后这段时间的消息是丢失的,所以redis适用于可以容忍丢失消息的场景。

7、队列功能

redis支持阻塞队列,list列表没元素的时候阻塞,实现一个功能简单的messaging系统。

8、好友关系存储

redis简单的数据结构适合存储一对多关系,如用户关注列表,用户粉丝列表。

9、缓存数据

相对于存在磁盘,如果数据量不是很大,存在内存存储redis能加速读写效率。

关于redis常见问题?

这里整理了几个认识redis过程的常见问题:

redis为什么这么快?
  • 纯内存,类似于HashMap结构,HashMap的优势就是查找和操作的时间复杂度都是O(1);
  • 数据结构简单,读写数据量小
  • 单线程处理,减少线程上下文切换开销,省去考虑同步问题
  • 多路IO复用(多路是处理多线程连接,IO复用是重复使用一个线程执行请求)

因为是单线程处理每次执行,cpu不是redis程序的瓶颈,反而内存最可能是瓶颈。

redis能不能持久化?

能,支持RDB和AOF持久化。

  • RDB:定时执行快照保存内存中数据到本地磁盘,直接将databases中的key-value的二进制形式存储在了rdb文件中。

    优点:性能较高,因为是快照,且执行频率比aof低,而且rdb文件中直接存储的是key-values的二进制形式,对于恢复数据也快。
    缺点:在上一次快照和下一次快照之间宕机,这个时间段之内的数据丢失。

  • AOF(Ahead of File):redis将对数据的每一条修改命令追加到aof文件中。
    **优点:**宕机后数据能从AOF文件中获取,数据没有丢失。
    **缺点:**性能较低,因为每次修改操作都会将追加到AOF文件。

关于redis持久化信息可参考:RDB+AOF

redis是否支持分布式?

支持,这是在redis 3.0之后开始支持集群模式部署。 一个Redis 集群包含 16384 个哈希槽(hash slot),数据库中的每个key都属于这 16384个哈希槽的其中一个(会根据key计算crc16的hashcode,然后对16384取模),集群中的每个节点负责处理一部分哈希槽。 例如一个集群有三个节点,其中:

  • 节点 A 负责处理 0 号至 5500 号哈希槽。
  • 节点 B 负责处理 5501 号至 11000 号哈希槽。
  • 节点 C 负责处理 11001 号至 16384 号哈希槽。

如果有新节点加入或退出,可以根据一致性hash算法来重新平衡槽的分布。

redis一共支持三种模式:主从模式、sentinel模式和cluster模式,其中集群模式就是纯分布式的,扩展性好。

redis与memcache的区别?

redis和memcache读写性能和存储效率相当,此外还有如下不同:

redis memcache
数据结构 支持多种数据结构 只支持key-value数据结构
集群模型 支持 不支持
数据持久化/同步 支持 不支持
网络IO模型 多线程 单线程IO复用
数据一致性 通过事物支持 通过CAS支持

参考:

Redis应用场景
也谈谈 Redis 和 Memcached 的区别

本文标题为:redis入门介绍及社交行业应用