目录
一、本地安装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);
}
}