当前位置:首页 > 数码 > Redis罕用的八种场景

Redis罕用的八种场景

admin8个月前 (05-01)数码41

作为一名后端人员,对必需并不生疏,Redis作为一种内存数据库,以其速度之快在编程的舞台上纵横多年,那么,Redis究竟适宜哪些业务场景?当天就来聊一聊。

1.缓存/数据库

缓存(Cache)是Redis经常使用最宽泛的场景之一,也是很多小同伴结识Redis的关键要素,在8种10倍优化API性能的形式文章中咱们也强调了Redis可以作为缓存的来减速API性能。如下图,在WebServer和数据库之间会参与一层Redis缓存,这样WebServer可以间接从Redis中极速拿到数据前往,放慢了WebServer的照应速度。

举例:

须要说明的是:很多时刻,咱们都会把Redis的耐久化性能关上,因此,在把Redis当作缓存的同时,雷同把Redis当作数据库在经常使用。

2.散布式锁

散布式锁(DistributedLock)也是Redis经常使用最宽泛的场景之一,散布式系统中,当咱们在处置有并发的业务场景时,为了保证线程安保,通常通常会经常使用散布式锁,单机下,Redis通经常常使用SETNX(ifNotExist)和PX(过时期间)来创立锁,指令如下:

#假设key不存,setkey=value,#失效期间是expiration毫秒SETkeyvalueNXPXexpiration

在Java中,Redission是一个基于Redis的散布式Java对象映射(JavaRedisClient),它提供了丰盛的个性和工具,示例代码展现了如何在Redission框架中经常使用Redis散布式锁:

