`

redis 事物限制频率和获得令牌

    博客分类:
  • JAVA
阅读更多
package com.dongnaoedu.tony.service;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.connection.RedisStringCommands.SetOption;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.types.Expiration;
import org.springframework.stereotype.Component;

@Component
public class MiaoshaService {

private final Logger logger = LoggerFactory.getLogger(MiaoshaService.class);

@Autowired
StringRedisTemplate stringRedisTemplate;

@Autowired
DatabaseService databaseService;

/**
* 秒杀具体实现
*
* @param goodsCode
*            商品编码
* @param userId
*            用户ID
* @return
*/
public boolean miaosha(String goodsCode, final String userId) {
// 方案3: 频率限制
// 用户操作频率限制,5秒内允许访问一次
// set setnx setex
boolean value = stringRedisTemplate.execute(new RedisCallback<Boolean>() {

@Override
public Boolean doInRedis(RedisConnection connection) throws DataAccessException {
Boolean result = connection.set(userId.getBytes(), "".getBytes(), Expiration.milliseconds(10000L),
SetOption.SET_IF_ABSENT);
return result;
}
});
if (!value) {
System.out.println("被限制操作频率啦,用户:" + userId);
return false;
}

// 方案4: 令牌机制
// 取令牌,拿到令牌的允许尝试购买
String token = stringRedisTemplate.opsForList().leftPop("token_list");
if (token == null || "".equals(token)) {
System.out.println("没抢到Token,不参与秒杀,用户:" + userId);
return false;
}

boolean result = databaseService.buy(goodsCode, userId);
System.out.println("秒杀结果:" + result);
return result;
}
}
分享到:
评论

相关推荐

    Go-利用Redis和Golang实现分布式令牌桶算法

    综上所述,这个项目涉及使用Go语言和Redis实现分布式令牌桶算法,目的是实现速率限制和网络拥塞控制。通过在Go中设计相应的数据结构和算法,并利用Redis的分布式特性,可以构建出一个健壮且高效的系统,适用于大型...

    redis令牌机制实现秒杀系统

    秒杀是电商系统非常常见的...本教程采用:redis中list类型达到令牌机制完成秒杀。用户抢redis中的令牌,抢到 令牌的用户才能进行支付,支付成功之后可以生成订单,如果一定时间之内没有支 付那么就由定时任务来归还令牌

    redis-limit:redis 使用令牌桶算法支持的速率限制器

    重新限制描述一个简单的 redis 支持的速率限制器。 这是基于和 。 桶不断地重新装满令牌。 这意味着设置 1000 毫秒的interval和 10 个请求的maxInInterval将以每秒 10 个令牌(每 0.1 秒 1 个令牌)的速率填充令牌。...

    php 基于redis使用令牌桶算法实现流量控制

    系统在运行过程中,如遇上某些活动,访问的人数会在一瞬间内爆增,导致服务器瞬间压力飙升,使系统超...本文介绍php基于redis,使用令牌桶算法,实现访问流量的控制,提供完整算法说明及演示实例,方便大家学习使用。

    ServiceStack.Redis破除每小时访问6000次的限制

    ServiceStack.Redis版本:5.14.0 使用方法:替换nuget包中ServiceStack.Text.dll即可

    Redis 事物(下).flv

    Redis 事物(下).flv

    Go-ratelimit使用Redis来Ratelimit限制你的方法

    Redis可以用来存储令牌的数量和上一次添加令牌的时间。 以下是一个简单的实现思路: 1. 在每个请求到达时,获取当前时间戳。 2. 计算自上次添加令牌以来应该添加的令牌数。 3. 如果桶中的令牌数量小于这个值,使用...

    ServiceStack.Redis 目前最新版6.9.0.0绕过6000限制

    标题提到的“绕过6000限制”可能指的是Redis默认的最大连接数限制,通常是6000个连接。在高并发场景下,如果应用需要超过这个数量的连接,可能会遇到问题。ServiceStack.Redis的最新版本6.9.0.0可能包含了某种优化或...

    (5.8.1.0)ServiceStack.Redis(已取消6000限制)

    总的来说,ServiceStack.Redis(5.8.1.0)是一个针对高并发需求优化的Redis客户端,取消了操作限制,更适合大规模应用和高性能场景。如果你的应用需要频繁且无限制地访问Redis,这个版本是一个不错的选择。在使用时,...

    ServiceStack.Redis 去除6000限制版本

    这个"ServiceStack.Redis 去除6000限制版本"指的是开发者可能已经修改了原始的ServiceStack.Redis库,移除了连接数目的硬性限制,通常是6000个并发连接。 在原版ServiceStack.Redis库中,可能由于某些设计考量或...

    ServiceStack.Redis无6000限制已经编译后的版本

    ServiceStack.Redis无6000限制已经编译后的版本

    redis部署6.2.6最新稳定版文档和程序 redis部署6.2.6最新稳定版文档和程序

    redis部署6.2.6最新稳定版文档和程序redis部署6.2.6最新稳定版文档和程序redis部署6.2.6最新稳定版文档和程序redis部署6.2.6最新稳定版文档和程序redis部署6.2.6最新稳定版文档和程序redis部署6.2.6最新稳定版文档和...

    第61天:权限提升-Redis&Postgre&令牌窃取&进程注入1

    本文以“第61天:权限提升-Redis&Postgre&令牌窃取&进程注入1”为主题,探讨了四种不同的提权策略,分别是通过数据库应用提权、Redis数据库权限提升、PostgreSQL数据库权限提升以及Windows系统的令牌窃取和进程注入...

    Go-rerate-Go基于Redis的计数器和速率限制器

    总的来说,"Go-rerate"是一个实用的工具,它结合了Go语言的高效和Redis的分布式特性,为开发者提供了一种简单而强大的方式来管理和限制应用程序的速率,有助于维护系统的稳定性和安全性。通过深入理解和使用这个库,...

    Redis Spring 并发限制动态代理

    总结来说,"Redis Spring 并发限制动态代理"是利用Spring的AOP和线程池技术,为Redis操作提供了一种安全、高效的并发解决方案。动态代理保证了连接的生命周期管理,线程池则控制了并发访问的规模,防止资源过度消耗...

    Redis安装包和Redis jar包

    Redis是一种高性能的键值对数据存储系统,常用于实现数据库、缓存和消息中间件等功能。它以内存存储为主,支持持久化,确保在系统崩溃或重启后数据不会丢失。Redis提供了丰富的数据类型,包括字符串、哈希、列表、...

    jsonwebtoken-redis:由Redis管理的令牌到期的JWT

    令牌到期时间可以由Redis完全管理。 您可以通过从Redis中删除令牌来使令牌无效。 您可以推迟令牌过期。 没有回调。 所有函数都返回Promises。 安装 npm install jsonwebtoken - redis 快速开始 const Redis = ...

    php 使用redis锁限制并发访问类

    在PHP开发中,当面临高并发访问同一资源的情况时,为避免数据冲突和不一致,我们需要采取...通过阅读和理解`RedisLock.class.php`和`demo.php`的内容,开发者可以更好地掌握如何在PHP项目中应用这种并发访问限制技术。

    ServiceStack.Redis 4.5.0.0破解版去除次数限制

    ServiceStack.Redis 4.5.0.0 已解除license限制

Global site tag (gtag.js) - Google Analytics