Redis存储总用String?你大概错过了更优的使用方法

  • 时间:
  • 浏览:2

统统们都不需要 使用Redis Hash提供的实体属性Hash存储特征,人们都不需要 认为Hash Value是好几只 多Hash Table,实体的每好几只 多属性不是通过Hash得到属性的最终数据索引。

觉得Zset在人们应用系统中能用到地方到处不是,这里人们举好几只 多简单的例子,在团购系统中人们通常不需要 根据参团人数来排序成团列表,人们都希望参加哪此即将成团的团。

通过对意味分析排序完后 的团列表Zset使用Zrange来获取出分页集合。人们来看下详细的流程,如保解决查询、排序、分页的。

下图中的左边是好几只 多key为Set:order:ids的Set集合,它意味分析是好几只 多全量集合,也意味分析是某个查询条件获取出来的好几只 多集合:

哪此String:order:{orderId}字符串key无须一定是为了服务有五种场景,统统整个系统最底层的数据,各种场景最后都不需要 获取哪此数据。哪此Set集合都不需要 认为是查询条件数据,用来辅助查询条件的计算。

Zset有五种提供了统统土法律法律依据 用来进行集合的排序,意味分析不需要 score分值,都不需要 使用withscore字句带出每一项的分值。

上述人们分析总结出了好几只 多查询接口的基本信息,这里还好几只 多有关于高并发接口的设计原则,统统将hot-top接口和一般search接口分一蹶不振 ,意味分析可不需要需要 不需要 分而治之不需要 分别根据特点选则不同的技术。

意味分析Redis expire time可不需要需要 不需要 设置在key上,像List、Hash、Set、Zset属于集合类型,会管理一组item,人们无法在哪此集合的item上设置过期时间,统统使用expiretime来解决集合的cache失效会变得稍微错综复杂些。而且 String使用expire time来管理过期策略会比较简单,意味分析它所含的项少。这里说的集合是宽泛的类似于集合。

Hash数据类型的特点通常都不需要 用来解决所含映射关系,同時 又不需要 对有些项进行更新意味分析删除等操作。意味分析不是某个项不需要 维护,那末 一般都不需要 通过使用String来解决。

String是Redis提供的字符串类型。都不需要 针对String类型独立设置expire time,通常用来存储长字符串数据,比如某个对象的json字符串。

Set集合在使用场景上还是比较多和自由的。举个简单的例子,在应用系统中比较常见的统统商品、活动类场景。用好几只 多Set缓存有效商品集合,再用好几只 多Set缓存活动商品集合。意味分析商品经常总出 上下架操作只不需要 维护有效商品Set,每次获取活动商品的完后 不需要 过滤下与不是下架商品,意味分析有就不需要 从活动商品中剔除。

Redis为人们提供了5种数据类型,基本上人们使用频率最高的统统String,而对有些有五种数据类型使用的频次稍弱于String。意味分析在于:

2)sort排序问题



有完后 错综复杂点的场景不需要 多个Set集合来支撑计算,在Redis服务器里意味分析会有统统类似于统统的集合。哪此集合人们都不需要 称为功能数据,哪此数据是用来辅助cache计算的,当进行各种集合运算以不是得出当前查询不需要 返回的子集,最后人们才会去获取某个订单真正的数据。

Set集合数据类型都不需要 支持集合运算,可不需要需要 存储重复数据。

意味分析Redis是Signle-Thread单进程模型,基于你什儿 特征人们就都不需要 使用Redis提供的pipeline管道来提交一连串所含逻辑的命令集合,哪此命令在解决期间不需要被有些客户端的命令干扰。

4)Set

下一期人们意味分析着重讲讲Redis内存数据特征与编码,弄清Redis内控 到底是如保支持这5种数据类型的。欢迎人们留言讨论。

5)Zset

在有些比较特殊的场合意味分析不需要 组合排序,意味分析有多个Zset分别用来对同好几只 多实体在不同维度的排序,按时间排序、按人数排序等。你什儿 完后 就都不需要 组合使用Zset带来的便捷性,利用pipeline再结合多个Zset最终得出组合排序集合。

1)String

下图从query condition计算Hash Code,而且 通过DB查询出当前条件全量团列表:



zset:marketing:groupon:hottop:available:groupkey表示全量团的参团人数,用好几只 多Zset来缓存。接着将这好几只 多Zset计算交集,就都不需要 得出当前查询所不需要 的所含参团人数的Zset,最后在使用Zrevrange获取分页区间。

在进程里人们都不需要 很方便的使用Redis的atomic特征对Hash某个项进行累加操作。

