Redis常用应用场景及案例分享_第1页
Redis常用应用场景及案例分享_第2页
Redis常用应用场景及案例分享_第3页
Redis常用应用场景及案例分享_第4页
Redis常用应用场景及案例分享_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Redis常用应用场景及案例分享,2015年11月25日,通用技术组-张晓明,提纲,一:Redis简介 简介特性 使用场景 适用场景 如何突破物理内存限制 二:Redis常用应用场景 九大常用场景 三:Redis应用案例 排行榜服务 验证码服务 计数器服务 数据存取服务 综合应用(寻鹿项目),通用技术组,一、Redis简介,通用技术组,REmoteDIctionaryServer(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统。Redis提供了丰富的数据结构,特点是高性能,持久存储,适用于高并发的应用场景。 1.高性能 Redis能支持超过10w+

2、每秒的读写频率。 2.丰富的数据类型 Redis支持二进制的 Strings,Lists,Hashes,Sets及Sorteded Sets数据类型操作。 3.原子性 Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性 执行(multi、watch机制)。 4.丰富的特性 Redis还支持 publish/subscribe,通知,key过期等特性。,一、Redis简介,通用技术组,Redis使用场景,一、Redis简介,通用技术组,Redis适用场景,Redis 虽然既可以作为缓存也可以 作为数据库存储使用,但是并不意 味redis是万精油。,请求量大,对于访问量

3、大的使用场景,可以考虑使用,一般至少是2000以上的QPS(对于较小的数据,单个redis实例可以支持9-10W QPS)。,如果是写多读少,并且写请求是由上游导入数据而产生,则说明redis的读请求很少,让redis太过空闲实属浪费,读写频繁,多种数据结构,Redis支持多种数据结构,可以通过string/list/hash/sort/zsort完成一些比较复杂的功能,用得最频繁的是string和hash,使用复杂的 数据结构,一、Redis简介,通用技术组,Redis如何突破物理内存限制 1.sharding/pre-sharding(分片/预分片) Redis的分片技术是指将数据分散到多

4、个Redis实例中的方法,分片之后,每个redis拥有 一部分原数据集的子集。 优点: 1)从存储能力的角度,分片技术通过使用多台计算机的内存来承担更大量的数据, redis的存储能力将突破单台主机的内存大小。 2)从计算能力的角度,分片技术通过将计算任务分散到多核或者多台主机中,能够充 分利用多核、多台主机的计算能力。 部署: 1)客户端做分片:在客户端确定要连接的redis实例,然后直接访问相应的redis实例 2)在代理中做分片:客户端并不直接访问redis实例,由代理转发请求和结果;其工作 过程为:客户端先将请求发送给代理,代理通过分片算法确定要访问的是哪个redis 实例,然后将请求

5、发送给相应的redis实例,redis实例将结果返回给代理,代理最后 将结果返回给客户端。(Redis集群出现前推荐的方式),一、Redis简介,通用技术组,3)在redis服务器端做分片:“查询路由”,客户端随机选择一个redis实例发送请求, 若所请求内容不再此redis实例再转交请求给正确的redis实例;有的实现中,redis 不转发请求而是将正确redis信息发给客户端,由客户端直连redis(类似SOA方式) 缺点: 1)通常无法支持涉及多键的操作,如求交集等操作。 2)事务操作中涉及多个键时也不能用 3)分片将导致数据处理更加复杂,如数据备份、扩容和缩容 预分片技术:开始时就启动

6、足够多的redis实例等到后续需要扩容的时候,只需要将其中一部分 的redis实例转移到新增加的机子上即可 1)在新机子上启动新的redis实例; 2)将新redis实例作为slave原实例作为master,从原redis实例迁移到新redis实例上; 3)停止客户端(分片操作在客户端上时)或代理服务器(分片操作在代理上) 4)更新客户端或者代理服务器中的配置信息,去掉被迁移的原redis实例的ip和端口等 信息,加上新启动redis实例的IP地址和端口; 5)向新启动的redis发送SLAVEOF NO ONE命令,终止新redis实例对原实例的从属关系; 6)重启客户端程序或者代理程序,此

7、时它们将会使用新的redis实例; 7)关掉被迁移走数据的原redis实例;,一、Redis简介,通用技术组,2.Virtual Memory(Redis 2.02.4) 通过配置,可以让用户设置最大使用内存,当超出这个内存的时候,通过LRU(Least Recently Used)类似算法,将一部分数据存入文件中,在内存中只保存使用频率高的数据(value) 相关配置选项 vm-enable、vm-max-memory、vm-pages、vm-page-size、vm-max-threads 官方的建议 1)当你的key很小而value很大时,使用VM的效果会比较好.因为这样节约的内存比较大

8、. 2)当你的key不小时,可以考虑使用一些非常方法将很大的key变成很大的value,比如你 可以考虑将key,value组合成一个新的value. 3)最好使用linux ext3 等对稀疏文件支持比较好的文件系统保存你的swap文件. 4)vm-max-threads这个参数,可以设置访问swap文件的线程数,设置最好不要超过机器的 核数.如果设置为0,那么所有对swap文件的操作都是串行的.可能会造成比较长时间的 延迟, 但是对数据完整性有很好的保证. 参考:http:/redis.io/topics/virtual-memory,一、Redis简介,通用技术组,3.Redis Clu

