本文目录导航:
Redis 限流的 3 种模式,还有谁不会!
面对越来越多的高并发场景,限流显示的尤为关键。
当然,限流有许多种成功的模式,Redis具备很弱小的配置,我用Redis通常了三种的成功模式,可以较为便捷的成功其模式。
Redis不只仅是可以做限流,还可以做数据统计,左近的人等配置,这些或许会后续写到。
咱们在经常使用Redis的散布式锁的时刻,大家都知道是依托了setnx的指令,在CAS(Compare and swap)的操作的时刻,同时给指定的key设置了过时通常(expire),咱们在限流的关键目标就是为了在单位期间内,有且仅有N数量的恳求能够访问我的代码程序。
所以依托setnx可以很轻松的做到这方面的配置。
比如咱们须要在10秒内限定20个恳求,那么咱们在setnx的时刻可以设置过时期间10,当恳求的setnx数量到达20时刻即到达了限流成果。
代码比拟便捷就不做展现了。
当然这种做法的弊病是很多的,比如当统计1-10秒的时刻,不可统计2-11秒之内,假设须要统计N秒内的M个恳求,那么咱们的Redis中须要坚持N个key等等疑问。
第二种:基于Redis的数据结构zset
其实限流触及的最关键的就是滑动窗口,下面也提到1-10怎样变成2-11。
其实也就是起始值和末端值都各+1即可。
而咱们假设用Redis的list数据结构可以轻而易举的成功该配置。
咱们可以将恳求打形成一个zset数组,当每一次性恳求出去的时刻,value坚持惟一,可以用UUID生成,而score可以用当后期间戳示意,由于score咱们可以用来计算当后期间戳之内有多少的恳求数量。而zset数据结构也提供了range方法让咱们可以很随便的失掉到2个期间戳内有多少恳求
代码如下
publicResponselimitFlow(){LongcurrentTime=newDate()();(currentTime);if((limit)){Integercount=()(limit,currentTime-intervalTime,currentTime)();//intervalTime是限流的期间(count);if(count!=null&&count>5){(每分钟最多只能访问5次);}}()(limit,()(),currentTime);(访问成功);}
经过上述代码可以做到滑动窗口的成果,并且能保障每N秒内至少M个恳求,缺陷就是zset的数据结构会越来越大。
成功模式相对也是比拟便捷的。
提到限流就不得不提到令牌桶算法了。
令牌桶算法提及到输入速率和输入速率,当输入速率大于输入速率,那么就是超出流量限度了。
也就是说咱们每访问一次性恳求的时刻,可以从Redis中失掉一个令牌,假设拿到令牌了,那就说明没超出限度,而假设拿不到,则结果同样。
依托上述的思维,咱们可以联合Redis的List数据结构很随便的做到这样的代码,只是便捷成功
依托List的leftPop来失掉令牌
//输入令牌publicResponselimitFlow2(Longid){Objectresult=()(limit_list);if(result==null){(以后令牌桶中无令牌);}(articleDescription2);}再依托Java的定时义务,定时往List中rightPush令牌,当然令牌也须要惟一性,所以我这里还是用UUID启动了生成
//10S的速率往令牌桶中减少UUID,只为保障惟一性@Scheduled(fixedDelay=10_000,initialDelay=0)publicvoidsetIntervalTimetask(){()(limit_list,()());}综上,代码成功起始都不是很难,针对这些限流模式咱们可以在AOP或许filter中参与以上代码,用来做到接口的限流,最终包全你的网站。
Redis其实还有很多其余的用途,他的作用不只仅是缓存,散布式锁的作用。
他的数据结构也不只仅是只要String,Hash,List,Set,Zset。
有兴味的可以后续了解下他的GeoHash算法;BitMap,HLL以及布隆过滤器数据(Redis4.0之后参与,可以用Docker间接装置Redislabs/rebloom)结构。
有疑问欢迎留言讨论。
原文链接:
redis命令是什么?
Redis命令是用于操作Redis数据库的一系列指令。
Redis是一种开源的,内存中的数据结构存储系统,它可以用作数据库、缓存和信息代理。
为了对Redis启动各种操作,须要经常使用特定的命令。
以下是对Redis命令的
一、Redis命令简介
Redis命令是一系列用于操作Redis数据库的指令。
这些指令准许用户口头各种操作,如设置和失掉键值、启动列表操作、颁布和订阅信息等。
由于Redis是基于内存的,因此其命令口头速度十分快,实用于各种运行场景。
二、Redis关键命令类型
1. 字符串操作命令:包含SET、GET、DEL等,用于设置、失掉和删除键值对。
2. 列表操作命令:如LPUSH、RPOP等,用于在列表的左侧或右侧减少或删除元素。
3. 哈希表操作命令:HSET、HGET等,用于在哈希表中设置和失掉字段值。
4. 汇合操作命令:SADD、SMEMBERS等,用于减少元素和失掉汇合中的一切元素。
5. 有序汇合操作命令:ZADD、ZRANGE等,用于在有序汇合中减少元素并失掉指定范畴内的元素。
6. 颁布订阅命令:SUBSCRIBE、PUBLISH等,用于成功信息颁布和订阅配置。
三、Redis命令的运行
Redis命令宽泛运行于各种场景。
例如,由于其极速的读写速度和丰盛的数据结构类型,Redis常被用作缓存层,以提高运行程序的性能。
此外,Redis还罕用于成功计数器、排行榜、信息队列等配置。
总之,Redis命令是操作Redis数据库的关键工具,把握这些命令可以更好地利用Redis的各种配置,提高运行程序的性能和牢靠性。
redis能扛多大并发量
redis可以支持小数据可以到达10W的并发量。
Redis(全称:RemoteDictionaryServer远程字典服务)是一个开源的经常使用ANSIC言语编写、支持网络、可基于内存亦可耐久化的日志型、Key-Value数据库,并提供多种言语的API。
从2010年3月15日起,Redis的开发上班由VMware掌管。
从2013年5月开局,Redis的开发由Pivotal资助。
redis是一个key-value存储系统。
和Memcached相似,它支持存储的value类型相对更多,包含string(字符串)、list(链表)、set(汇合)、zset(sortedset--有序汇合)和hash(哈希类型)。
这些数据类型都支持push/pop、add/remove及取交加并集和差集及更丰盛的操作,而且这些操作都是原子性的。
在此基础上,redis支持各种不同模式的排序。
与memcached一样,为了保障效率,数据都是缓存在内存中。
区别的是redis会周期性的把降级的数据写入磁盘或许把修正操作写入追加的记载文件,并且在此基础上成功了master-slave(主从)同步。