Redis介绍

redis 角色 redistherose_用户信息

Redis的全称是Remote Dictionary Server,它是由Salvatore Sanfilippo写的Key-Value存储系统。但它提供了比Key-Value更为丰富的数据结构,包括Lists、Sets、Ordered Sets以及Hashes,当然还有和Memcached一样的Strings结构;Redis当然还包括了对这些数据结构的丰富操作。Redis的优点可以总结为以下几点:

  • 性能极高,Redis能支持超过 100K+ 每秒的读写频率;
  • 丰富的数据类型,Redis支持二进制案例的 Strings、Lists、Hashes、Sets 及 Ordered Sets 数据类型操作;
  • 原子性,Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行;
  • 丰富的特性, Redis还支持 Publish/Subscribe、通知、Key过期等等特性。

redis 角色 redistherose_redis 角色_02

这些丰富的特性,使得Redis在DB-Engines 排名稳居第十,其中在Key-Value数据库中排名第一。

关于直播

redis 角色 redistherose_redis 角色_03

2015年到2016年,视频直播行业异军凸起,国内涌现了一批视频直播公司,如映客、一直播、熊猫TV、花椒等。直播行业的火爆与云计算和移动互联网的关系密不可分,云计算突破了视频直播技术的门槛;移动互联网使得直播随时随地成为可能。

redis 角色 redistherose_redis 角色_04

上图是直播系统的完整框架图。用户终端,如智能手机、PAD、电脑等,通过网路接入负载均衡,进而进入后端的服务器系统;在后端服务器上,有不同的应用模块,如用户管理、关注信息、聊天交互、视频编码、金币系统、推送系统、排名系统、录像管理,这些业务系统都是搭建在底层云计算上,用户可以使用云Redis、MySQL、CDN、离线计算等资源构建直播系统。

Redis应用介绍

下面来具体介绍Redis具体应用场景。

场景一:用户信息管理

redis 角色 redistherose_用户信息_05

在直播系统中,用户有很多信息需要管理,如登录信息、注册信息等。传统的方式是采用关系型数据库存储用户信息,定义一张用户表,用户的属性对应表的列,这种方式的可扩展性很差,当用户增加新属性时,需要修改数据库中的用户表、数据订正等操作;采用Redis数据库进行用户信息管理时,通过采用Hashes数据结构,如上表所示,在user9527的个人信息中选择user9527作为Key,同时每一行的用户信息是Hashes内的Field,用户新增加信息时,通过Hset命令向Hashes内新加一个Field,如hset user9527 name xiaoqiang;最后可以通过hgetall user9527获取用户信息。

应用场景二:关注列表

redis 角色 redistherose_数据结构_06

在直播系统中有很多关注链,如明星、游戏玩家等等。用户可以使用sets实现这类关注链,查看不同主播的关注信息。

如上图所示的Jack关注列表,通过调用sadd方法给jack_follow增加响应的value值,用户Jack多关注一个人,则多增加一个记录;同时也可以通过sadd my_follow增加我关注的列表;最后,通过sinter jack_follow my_follow得出两个关注表中的交集部分。

场景三:积分排行

redis 角色 redistherose_redis 角色_07

在直播系统中,需要实时更新积分排行榜,每个用户都有自己的积分和姓名信息。通过定义rank这个Key对应每个用户的积分,通过调用zadd增加对应用户的积分值,如 zadd rank 1000 Super;最后通过zrangebyscore zrank -inf +inf 遍历用户的key,得到指定范围内用户的积分,从而得到积分排行榜。

场景四:最新评论

redis 角色 redistherose_用户信息_08

在直播系统中,评论也是很关键的一部分,在Redis中可以通过Lists实现最新评论。如上图所示在Redis中定义latest.comment,当用户有评论时,调用Ipush增加用户的评论,如Ipush latest.comment “今天天气很好”;用户也可以调用 Irange latest.comment 0 2 获得最新评论。

除上述场景外,Redis还可以用在于:

  • PHP session信息
  • 数据库缓存加速
  • 点赞数、评论数目,通过Incr/decr进行数目增加或减少
  • 消息广播,通过Subscribe/publish订阅模式实现
  • 附件的人,redis 3.2中新增了附近的人功能

云数据库Redis实践

redis 角色 redistherose_Redis_09

Redis设计时单线程结构,进而导致了整个Redis存在性能瓶颈;另外,在单节点的场景下,机器宕机时,可用性面临着很大的问题;同时,由于Redis是全内存数据库,因此Redis内存受限于单机内存;当内存过大时,也会影响其使用情况,其可扩展性也面临着挑战。