厦门大学数据库实验室Redis数据库介绍报告人:罗道文导师:林子雨时间:2015年07月10日过渡页1目录Redis简介1Redis数据模型2Redis应用场景3Redis安装运行4Redis简介21RemoteDictionaryServer(Redis),即远程字典服务器2Redis是一个开源的,ANSIC语言编写,支持网络,基于内存亦可持久化的日志型的,Key-Value数据库3作者:SalvatoreSanfilippo,来自意大利西西里岛,任职于Pivotal4从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。数据类型3Redis支持5中数据类型:字符串对象(string)12列表对象(list)3哈希对象(hash)集合对象(set)有序集合对象(zset)45数据类型4sds数据类型5sds动态字符串6Sds动态字符串的定义:Sds动态字符串7图解sds:intlenintfreecharbuf[6]00060000‘h’‘e’‘l’‘l’‘o’‘0’structsdshdrsdsssds.c文件:Sds动态字符串8字符串操作:跳跃链表9Skiplist跳跃链表的定义:跳跃链表10跳跃链表11headerTailLevel3Length7-1-1-1771421212132373737717185跳跃链表12headerTailLevel3Length8-1-1-1771421212132373737717185353535跳跃链表13字典141234Dict字典的定义:字典15图解Dict:字典16字典操作:对象17redisObject的定义:对象18redisObject图解:19Redis执行流程:Redis事件:1、定时事件2、超时事件3、套接字读事件4、套接字写事件Redis执行流程:20当客户端发起一个连接时:21客户端服务器模型:Redis执行流程:22Redis执行流程:23当回复发给客户端后:Redis执行流程:应用场景241、排行榜相关一个很普遍的需求是各种数据库的数据并非存储在内存中,因此在按得分排序以及实时更新这些几乎每秒钟都需要更新的功能上数据库的性能不够理想。典型的比如那些在线游戏的排行榜,比如一个Facebook的游戏,根据得分你通常想要:-列出前100名高分选手-列出某用户当前的全球排名应用场景25Redis解决之道:模式是这样的,每次获得新得分时,我们用这样的代码:ZADDleaderboardscoreusername得到前100名高分用户很简单:ZREVRANGEleaderboard099。用户的全球排名也相似,只需要:ZRANKleaderboardusername。应用场景262、特定时间内的特定项目另一项对于其他数据库很难,但Redis做起来却轻而易举的事就是统计在某段特点时间里有多少特定用户访问了某个特定资源。比如我想要知道某些特定的注册用户或IP地址,他们到底有多少访问了某篇文章。应用场景27Redis解决之道:每次我获得一次新的页面浏览时我只需要这样做:SADDpage:day1:page_iduser_id当然你可能想用unix时间替换day1,比如time()-(time()%3600*24)等等。想知道特定用户的数量吗?只需要使用SCARDpage:day1:page_id。需要测试某个特定用户是否访问了这个页面?SISMEMBERpage:day1:page_id。应用场景28新浪微博:史上最大的Redis集群应用场景29技术需求:面对微博常常出现的热点,如最近出现了较为火爆的短链,短时间有数以万计的人点击、跳转,而这里会常常涌现一些需求,比如我们向快速在跳转时判定用户等级,是否有一些账号绑定,性别爱好什么的,已给其展示不同的内容或者信息。应用场景30普通采用memcache+Mysql的解决方案,当调用id合法的情况下,可支撑较大的吞吐。但当调用id不可控,有较多垃圾用户调用时,由于memcache未有命中,会大量的穿透至Mysql服务器,瞬间造成连接数疯长,整体吞吐量降低,响应时间变慢。原始解决办法:应用场景31Redis解决问题:这里我们可以用redis记录全量的用户判定信息,如stringkey:uidint:type,做一次反向的cache,当用户在redis快速获取自己等级等信息后,再去Mc+Mysql层去获取全量信息。如图:安装运行32redis下载:安装运行33Redis安装:1、解压:tarxzvfredis-stable.tar.gz2、进入目录:cdredis-stable3、编译:make4、安装:makeinstall安装运行34Redis服务器启动:安装运行35Redis客户端启动:谢谢