File tree Expand file tree Collapse file tree 4 files changed +139
-0
lines changed
src/com/stacktips/designpatterns Expand file tree Collapse file tree 4 files changed +139
-0
lines changed Original file line number Diff line number Diff line change 1+ # ## IntelliJ IDEA ###
2+ out /
3+ ! ** /src /main /** /out /
4+ ! ** /src /test /** /out /
5+
6+ # ## Eclipse ###
7+ .apt_generated
8+ .classpath
9+ .factorypath
10+ .project
11+ .settings
12+ .springBeans
13+ .sts4-cache
14+ bin /
15+ ! ** /src /main /** /bin /
16+ ! ** /src /test /** /bin /
17+
18+ # ## NetBeans ###
19+ /nbproject /private /
20+ /nbbuild /
21+ /dist /
22+ /nbdist /
23+ /.nb-gradle /
24+
25+ # ## VS Code ###
26+ .vscode /
27+
28+ # ## Mac OS ###
29+ .DS_Store
30+
31+ * .iml
32+ * .idea
Original file line number Diff line number Diff line change 1+ # ## IntelliJ IDEA ###
2+ out /
3+ ! ** /src /main /** /out /
4+ ! ** /src /test /** /out /
5+
6+ # ## Eclipse ###
7+ .apt_generated
8+ .classpath
9+ .factorypath
10+ .project
11+ .settings
12+ .springBeans
13+ .sts4-cache
14+ bin /
15+ ! ** /src /main /** /bin /
16+ ! ** /src /test /** /bin /
17+
18+ # ## NetBeans ###
19+ /nbproject /private /
20+ /nbbuild /
21+ /dist /
22+ /nbdist /
23+ /.nb-gradle /
24+
25+ # ## VS Code ###
26+ .vscode /
27+
28+ # ## Mac OS ###
29+ .DS_Store
30+
31+ * .iml
32+ * .idea
Original file line number Diff line number Diff line change 1+ package com .stacktips .designpatterns ;
2+
3+ import java .util .HashMap ;
4+ import java .util .LinkedList ;
5+ import java .util .Map ;
6+ import java .util .Queue ;
7+
8+ class RateLimiter {
9+
10+ private static RateLimiter instance ;
11+
12+ private Map <String , Queue <Integer >> userRequests ;
13+
14+ private static final int MAX_REQUESTS_PER_MINUTE = 3 ;
15+
16+ private RateLimiter () {
17+ userRequests = new HashMap <>();
18+ }
19+
20+ public static RateLimiter getInstance () {
21+ if (instance == null ) {
22+ synchronized (RateLimiter .class ) {
23+ if (instance == null ) {
24+ instance = new RateLimiter ();
25+ }
26+ }
27+ }
28+ return instance ;
29+ }
30+
31+ public synchronized boolean allowRequest (int timestamp , String userId ) {
32+ int currentMinute = timestamp / 60 ;
33+
34+ Queue <Integer > requests = userRequests .computeIfAbsent (userId , k -> new LinkedList <>());
35+ while (!requests .isEmpty () && requests .peek () / 60 < currentMinute ) {
36+ requests .poll ();
37+ }
38+
39+ if (requests .size () < MAX_REQUESTS_PER_MINUTE ) {
40+ requests .offer (timestamp );
41+ return true ;
42+ }
43+
44+ return false ;
45+ }
46+ }
Original file line number Diff line number Diff line change 1+ package com .stacktips .designpatterns ;
2+
3+ import java .util .Scanner ;
4+
5+ public class RateLimiterDemo {
6+ public static void main (String [] args ) {
7+ Scanner scanner = new Scanner (System .in );
8+ RateLimiter rateLimiter = RateLimiter .getInstance ();
9+
10+ while (true ) {
11+ System .out .print ("Enter user ID (or 'exit' to quit): " );
12+ String input = scanner .nextLine ();
13+
14+ if (input .equalsIgnoreCase ("exit" )) {
15+ break ;
16+ }
17+
18+ int currentTimestamp = (int ) (System .currentTimeMillis () / 1000 );
19+ if (rateLimiter .allowRequest (currentTimestamp , input )) {
20+ System .out .println ("Hello! Request accepted for user " + input );
21+ } else {
22+ System .out .println ("Rate limit exceeded for user " + input + ". Try again later." );
23+ }
24+ }
25+
26+ scanner .close ();
27+ System .out .println ("Program terminated." );
28+ }
29+ }
You can’t perform that action at this time.
0 commit comments