Redis11——使用Redis和lua实现抢红包

 Redis 的功能不如数据库强大,事务也不完整,因此要保证数据的正确性需要通过严格的验证。而 Redis 的 Lua 语言是原子性的,且功能更为强大,所以优先选择使用 Lua 语言来实现抢红包。但是无论如何对于数据而言,在 Redis 当中存储,始终都不是长久之计,因为 Redis 并非一个长久储存数据的地方,它是非严格和安全的环境,更多的时候只是为了提供更为快速的缓存。所以当红包金额为 0 或者红包超时的时候(超时操作可以使用定时机制实现),会将红包数据保存到数据库中,这样才能够保证数据的安全性和严格性。
在这里插入图片描述

 1、配置RedisTemplate

@Bean
public RedisTemplate initRedisTemplate() {
   
	JedisPoolConfig poolConfig = new JedisPoolConfig();
	// 最大空闲数
	poolConfig.setMaxIdle(50);
	// 最大连接数
	poolConfig.setMaxTotal(100);
	// 最大等待毫秒数
	poolConfig.setMaxWaitMillis(20000);
	// 创建Jedis链接工厂
	JedisConnectionFactory connectionFactory = new JedisConnectionFactory(poolConfig);
	connectionFactory.setHostName("localhost");
	connectionFactory.setPort(6379);
	// 调用后初始化方法,没有它将抛出异常
	connectionFactory.afterPropertiesSet();
	// 自定Redis序列化器
	RedisSerializer jdkSerializationRedisSerializer = new JdkSerializationRedisSerializer();
	RedisSerializer stringRedisSerializer = new StringRedisSerializer(); // 定义RedisTemplate,并设置连接工厂
	RedisTemplate redisTemplate = new RedisTemplate();
	redisTemplate.setConnectionFactory(connectionFactory);
	// 设置序列化器
	redisTemplate.setDefaultSerializer(stringRedisSerializer);
	redisTemplate.setKeySerializer(stringRedisSerializer);
	redisTemplate.setValueSerializer(stringRedisSerializer);
	redisTemplate.setHashKeySerializer(stringRedisSerializer);
	redisTemplate.setHashValueSerializer(stringRedisSerializer);
	return redisTemplate;
}

  注意:JedisConnectionFactory 对象在最后的时候需要自行调用 afterPropertiesSet 方法,它实现了 InitializingBean 接口。如果将其配置在 Spring IoC 容器中,Spring 会自动调用它,但是这里我们是自行创建的,因此需要自行调用,否则在运用的时候会抛出异常,从而出现错误。
 2、lua脚本内容

--缓存抢红包列表信息列表key
local listKey = 'red_packet_list_'..KEYS[1]
--当前被抢红包key
local redPacket = 'red_packet_'..KEYS[1]
--获取当前红包库存
local stock = tonumber(redis.call('hget', redPacket, 'stock'))
--没有库存,返回为0
if stock <= 0 then return 0 end
--库存减1
stock = stock -1
--保存当前库存
redis.call('hset',redPacket,'stock', tostring(stock))
--往链表中加入当前红包信息
redis.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值