您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > Redis常用应用场景及案例分享
Redis常用应用场景及案例分享2015年11月25日fang.com通用技术组-张晓明提纲一:Redis简介简介特性使用场景适用场景如何突破物理内存限制二:Redis常用应用场景九大常用场景三:Redis应用案例排行榜服务验证码服务计数器服务数据存取服务综合应用(寻鹿项目)fang.com通用技术组一、Redis简介fang.com通用技术组REmoteDIctionaryServer(Redis)是一个由SalvatoreSanfilippo写的key-value存储系统。Redis提供了丰富的数据结构,特点是高性能,持久存储,适用于高并发的应用场景。1.高性能Redis能支持超过10w+每秒的读写频率。2.丰富的数据类型Redis支持二进制的Strings,Lists,Hashes,Sets及SortededSets数据类型操作。3.原子性Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行(multi、watch机制)。4.丰富的特性Redis还支持publish/subscribe,通知,key过期等特性。一、Redis简介fang.com通用技术组Redis使用场景缓存场景可以对key设置TTL,也就是数据可以到期自动淘汰。缓存?or数据持久存储?持久化存储不对key设置TTL,数据全量存储到内存,并且会依据一定的策略dump到磁盘(RDB或AOF)一、Redis简介fang.com通用技术组Redis适用场景Redis虽然既可以作为缓存也可以作为数据库存储使用,但是并不意味redis是万精油。请求量大对于访问量大的使用场景,可以考虑使用,一般至少是2000以上的QPS(对于较小的数据,单个redis实例可以支持9-10WQPS)。如果是写多读少,并且写请求是由上游导入数据而产生,则说明redis的读请求很少,让redis太过空闲实属浪费读写频繁多种数据结构Redis支持多种数据结构,可以通过string/list/hash/sort/zsort完成一些比较复杂的功能,用得最频繁的是string和hash使用复杂的数据结构一、Redis简介fang.com通用技术组Redis如何突破物理内存限制1.sharding/pre-sharding(分片/预分片)Redis的分片技术是指将数据分散到多个Redis实例中的方法,分片之后,每个redis拥有一部分原数据集的子集。优点:1)从存储能力的角度,分片技术通过使用多台计算机的内存来承担更大量的数据,redis的存储能力将突破单台主机的内存大小。2)从计算能力的角度,分片技术通过将计算任务分散到多核或者多台主机中,能够充分利用多核、多台主机的计算能力。部署:1)客户端做分片:在客户端确定要连接的redis实例,然后直接访问相应的redis实例2)在代理中做分片:客户端并不直接访问redis实例,由代理转发请求和结果;其工作过程为:客户端先将请求发送给代理,代理通过分片算法确定要访问的是哪个redis实例,然后将请求发送给相应的redis实例,redis实例将结果返回给代理,代理最后将结果返回给客户端。(Redis集群出现前推荐的方式)一、Redis简介fang.com通用技术组3)在redis服务器端做分片:“查询路由”,客户端随机选择一个redis实例发送请求,若所请求内容不再此redis实例再转交请求给正确的redis实例;有的实现中,redis不转发请求而是将正确redis信息发给客户端,由客户端直连redis(类似SOA方式)缺点:1)通常无法支持涉及多键的操作,如求交集等操作。2)事务操作中涉及多个键时也不能用3)分片将导致数据处理更加复杂,如数据备份、扩容和缩容预分片技术:开始时就启动足够多的redis实例等到后续需要扩容的时候,只需要将其中一部分的redis实例转移到新增加的机子上即可1)在新机子上启动新的redis实例;2)将新redis实例作为slave原实例作为master,从原redis实例迁移到新redis实例上;3)停止客户端(分片操作在客户端上时)或代理服务器(分片操作在代理上)4)更新客户端或者代理服务器中的配置信息,去掉被迁移的原redis实例的ip和端口等信息,加上新启动redis实例的IP地址和端口;5)向新启动的redis发送SLAVEOFNOONE命令,终止新redis实例对原实例的从属关系;6)重启客户端程序或者代理程序,此时它们将会使用新的redis实例;7)关掉被迁移走数据的原redis实例;一、Redis简介fang.com通用技术组2.VirtualMemory(Redis2.0~2.4)通过配置,可以让用户设置最大使用内存,当超出这个内存的时候,通过LRU(LeastRecentlyUsed)类似算法,将一部分数据存入文件中,在内存中只保存使用频率高的数据(value)相关配置选项vm-enable、vm-max-memory、vm-pages、vm-page-size、vm-max-threads官方的建议1)当你的key很小而value很大时,使用VM的效果会比较好.因为这样节约的内存比较大.2)当你的key不小时,可以考虑使用一些非常方法将很大的key变成很大的value,比如你可以考虑将key,value组合成一个新的value.3)最好使用linuxext3等对稀疏文件支持比较好的文件系统保存你的swap文件.4)vm-max-threads这个参数,可以设置访问swap文件的线程数,设置最好不要超过机器的核数.如果设置为0,那么所有对swap文件的操作都是串行的.可能会造成比较长时间的延迟,但是对数据完整性有很好的保证.参考:一、Redis简介fang.com通用技术组3.RedisCluster(Redis3.0)1)节点自动发现2)slave-master选举,集群容错3)AutomaticResharding:自动分片(hashslot)Redis集群中内置了16384个哈希槽,当需要在Redis集群中放置一个key-value时,redis先对key使用crc16算法算出一个结果,然后把结果对16384求余数,这样每个key都会对应一个编号在0-16383之间的哈希槽,redis会根据节点数量大致均等的将哈希槽映射到不同的节点。当需要增加节点时,只需要把其他节点的某些哈希槽挪到新节点当需要移除节点时,只需要把移除节点上的哈希槽挪到其他节点就行了;4)集群管理:clusterxxx5)基于配置(nodes-port.conf)的集群管理6)ASK转向/MOVED转向机制.二、Redis常用应用场景fang.com通用技术组1.取最新N个数据的操作2.排行榜应用,取TOPN操作3.需要精准设定过期时间的应用4.计数器应用5.Uniq操作,获取某段时间所有数据排重值6.实时系统,反垃圾系统7.Pub/Sub构建实时消息系统8.构建队列系统9.缓存三、Redis应用案例fang.com通用技术组1.排行榜(场景1、2)后台设置、前台调用和获取rs:ra:%s:confhash例:rs:ra:test:confrs:ra:%s:setSortedSet例:rs:ra:test:set新闻列表、热门话题、投票zaddrs:ra:test:set509500088zaddrs:ra:test:set1009500089zaddrs:ra:test:set2009500099zscorers:ra:test:set9500088zRevRangeByScorers:ra:test:set10000hMget、zAdd、zScore、zIncrBy、zRevRange(参数为索引-倒序)、zRange(参数为索引-正序)、zRevRangeByScore(参数为分数)、zRangeByScore(参数为分数)三、Redis应用案例fang.com通用技术组2.短信验证码服务(场景3)要点1)前端控制获取验证码的频率2)后端提供接口:获取验证码及校验验证码过程1)获取验证码先尝试获取,看是否已经存在get“rs:vc:13511111111”;如果存在则直接调用短信通道通过解密将明文码发给手机如果不存在需要生成随机明文,将明文加密后的值存到rs:vc:13511111111里,同时设置过期时间即setex“rs:vc:13511111111”[有效期][加密码]setex成功后将明文码发到号码为13511111111的手机上2)验证参数为手机号码和用户输入的明文码get“rs:vc:13511111111”;解密与明文码比对。三、Redis应用案例fang.com通用技术组3.计数器服务(场景4)后台设置、前台调用和获取rs:co:%s:confhash例:rs:co:test:confrs:co:%s:setset例:rs:co:test:setrs:co:%s:d:%sstring例:rs:co:test:d:9500088投票、点击、顶踩、hmget、sadd、incrby、get$ret=$Redis-multi(Redis::PIPELINE)-sAdd($key2,$counter)-incrBy($key3,$conf['step'])-exec();三、Redis应用案例fang.com通用技术组4.数据存取服务(场景8,场景9)后台设置、前台调用和获取(主要目的:提高效率)Redis数据库设计re:cm:mainid//自增主键idre:cm:dataid//数据自增主键idre:cm:%s:pre_on//待上线数据队列re:cm:%s:pre_off//待下线数据队列re:cm:%s:on//已上线数据队列re:cm:%s:data:%s//单条数据--服务ID+数据自增主键IDre:cm:%s:conf//数据存取服务配置re:cm:%s:ch_id//发生变化的数据—数据需要定时转储/持久化re:cm:%s:dupli//字段重复次数校验举例说明:CrazyGuess(有奖竞猜)、领积分/送积分三、Redis应用案例fang.com通用技术组4.数据存取服务(场景8,场景9)MySQL数据库设计三、Redis应用案例fang.com通用技术组5.打车、寻鹿等基于位置的应用(以寻鹿为例)-综合描述:基于地图和线路规划的多人在线游戏/运营活动。玩法:打开活动页面显示自己的位置,每隔一定的时间(5s)回传自己的位置,绑定一只离自己最近的鹿进行线路规划,移动位置接近鹿,当距离小于阀值50米)时可以将鹿“抢到”,鹿随人走,躲避其他玩家防止鹿被抢走,保持一定的时间即可获得奖励。奖励:话费、德克士鱼排,领取话费需要验证手机。抽象:城市(hash)、鹿(hash)、玩家(hash)、城市中鹿的集合(set)、鹿及周边追赶者集合(set)、城市活跃度集合(SortedSet)三、Redis应用案例5.打车、寻鹿等基于位置的应用(以寻鹿为例)-综合//活动参数KeyHashconstPARAM='xl:param‘;//城市KeyHashconstCITY='xl:city:%s';//cid//鹿KEYHashconstDEER='xl:dr:%s';//did//寻路者KEYHashconstHUNTER='xl:ht:%s';//CUID//城市中的鹿IDSetconstDEER_CIDY_IDS='xl:dr:c:%s';//cid//鹿及追赶者集合KEYSortedSetconstDEER_HUNTER=‘xl:dr:ht:%s’;//did//抢鹿锁constLOCK='xl:lock:%s';//抢鹿锁DID//成功参与过的手机号码constPHONE=‘xl:phone:%s’;//已成功绑定过CUID的手机号码(有索引)//短信验证码cons
本文标题:Redis常用应用场景及案例分享
链接地址:https://www.777doc.com/doc-6424831 .html