importorg.redisson.Redisson;importorg.redisson.api.RedissonClient;importorg.redisson.config.Config;publicclassRedissonExample{publicstaticvoidmn(String[]args){Configconfig=newConfig();config.useSingleServer().setAddress("redis://127.0.0.1:6379");RedissonClientredisson=Redisson.create(config);//经常使用散布式锁StringlockKey="lockKey";booleanisLocked=redisson.getLock(lockKey).tryLock();if(isLocked){//取得锁,口头相关操作System.out.println("Lockacquiredsuccessfully");redisson.getLock(lockKey).unlock();//监禁锁}else{System.out.println("Failedtoacquirelock");}redisson.shutdown();//封锁衔接}}

须要说明的是:除了Redis,Zookeeper也是成功散布式锁比拟罕用的一种技术打算。

3.限流

限流(RateLimiter)也是Redis经常使用比拟多的一个场景,限流是包全系统免受过载的一种方法,它可以确保在指定期间内对系统的恳求启动限度。在Redis中,可以经常使用SET、EXPIRE和Lua脚原本成功便捷的限流性能。

示例代码展现了JavaJedis库成功基于令牌桶算法的Redis限流:

importredis.clients.jedis.Jedis;importredis.clients.jedis.Response;importredis.clients.jedis.Transaction;publicclassRateLimiter{privatefinalJedisjedis;privatefinalStringkey;privatefinalintcapacity;privatefinalinttokensPerSecond;publicRateLimiter(Jedisjedis,Stringkey,intcapacity,inttokensPerSecond){this.jedis=jedis;this.key=key;this.capacity=capacity;this.tokensPerSecond=tokensPerSecond;}/***用于审核能否准许恳求,依据以后令牌数量和容量启动判别*/publicbooleanallowRequest(){longnow=System.currentTimeMillis();Transactiontransaction=jedis.multi();//Addcurrenttimewithscoretransaction.zadd(key,now,String.valueOf(now));//Removetokensthatareolderthan1secondtransaction.zremrangeByScore(key,0,now-1000);//GetcurrentnumberoftokensResponse<Long>sizeResponse=transaction.zcard(key);transaction.exec();longsize=sizeResponse.get();//Checkifnumberoftokensiswithincapacityreturnsize<=capacity;}publicstaticvoidmain(String[]args){Jedisjedis=newJedis("localhost");//ConnecttoRedis//CreateratelimiterRateLimiterrateLimiter=newRateLimiter(jedis,"RateLimiterKey",10,5);for(inti=0;i<15;i++){booleanallowed=rateLimiter.allowRequest();if(allowed){System.out.println("Requestallowed");}else{System.out.println("Requestdenied");}}//CloseRedisconnectionjedis.close();}}

4.会话存储

会话(Session)也是Redis经常出现的一种性能,相熟Spring的小同伴必需知道它也有一个Session性能,那么它和Redis的Session有什么区别呢?

SpringSession是一个形象层,提供与存储后端衔接才干,至于后端驳回内存、数据库还是Redis存储SpringSession不关注。而RedisSession是SpringSession的一种详细成功,将会话数据存储在Redis中。

举例:存储用户登录信息:

#将用户的登录信息存储在Redis中,key:userId,value:user登录信息SETuser:userId{"username":"xxx","pass":"xxx",...}

5.颁布/订阅

颁布/订阅(Sub/Pub)是Redis中一个相似于信息两边件(MQ)的性能,当咱们的业务中有须要经过事情触发的场景时可以经常使用该性能,不过Redis的Sub/Pub性能还是比拟粗陋,有复杂的业务场景时还是介绍MQ。

举例:

群聊,在实时聊天运行中,应用Redis的颁布/订阅性能成功信息广播。

成功事情通知系统,如新订单通知、新邮件提示等。

#订阅频道SUBSCRIBEchannel_xxx#向频道中发送信息PUBLISHchannel_xxx"Messagecontent"

6.排名/排行榜

排名/排行榜(Rank/LeaderBoard)是Redis中一个比拟适用的性能,在文章热榜、游戏竞技或社区平台中,排行榜(Leaderboard)和排名(Ranking)系统是经常出现的性能,用于展现用户在特定优惠、较量或目的上的排名状况,而Redis的有序汇合(SortedSet)是成功排行榜性能的现实数据结构,由于它可以存储每个成员的分数,并依据分数启动排序。

举例:

(1)记载网站访问次数或文章浏览次数。

#参与文章的点击量#将Article1的值参与1。假设Article1不存在于有序汇合中,#该命令会将Article1参与到汇合,并设置值为1ZINCRBYleaderboard1"Article1"ZINCRBYleaderboard1"Article2"ZINCRBYleaderboard1"Article3"#失掉Article2的排名(从高到低排名)ZREVRANKleaderboard"Article2"#获点击量Top10的文章和点击量ZREVRANGEleaderboard09WITHSCORES

(2)成功用户积分排行榜。

7.计数

在Redis中,可以经常使用INCR、DECR等命令来启动便捷的计数操作。这些命令用于对键的值启动递增或递减操作,罕用于成功计数器等性能。

罕用计数命令:

#对key启动+1操作INCRkey#对key启动-1操作DECRkey#对key启动+n操作INCRBYkeyn#对key启动-n操作DECRBYkeyn

另外,在排名/排行榜中,ZINCRBY是对Sortset的一种计数形式。

举例:

8.天文位置运行

Redis的天文位置运行性能经常使用的场景比拟有针对性,假设你不是在特定的畛域,或许并不会经常使用该性能,它是经过Geo数据类型支持天文位置存储和检索,可以用于构建位置服务和天文位置相关的运行。

举例:

(1)点过外卖的小同伴必需不生疏,外卖平台上,左近商家搜查性能。

#查找经度12.087269,纬度39.412669左近5km的距离范围GEORADIUSlocations12.08726939.4126695km

(2)叫车平台,比如一些网约车平台,就可以把司机,乘客的位置信息(经纬度)经过Redis的Geo来成功距离计算等性能。

Redis罕用的八种场景#参与经纬度信息,经纬度是假造的,不必定实在GEOADDlocations12.32238939.125356"Driver"GEOADDlocations12.08726939.412669"Passenger"#计算司机和乘客两地点间的距离GEODISTlocationsDriverPassenger

总结

本文引见了Redis经常出现的8种适用场景:

假设你在业务中不确定能否须要引入Redis时,可以参考本文,假设场景刚好命中其中一种,那么可以选用经常使用Redis。假设你的业务场景不在这8种经常出现场景中,不代表不能经常使用Redis,或许须要你更多的技术调研来确认适宜的技术打算。

最后,把猿哥的座右铭送给你:投资自己才是最大的财产。


Redis应用场景?

Redis实际应用场景1、显示最新的项目列表下面这个语句常用来显示最新项目,随着数据多了,查询毫无疑问会越来越慢。 SELECT FROM fOO WHERE ORDER BY time DESC LIMIT 10在Web应用中,“列出最新的回复”之类的查询非常普遍,这通常会带来可扩展性问题。 这令人沮丧,因为项目本来就是按这个顺序被创建的,但要输出这个顺序却不得不进行排序操作。 类似的问题就可以用Redis来解决。 比如说,我们的一个Web应用想要列出用户贴出的最新20条评论。 在最新的评论边上我们有一个“显示全部”的链接,点击后就可以获得更多的评论。 我们假设数据库中的每条评论都有一个唯一的递增的ID字段。 我们可以使用分页来制作主页和评论页,使用Redis的模板,每次新评论发表时,我们会将它的ID添加到一个Redis列表:LPUSH <ID>我们将列表裁剪为指定长度,因此Redis只需要保存最新的5000条评论:LTRIM 0 5000每次我们需要获取最新评论的项目范围时,我们调用一个函数来完成(使用伪代码):FUNCTION get_latest_comments(start,num_items):id list =(,start,start+num items -1) IF id <num itemsid list = SQL DB(SELECT ... ORDER BY time LIMIT ...) ENDRETURN id list END这里我们做的很简单。 在Redis中我们的最新ID使用了常驻缓存,这是一直更新的。 但是我们做了限制不能超过5000个ID,因此我们的获取ID函数会一直询问Redis。 只有在start/count参数超出了这个范围的时候,才需要去访问数据库。 我们的系统不会像传统方式那样“刷新”缓存,Redis实例中的信息永远是一致的。 SQL数据库(或是硬盘上的其他类型数据库)只是在用户需要获取“很远”的数据时才会被触发,而主页或第一个评论页是不会麻烦到硬盘上的数据库了。

redis 常见数据结构以及使用场景分析?

Redis 提供了 5种数据结构,每一种数据结构有各种的使用场景。 1、String 字符串字符串类型是 Redis 最基础的数据结构,首先键都是字符串类型,而且 其他几种数据结构都是在字符串类型基础上构建的,我们常使用的 set key value 命令就是字符串。 常用在缓存、计数、共享Session、限速等。 2、Hash 哈希在Redis中,哈希类型是指键值本身又是一个键值对 结构,形如value={{field1,value1},...{fieldN,valueN}},添加命令:hset key field value。 哈希可以用来存放用户信息,比如实现购物车3、List 列表列表(list)类型是用来存储多个有序的字符串。 可以做简单的消息队列的功能。 另外,可以利用 lrange 命令,做基于 Redis的分页功能,性能极佳,用户体验好。 4、Set 集合集合(set)类型也是用来保存多个的字符串元素,但和列表类型不一 样的是,集合中不允许有重复元素,并且集合中的元素是无序的,不能通过 索引下标获取元素。 利用 Set 的交集、并集、差集等操作,可以计算共同喜好,全部的喜好,自己独有的喜好等功能。 5、Sorted Set 有序集合Sorted Set 多了一个权重参数 Score,集合中的元素能够按 Score 进行排列。 可以做排行榜应用,取 TOP N 操作。

免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。

标签: Redis

“Redis罕用的八种场景” 的相关文章

Redis数据删除后-内存占用为何居高不下 (redis数据类型)

Redis数据删除后-内存占用为何居高不下 (redis数据类型)

作为面试经验丰富的开发人员,肯定会遇到过这样的问题:做了数据删除操作,为什么使用 top 命令时,仍然显示 Redis 占用了大量内存? 答案 这是因为当数据删除后,Re...

大厂Redis重试战略剖析-深化摸索行业通常 (大厂redis面试题)

大厂Redis重试战略剖析-深化摸索行业通常 (大厂redis面试题)

受网络和运转环境影响,运行程序或许遇到临时性缺点,如刹时网络颤抖、服务临时无法用、服务忙碌造成超时等。 智能重试机制可大幅防止此类缺点,保证操作成功口头。 1引发临时性缺点的要素...

安装并配置-Kubernetes-集群 (安装并配置mysql的实验总结)

安装并配置-Kubernetes-集群 (安装并配置mysql的实验总结)

日常开发中,基于自然支持散布式锁,大家在线上散布式名目中都经常使用过Redis锁。本文重要针对日常开发中加锁环节中某些意外场景启动解说与剖析。本文解说示例代码都在名目目录下 RedisLo...

Redis中分布式锁的防死锁机制 (redis中文网)

Redis中分布式锁的防死锁机制 (redis中文网)

分布式锁在分布式系统中是一种常见的需求。它用于防止对共享资源的并发访问,确保数据一致性和可靠性。在 Redis 中实现分布式锁可以通过使用 SETNX(SET if Not eXists)命令来尝...

排查与处置指南-Redis大Key危害 (排查与处置指的是什么)

排查与处置指南-Redis大Key危害 (排查与处置指的是什么)

这是一位同窗往年秋招参与得物一面遇到的疑问,完整面经如下: 这个疑问在面试中还是比拟容易遇到的,尤其是在调查性能优化相关常识点的时刻。 通常状况下,问了bigkey(大Key)还会继续...

探索强大的工具优化集群性能和可靠性-Redis运维神器 (探索强大的工作有哪些)

探索强大的工具优化集群性能和可靠性-Redis运维神器 (探索强大的工作有哪些)

监控工具 INFO 命令 INFO 命令是 Redis 提供的监控命令,可以返回丰富的实例运行监控信息。INFO 命令的参数为 section,取值如下:...

引发业界震荡-Redis叛逃开源-得罪了 (引发业界震荡的因素)

引发业界震荡-Redis叛逃开源-得罪了 (引发业界震荡的因素)

Redis 许可变更:开源界的巨石 导言 近来,内存数据库供应商 Redis 宣布了一项重大变更,该变更将在开源界掀起轩然大波。Redis 将转向双许可模式,并采用更严格的许可条款。此举引起了社区...

成功多规则限流的思索与通常-Redis (成功的规则)

成功多规则限流的思索与通常-Redis (成功的规则)

市面上很多引见如何成功限流的,然而大局部都有一个缺陷,就是只能成功繁多的限流,比如1分钟访问1次或许60分钟访问10次这种,然而假构想一个接口两种规则都须要满足呢,咱们的名目又是散布式名目,应该如何处...