那末 人们如保将用户的查询条件出来的团列表根据参团人数排序呢?刚好都不需要 使用Zset的交集运算,直接计算出当前你什儿 集合的Zset子集。

下图中模拟了好几只 多典型的支付callback峰值场景:

3)Hash

意味分析人们不分职责将所有的查询场景封里装 好几只 多接口里,那末 在里面优化接口性能的完后 基本就很麻烦了,有些场景是无法意味分析不能自己用cache来解决的,意味分析接口里耦合了各种场景逻辑,就算勉强能实现性能统统会高。

page:分页信息,简单理解统统数据记录排完序完后 的第几行到第几行。

3)page分页问题

Redis为人们提供了TYPE命令来查看某个key的数据类型,如String类型:

觉得Set无法设置item的过期时间,而且 人们都不需要 将Set Item与String Key关联来达到相同的效果。

人们来简要了解一下String、List、Hash、Set及Zset:

Set最大的特点统统集合的计算能力,inter交集、union并集、diff差集,哪此特点都不需要 用来做高性能的交叉计算意味分析剔除数据。

1)query condition查询条件问题

Hash数据类型很明显是基于Hash算法的,对于项的查找时间错综复杂度是O(1)的,在极端情况报告下意味分析经常总出 项Hash冲突问题,Redis内控 是使用链表加key判断来解决的。具体Redis内控 的数据特征人们在里面有介绍,这里就不展开了。

List在提高throughput的场景中非常适用,意味分析它特有的LPUSH、RPUSH、LPOP、RPOP功能都不需要 无缝的支持生产者、消费者架构模式。

意味分析有不需要 对某个字段进行修改,使用String很明显会多出统统开销,不需要 读取出来反序列化成对象而且 操作,而且 再序列化写回Redis,这里面意味分析还有并发问题。

这非常适合实现类似于Java Concurrency Fork/Join框架中的work-stealing算法(工作窃取)。

首先好几只 多查询接口肯定是有query condition查询条件,而且 是sort排序信息、最后是page分页信息。这是一般接口所承担的基本职责,当然,特殊场景下还不需要 支持master/slave replication时关于数据session一致性的要求,不需要 提供跟踪标记来回master查询数据,这里就不展开了。

querycondition:查询条件,companyid =400,sellerid=1010101诸那末 类。

以沪江团购系统大促hot-top接口cache设计为例,人们总结了Redis提供的5种数据类型的各人特点和一般的使用场景。而且 人们不仅仅都不需要 分完后 结束了了用哪此数据类型,人们完统统不需要 综合使用哪此数据类型来完成错综复杂的cache场景。

这里会特别小问题,统统支付gateway调用分发器的完后 ,是如保做load balance?意味分析不是平均负载意味分析会有某个queue list高出有些queue list。

String使用起来比较简单,都不需要 方便存储错综复杂的对象,使用场景比较多;

当然这统统举例,好几只 多场景有不同的实现土法律法律依据 。

二、案例:沪江团购系统大促hot-top接口cache设计

一、Redis的数据类型及特点

从更深层次来看,人们对另外有五种数据类型的使用和原理并不是太了解。统统你什儿 完后 往往会忽视在特定场景下使用有五种数据类型会比String性能高出统统的意味分析性,比如使用Hash特征来提高某实体某个项的修改等。

支付gateway收到callback完后 不做任何解决直接交给分发器。

而分发器不需要需要 做soft load balance,意味分析哪怕某个queue list比有些queue list多也无所谓,意味分析下游message handler会根据work-stealing算法来窃取有些消费慢的queue list。

2)List

有了返回的团code集合完后 就都不需要 通过mget来批量获取String类型的团详情信息,这里就不贴出代码了。

下图使用Hash数据类型来记录页面的a/bmetrics:

原文发布时间为:2018-12-25

本文作者: JohnsonChung

本文来自云栖社区合作者者伙伴“ DBAplus社群”,了解相关信息都不需要 关注“dbaplus”微信公众号

再看根据参团人数排序问题,人们立刻就都不需要 想到使用Zset来解决团排序问题,意味分析只好几只 多排序维度,统统好几只 多Zset就够了。人们使用好几只 多Zset来缓存所有团的参团人数集合,它是好几只 多全量的团排序集合。

意味分析篇幅和时间关系,人们不展开太久的业务场景介绍了。这其中还涉及到计算cache过期时间的问题,这也跟促销活动的运营规则有关系,还涉及到有意味分析query condition hash冲突问题等,而且 哪此意味分析不与人们本节主题相关。

下图中左右两边是好几只 多不同的集合:

在峰值经常总出 的地方一般人们不是使用加buffer的土法律法律依据 来加快请求解决强度单位,统统不需要 提高并发解决能力,提高through put。

