redis应用-incr,decr实现秒杀

redis的incr和decr 可以实现原子性的递增递减,可应用于高并发的秒杀活动、分布式序列号生成,访问量统计,每分钟只发送一次短信验证码等场景。对redis原子性的理解可参考我转载的一篇文章(https://mp.csdn.net/postedit/81066805)

这里使用jedis客户端采用多线程模拟高并发测试redis的原子性,假设场景为秒杀活动。

配置文件:applicationContext-base.xml



	








线程类:TicketThread.java

package site.zy9.redisApp.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import site.zy9.redisApp.jedis.impl.JedisClientSingle;

public class TicketThread implements Runnable{

	@Override
	public void run() {
		// TODO Auto-generated method stub
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext-*.xml");
		JedisPool jedisPool = (JedisPool) applicationContext.getBean("jedisPool");
		Jedis resource = jedisPool.getResource();
		//使用decr模拟卖票
		resource.decr("ticketNumber");
		resource.close();
	} 
}

测试类:RedisTestThree.java

package site.zy9.redisApp.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;


public class RedisTestThree {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//不要用junit测试多线程,好坑
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext-*.xml");
		//使用JedisPool获取jedis对象,因为JedisPool是线程安全的
		JedisPool jedisPool = (JedisPool) applicationContext.getBean("jedisPool");
		Jedis resource = jedisPool.getResource();
		resource.set("ticketNumber", "10");
		resource.close();
		for(int i=0;i<10;i++){
			//创建10个卖票线程
			new Thread(new TicketThread()).start();			
		}

	}
	


}


 

结果没问题,票数为0

 

你可能感兴趣的:(redis)