Redis罕用的八种场景
作为一名后端人员,对必需并不生疏,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来成功距离计算等性能。
#参与经纬度信息,经纬度是假造的,不必定实在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 操作。
免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。