Jedis+redis实现抢票秒杀功能

该篇博客展示了如何使用Jedis进行Redis操作,包括批量删除Key、切换数据库及创建文件夹。此外,还详细解释了一个基于Jedis实现的抢票秒杀功能,通过线程池模拟并发用户进行抢购,利用Redis的事务处理并发安全性问题。

Jedis实现批量删除Key

long result = 0;
        Jedis jedis = new Jedis("101.199.64.121",9009);
        //设置redis的key,*代表模糊查询
            Set<String> set = jedis.keys("succ" +"*");
            Iterator<String> it = set.iterator();
            int i = 0;
            while(it.hasNext()){
                String keyStr = it.next();
                System.out.println(keyStr);
                i++;
                //执行删除操作
                result += jedis.del(keyStr);
            }
        System.err.println(i);

Jedis切换数据库并创建文件夹

Jedis jedis = new Jedis("101.199.64.121",9009);
        //切换redis数据库
        String select = jedis.select(15);
        System.err.println("select"+select);
        //键值对:键用':'拼接,在redis创建以demo开头的文件夹
        jedis.set("demo:test1","1");
        jedis.set("demo:test2","2");
        jedis.set("demo:test3","3");
        jedis.set("demo:test4","4");
        jedis.set("demo:test5","5");
        //关闭jedis连接
        jedis.close();

Jedis+redis实现抢票秒杀功能

 public static void main(String[] args) {
        final String watchkeys = "watchkeys";
        ExecutorService executor = Executors.newFixedThreadPool(20);//20个线程并发数
        final Jedis jedis  = new Jedis("101.199.64.121",9009);
        jedis.set(watchkeys,"100");//设置起始的抢够数
        jedis.close();
        //设置一千个人来发起抢购
        for (int i = 0; i < 1000; i++) {
            executor.execute(new MyRunnable("user"+getRandomString(6)));
        }
        executor.shutdown();
    }
    public static String getRandomString(int length) { //length是随机字符串长度

        String base = "abcdefghijklmnopqrstuvwxyz0123456789";
        Random random = new Random();
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < length; i++) {
            int number = random.nextInt(base.length());
            sb.append(base.charAt(number));
        }
        return sb.toString();
    }
创建线程类:
public class MyRunnable implements Runnable{
    String watchkeys = "watchkeys";// 监视keys
    Jedis jedis = new Jedis("101.199.64.121",9009);
    String userinfo;
    public MyRunnable() {
    }
    public MyRunnable(String uinfo) {
        this.userinfo=uinfo;
    }
    @Override
    public void run() {
        try {
            jedis.watch(watchkeys);// watchkeys

            String val = jedis.get(watchkeys);
            int valint = Integer.valueOf(val);

            if (valint <= 100 && valint>=1) {

                Transaction tx = jedis.multi();// 开启事务
                // tx.incr("watchkeys");
                tx.incrBy("watchkeys", -1);

                List<Object> list = tx.exec();// 提交事务,如果此时watchkeys被改动了,则返回null

                if (list == null ||list.size()==0) {

                    String failuserifo = "fail"+userinfo;
                    String failinfo="用户:" + failuserifo + "商品争抢失败,抢购失败";
                    System.out.println(failinfo);
                    /* 抢购失败业务逻辑 */
 //                   jedis.setnx(failuserifo, failinfo);
                } else {
                    for(Object succ : list){
                        String succuserifo ="succ"+succ.toString() +userinfo ;
                        String succinfo="用户:" + succuserifo + "抢购成功,当前抢购成功人数:"
                                + (1-(valint-100));
                        System.out.println(succinfo);
                        /* 抢购成功业务逻辑 */
 //                       jedis.setnx(succuserifo, succinfo);
                    }

                }

            } else {
                String failuserifo ="kcfail" +  userinfo;
                String failinfo1="用户:" + failuserifo + "商品被抢购完毕,抢购失败";
                System.out.println(failinfo1);
 //               jedis.setnx(failuserifo, failinfo1);
                // Thread.sleep(500);
                return;
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            jedis.close();
        }

    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值