用Java代码操作redis,从简单的redis到复杂的分布式锁

 

目录

一、本地安装redis并启动

二、使用setnx实现一个简单的分布式锁

三、使用Redisson的分布式锁


一、本地安装redis并启动

条件比较差,只能先搞一个单机版的玩一下。

Redis的版本如上图,简单安装并启动,没有做任何配置。

先用Jredis做一下测试

        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.8.1</version>
        </dependency>
public class Tests {

    Jedis jedis = new Jedis("localhost",6379);
    
    @Test
    public void setCache() {
        jedis.set("key0","miller");
        System.out.println(jedis.get("key0"));
    }
}

二、使用setnx实现一个简单的分布式锁

//写一个简单的入门级别的分布式锁  redis是一个单线的模型,这样到达redis的请求就只能排队,一个一个来执行
    public String sycSell() {
        String lock_book_stock = "book:stock";
        String thread_name = Thread.currentThread().getName();

        try {
            //使用setnx命令可以实现一个简单的分布式锁
            Boolean ret = redisTemplate.opsForValue().setIfAbsent(lock_book_stock,thread_name,
                    3,TimeUnit.SECONDS);
            if(!ret) {
                return "errorCode";
            }
            //减库存的逻辑代码
            Integer stock = Integer.parseInt((String) redisTemplate.opsForValue().get("book:size"));
            if(stock> 0) {
                redisTemplate.opsForValue().set("book:size",stock-1);
                System.out.println("扣减库存成功");
            }

            else {
                System.out.println("库检库存失败");
            }
            //其他的逻辑省略 ...

        }finally { //刚刚执行到这里,要是运维给kill -9
            if(thread_name.equals(redisTemplate.opsForValue().get(lock_book_stock))) {
                redisTemplate.delete(lock_book_stock);
            }

        }
        return "success";
    }

分布式锁十分难驾驭,存在失效、死锁等问题。上边的代码在一般的软件公司,并发量不高的时候是可以满足需要的,但是在正真的互联网公司,这样的代码依旧存在问题。

三、使用Redisson的分布式锁

@RequestMapping(value = "/redisson",method = RequestMethod.GET)
    public HashMap<String,Object> sellUseRedisson() {
        HashMap<String,Object> back = new HashMap<>(2);
        Integer stock = 0;
        String lock_book_stock = "book:stock";
        RLock redissonLock = redisson.getLock(lock_book_stock);
        try {
            redissonLock.lock();
            //减库存的逻辑代码
            stock = (Integer)redisTemplate.opsForValue().get("book:size");
            if(stock> 0) {
                redisTemplate.opsForValue().set("book:size",stock-1);
                System.out.println("----扣减库存成功,扣减之前有多少库存: " + stock);
            }
            else {
                System.out.println("扣减库存失败");
            }
        }finally {
            redissonLock.unlock();
        }
        back.put("stock",stock);
        return back;
    }

使用很简单,只要使用@Bean装配一下就可以。

@SpringBootApplication
public class StudyRedisApplication {

/*    public UserCache userCache() {
        return new UserCache();
    }*/
    //初始化一个Redisson客户端
    @Bean
    public Redisson redisson() {
        Config config = new Config();
        config.useSingleServer().setAddress("redis://localhost:6379");
        return (Redisson) Redisson.create();
    }

    public static void main(String[] args) {
        SpringApplication.run(StudyRedisApplication.class, args);
    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值