9、ster(Redis 3.0) 1)节点自动发现 2)slave-master 选举,集群容错 3)Automatic Resharding:自动分片(hash slot) Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value 时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号 在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点。 当需要增加节点时,只需要把其他节点的某些哈希槽挪到新节点 当需要移除节点时,只需要把移

10、除节点上的哈希槽挪到其他节点就行了; 4)集群管理:cluster xxx 5)基于配置(nodes-port.conf)的集群管理 6)ASK 转向/MOVED 转向机制.,二、Redis常用应用场景,通用技术组,取最新N个数据的操作 排行榜应用,取TOP N操作 需要精准设定过期时间的应用 计数器应用 Uniq操作,获取某段时间所有数据排重值 实时系统,反垃圾系统 Pub/Sub构建实时消息系统 构建队列系统 缓存,三、Redis应用案例,通用技术组,1.排行榜(场景1、2) 后台设置、前台调用和获取 rs:ra:%s:conf hash 例:rs:ra:test:conf rs:ra:%

11、s:set SortedSet 例:rs:ra:test:set 新闻列表、热门话题、投票 zadd rs:ra:test:set 50 9500088 zadd rs:ra:test:set 100 9500089 zadd rs:ra:test:set 200 9500099 zscore rs:ra:test:set 9500088 zRevRangeByScore rs:ra:test:set 1000 0 hMget、zAdd、zScore、zIncrBy、zRevRange(参数为索引-倒序)、zRange(参数为索引-正序) 、 zRevRangeByScore(参数为分数)、z

12、RangeByScore (参数为分数),三、Redis应用案例,通用技术组,2.短信验证码服务(场景3) 要点 1)前端控制获取验证码的频率 2)后端提供接口:获取验证码及校验验证码 过程 1)获取验证码 先尝试获取,看是否已经存在 get “rs:vc; 如果存在则直接调用短信通道通过解密将明文码发给手机 如果不存在需要生成随机明文,将明文加密后的值存到 rs:vc,同时设置过期时间即 setex “rs:vc 有效期 加密码 setex成功后将明文码发到号码手机上 2)验证 参数为手机

13、号码和用户输入的明文码 get “rs:vc; 解密与明文码比对。,三、Redis应用案例,通用技术组,3.计数器服务(场景4) 后台设置、前台调用和获取 rs:co:%s:conf hash 例:rs:co:test:conf rs:co:%s:set set 例:rs:co:test:set rs:co:%s:d:%s string 例:rs:co:test:d:9500088 投票、点击、顶踩、 hmget、sadd、incrby、get $ret = $Redis-multi(Redis:PIPELINE) -sAdd($key2, $counter) -in

14、crBy($key3, $confstep) -exec();,三、Redis应用案例,通用技术组,4.数据存取服务(场景8,场景9) 后台设置、前台调用和获取(主要目的:提高效率) Redis数据库设计 re:cm:mainid /自增主键id re:cm:dataid /数据自增主键id re:cm:%s:pre_on /待上线数据队列 re:cm:%s:pre_off /待下线数据队列 re:cm:%s:on /已上线数据队列 re:cm:%s:data:%s /单条数据-服务ID+数据自增主键ID re:cm:%s:conf /数据存取服务配置 re:cm:%s:ch_id /发生变化

15、的数据数据需要定时转储/持久化 re:cm:%s:dupli /字段重复次数校验 举例说明:CrazyGuess(有奖竞猜)、领积分/送积分,三、Redis应用案例,通用技术组,4.数据存取服务(场景8,场景9 ) MySQL数据库设计,三、Redis应用案例,通用技术组,5.打车、寻鹿等基于位置的应用 (以寻鹿为例)-综合 描述:基于地图和线路规划的多人在线游戏/运营活动。 玩法:打开活动页面显示自己的位置,每隔一定的时间(5s)回传自己的位置,绑定一只离自己最近的鹿进行线路规划,移动位置接近鹿,当距离小于阀值50米)时可以将鹿“抢到”,鹿随人走,躲避其他玩家防止鹿被抢走,保持一定的时间即可

16、获得奖励。 奖励:话费、德克士鱼排,领取话费需要验证手机。 抽象:城市(hash)、鹿(hash)、玩家(hash)、城市中鹿的集合(set)、 鹿及周边追赶者集合(set)、城市活跃度集合(SortedSet),三、Redis应用案例,5.打车、寻鹿等基于位置的应用 (以寻鹿为例)-综合 /活动参数Key Hash const PARAM = xl:param; /城市Key Hash const CITY = xl:city:%s; /cid /鹿KEY Hash const DEER = xl:dr:%s; /did /寻路者KEY Hash const HUNTER = xl:ht:%

17、s; /CUID /城市中的鹿ID Set const DEER_CIDY_IDS = xl:dr:c:%s; /cid /鹿及追赶者集合KEY Sorted Set const DEER_HUNTER = xl:dr:ht:%s; /did /抢鹿锁 const LOCK = xl:lock:%s; /抢鹿锁DID /成功参与过的手机号码 const PHONE = xl:phone:%s; /已成功绑定过CUID的手机号码(有索引) /短信验证码 const SMSVCODE = xl:vcode:%s; /短信验证码phone /总人数 const HUNTER_TOTAL = xl:ht:num

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论