左边的是首页index的各个区域的统计,右边是营销marketing的各个区域统计。

注:hot-top接口是指热点、排名接口的意思,表示它的浏览量、并发量比较高,一般大促的完后 与不是几只你什儿 性能要求比较高的接口。

人们先来分析好几只 多查询接口所所含的常规信息。

下面人们分享好几只 多使用多个Zset、String来优化团购系统前台接口的例子。意味分析篇幅和时间限制,这里只介绍跟本次案例相关的信息。

Redis List的LPUSH、RPUSH、LPOP、RPOP特征觉得都不需要 在统统场景下提高你什儿 横向扩展计算能力。

这里人们不打算罗列这5种数据类型的使用土法律法律依据 ,意味分析哪此资料网上有统统。人们主要讨论这5种数据类型的功能特点,弄清楚它们分别适合用于解决哪此现实的业务场景,人们又该如保组合性使用这5种数据类型,找到解决错综复杂cache问题的最优方案。

前面做哪此铺垫是为了能在介绍案例的完后 达成好几只 多基本的共识。现在人们来看下你什儿 团购系统的hot-top接口的具体逻辑。

分发器是好几只 多无情况报告的cluster,每个node通过向注册中心pull handler queue list,也统统获取下游解决器注册到注册中心里的消息通道。每好几只 多分发器node会维护好几只 多本地queue list,而且 顺序推送消息到哪此queue list即可。



左边是营销域中的可用商品ids集合,右边是营销域中活动商品ids集合,里面计算出好几只 多集合的交集。

人们来仔细分析下,首先不同的查询条件从DB里查询出来的数据是不一样的,也统统说查询出来的团列表是不一样的,意味分析有company公司、channel渠道等过滤条件。

sort:排序信息,一般是默认好几只 多列排序,而且 在错综复杂的场景下会有意味分析让接口使用者定制排序字段,比如有些租户信息列。

注:Java Fork/Join框架使用并行来提高性能,而且 会带来意味分析并发take task带来的race condition(竞态条件)问题,统统采用work-stealing算法来解决意味分析竞争问题带来的性能损耗。

使用Redis Hash Increment进行原子增加操作。HINCRBY命令都不需要 原子增加任何给定的整数,也都不需要 通过HINCRBYFLOAT来原子增加浮点类型数据。

Zset排序集合与Set集合类似于,而且 Zset提供了排序的功能。在介绍Set集合的完后 人们知道Set集合中的成员是无序的,Zset填补了集合都不需要 排序的空隙。

在有些错综复杂的场景中,也都不需要 使用SINTERSTORE命令将交集计算后的结果存储在好几只 多目标集合中。这在使用pipeline命令管道中特别有用,将SINTERSTORE命令包裹邮寄邮寄邮寄在pipeline命令串中都不需要 重复使用计算出来的结果集。

注:在大促的完后 不需要 展现团购列表,你什儿 接口的访问量是非常大的,团购活动不需要 根据参团人数倒序排序,而且 分页返回指定数量的团列表。人们假设你什儿 接口名为getTopGroups(getTopGroupsRequestrequest)。

意味分析这里人们纯粹用Redis来提高cache能力,不涉及到有关于任何搜索的能力,统统这里忽略有些错综复杂查询的情况报告。觉得人们在错综复杂的地方使用了Elastcsearch来提高搜索能力。

当然,下架的完后 都不需要 直接删除缓存的活动商品,而且 活动是从marketing系统中load出来的,就算我将cache里的活动商品删除,当下次再从marketing系统中load活动商品完后 还是会有下架商品。

Zset最强大的功能统统都不需要 根据某个score比分值进行排序,这在统统业务场景中非常急需。比如,在促销活动里根据商品的销售数量来排序商品,在旅游景区里根据流入人数来排序热门景点等。基本上人们在做任何事情都不需要 根据有些条件进行排序。

人们都不需要 抽象出这几只维度的信息:

下图是好几只 多根据团购code创建的Zset,score分值统统参团人数累加和:

意味分析好几只 多团购活动下不需要有太久团,顶多上百个是极限了,统统好几只 多查询条件出来的团列表也顶多几好几只 ,而且 根据场景分析热点查询条件不需要超过好几只 ,统统人们选则将查询条件Hash出好几只 多code来缓存本次查询条件的全量团列表集合,而且 哪此结果集是那末 任何排序的。

在使用上,String类型最巧妙的是都不需要 动态拼接key。通常人们都不需要 将一组id中放去Set里,而且 动态查找String还不是指在,意味分析不指在说明意味分析过期意味分析意味分析数据修改主动delete了,不需要 再做一次cache数据load。