用Redis实现分布式锁以及redission使用
原文:https://my.oschina.net/wangnian/blog/668830
前言:分布式环境有很多问题,比如你前一个请求访问的是服务器A,第二个请求访问到了服务器B,就会发生并发重复插入问题,这个时候需要依赖单点来实现分布锁,而redis就是。
先导入maven依赖 redission
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>2.2.13</version>
</dependency>
创建redission工具类
package redis;
import org.redisson.Config;
import org.redisson.Redisson;
import org.redisson.RedissonClient;
import org.redisson.core.RAtomicLong;
import org.redisson.core.RBucket;
import org.redisson.core.RCountDownLatch;
import org.redisson.core.RDeque;
import org.redisson.core.RList;
import org.redisson.core.RLock;
import org.redisson.core.RMap;
import org.redisson.core.RQueue;
import org.redisson.core.RSet;
import org.redisson.core.RSortedSet;
import org.redisson.core.RTopic;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/***
* Redis client的辅助工具类
* 用于连接Redis服务器 创建不同的Redis Server对应的客户端对象
* @author wangnian
* 博客地址:http://my.oschina.net/wangnian
*/
public class RedisUtils {
private static Logger logger= LoggerFactory.getLogger(RedisUtils.class);
private static RedisUtils redisUtils;
private RedisUtils(){}
/**
* 提供单例模式
* @return
*/
public static RedisUtils getInstance(){
if(redisUtils==null)
synchronized (RedisUtils.class) {
if(redisUtils==null) redisUtils=new RedisUtils();
}
return redisUtils;
}
/**
* 使用config创建Redisson
* Redisson是用于连接Redis Server的基础类
* @param config
* @return
*/
public RedissonClient getRedisson(Config config){
RedissonClient redisson=Redisson.create(config);
logger.info("成功连接Redis Server");
return redisson;
}
/**
* 使用ip地址和端口创建Redisson
* @param ip
* @param port
* @return
*/
public RedissonClient getRedisson(String ip,String port){
Config config=new Config();
config.useSingleServer().setAddress(ip+":"+port);
RedissonClient redisson=Redisson.create(config);
logger.info("成功连接Redis Server"+"\t"+"连接"+ip+":"+port+"服务器");
return redisson;
}
/**
* 关闭Redisson客户端连接
* @param redisson
*/
public void closeRedisson(RedissonClient redisson){
redisson.shutdown();
logger.info("成功关闭Redis Client连接");
}
/**
* 获取字符串对象
* @param redisson
* @param objectName
* @return
*/
public <T> RBucket<T> getRBucket(RedissonClient redisson,String objectName){
RBucket<T> bucket=redisson.getBucket(objectName);
return bucket;
}
/**
* 获取Map对象
* @param redisson
* @param objectName
* @return
*/
public <K,V> RMap<K, V> getRMap(RedissonClient redisson,String objectName){
RMap<K, V> map=redisson.getMap(objectName);
return map;
}
/**
* 获取有序集合
* @param redisson
* @param objectName
* @return
*/
public <V> RSortedSet<V> getRSortedSet(RedissonClient redisson,String objectName){
RSortedSet<V> sortedSet=redisson.getSortedSet(objectName);
return sortedSet;
}
/**
* 获取集合
* @param redisson
* @param objectName
* @return
*/
public <V> RSet<V> getRSet(RedissonClient redisson,String objectName){
RSet<V> rSet=redisson.getSet(objectName);
return rSet;
}
/**
* 获取列表
* @param redisson
* @param objectName
* @return
*/
public <V> RList<V> getRList(RedissonClient redisson,String objectName){
RList<V> rList=redisson.getList(objectName);
return rList;
}
/**
* 获取队列
* @param redisson
* @param objectName
* @return
*/
public <V> RQueue<V> getRQueue(RedissonClient redisson,String objectName){
RQueue<V> rQueue=redisson.getQueue(objectName);
return rQueue;
}
/**
* 获取双端队列
* @param redisson
* @param objectName
* @return
*/
public <V> RDeque<V> getRDeque(RedissonClient redisson,String objectName){
RDeque<V> rDeque=redisson.getDeque(objectName);
return rDeque;
}
/**
* 此方法不可用在Redisson 1.2 中
* 在1.2.2版本中 可用
* @param redisson
* @param objectName
* @return
*/
/**
public <V> RBlockingQueue<V> getRBlockingQueue(RedissonClient redisson,String objectName){
RBlockingQueue rb=redisson.getBlockingQueue(objectName);
return rb;
}*/
/**
* 获取锁
* @param redisson
* @param objectName
* @return
*/
public RLock getRLock(RedissonClient redisson,String objectName){
RLock rLock=redisson.getLock(objectName);
return rLock;
}
/**
* 获取原子数
* @param redisson
* @param objectName
* @return
*/
public RAtomicLong getRAtomicLong(RedissonClient redisson,String objectName){
RAtomicLong rAtomicLong=redisson.getAtomicLong(objectName);
return rAtomicLong;
}
/**
* 获取记数锁
* @param redisson
* @param objectName
* @return
*/
public RCountDownLatch getRCountDownLatch(RedissonClient redisson,String objectName){
RCountDownLatch rCountDownLatch=redisson.getCountDownLatch(objectName);
return rCountDownLatch;
}
/**
* 获取消息的Topic
* @param redisson
* @param objectName
* @return
*/
public <M> RTopic<M> getRTopic(RedissonClient redisson,String objectName){
RTopic<M> rTopic=redisson.getTopic(objectName);
return rTopic;
}
}
例子
package redis;
import org.junit.Test;
import org.redisson.Config;
import org.redisson.RedissonClient;
import org.redisson.SingleServerConfig;
import org.redisson.core.RBucket;
import org.redisson.core.RLock;
import java.util.concurrent.TimeUnit;
/**
* Created by wangnian on 2016/5/2.
*博客地址:http://my.oschina.net/wangnian
*/
public class RedissonTest {
@Test
public void test() throws InterruptedException {
//redisson配置
Config config = new Config();
SingleServerConfig singleSerververConfig = config.useSingleServer();
singleSerververConfig.setAddress("127.0.0.1:6379");
singleSerververConfig.setPassword("redis");
//redisson客户端
RedissonClient redissonClient = RedisUtils.getInstance().getRedisson(config);
RBucket<Object> rBucket = RedisUtils.getInstance().getRBucket(redissonClient, "key");
//rBucket.set("wangnian");
System.out.println(rBucket.get());
while (true) {
RLock lock = redissonClient.getLock("lock");
lock.tryLock(0, 1, TimeUnit.SECONDS);//第一个参数代表等待时间,第二是代表超过时间释放锁,第三个代表设置的时间制
try {
System.out.println("执行");
} finally {
lock.unlock();
}
}
}
}
如果生产上,我建议用 注解aop的方式 写个 lock的注解 比如 @lock("name")
用Redis实现分布式锁以及redission使用的更多相关文章
- Redis实现分布式锁的正确使用方式(java版本)
Redis实现分布式锁的正确使用方式(java版本) 本文使用第三方开源组件Jedis实现Redis客户端,且只考虑Redis服务端单机部署的场景. 分布式锁一般有三种实现方式: 1. 数据库乐观锁: ...
- 什么是分布式锁?Redis实现分布式锁详解
在很多场景中,我们为了保证数据的最终一致性,需要很多的技术方案来支持,比如分布式事务.分布式锁等.那具体什么是分布式锁,分布式锁应用在哪些业务场景.如何来实现分布式锁呢?今天继续由陈睿|mikeche ...
- 【Redis】分布式锁RedLock
普通实现 说道Redis分布式锁大部分人都会想到: 1.setnx+lua, 2.setkey value px milliseconds nx. - 获取锁(unique_value可以是UUID等 ...
- Redis(3)——分布式锁深入探究
一.分布式锁简介 锁 是一种用来解决多个执行线程 访问共享资源 错误或数据不一致问题的工具. 如果 把一台服务器比作一个房子,那么 线程就好比里面的住户,当他们想要共同访问一个共享资源,例如厕所的时候 ...
- 来吧,展示!Redis的分布式锁及其实现Redisson的全过程
前言 分布式锁是控制分布式系统之间同步访问共享资源的一种方式. 在分布式系统中,常常需要协调他们的动作.如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问这些资源的时候,往往需要 ...
- 面试题详解:如何用Redis实现分布式锁?
说一道常见面试题: 使用Redis分布式锁的详细方案是什么? 一个很简单的答案就是去使用 Redission 客户端.Redission 中的锁方案就是 Redis 分布式锁的比较完美的详细方案. 那 ...
- 基于redis 实现分布式锁的方案
在电商项目中,经常有秒杀这样的活动促销,在并发访问下,很容易出现上述问题.如果在库存操作上,加锁就可以避免库存卖超的问题.分布式锁使分布式系统之间同步访问共享资源的一种方式 基于redis实现分布式锁 ...
- 用Redis构建分布式锁-RedLock(真分布)
在不同进程需要互斥地访问共享资源时,分布式锁是一种非常有用的技术手段. 有很多三方库和文章描述如何用Redis实现一个分布式锁管理器,但是这些库实现的方式差别很大,而且很多简单的实现其实只需采用稍微增 ...
- 用Redis实现分布式锁 与 实现任务队列(转)
这一次总结和分享用Redis实现分布式锁 与 实现任务队列 这两大强大的功能.先扯点个人观点,之前我看了一篇博文说博客园的文章大部分都是分享代码,博文里强调说分享思路比分享代码更重要(貌似大概是这个意 ...
随机推荐
- WINDOWS 2008 采用IP策略解决445,139等病毒攻击问题
@echo off title 创建IP安全策略,屏蔽135.. . . . 等端口 :: 配置说明文档地址 :: http://blog.csdn.net/lpc_china/article/det ...
- Docker镜像和容器
本节内容: 安装Docker 卸载docker 镜像基本操作 容器基本操作 一.安装Docker Docker 对 Linux 内核版本的最低要求是3.10,如果内核版本低于 3.10 会缺少一些运行 ...
- CCF CSP 201412-4 最优灌溉
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201412-4 最优灌溉 问题描述 雷雷承包了很多片麦田,为了灌溉这些麦田,雷雷在第一个麦田挖 ...
- 【LOJ】#2054. 「TJOI / HEOI2016」树
题解 一写过一交A的水题 只要求一个dfs序,新加一个标记在子树所在的区间上覆盖上该点,维护深度最大的答案 代码 #include <bits/stdc++.h> #define ente ...
- Django实战(7):改造ProductList界面
有了上一节关于Django模板的基础,改造界面就很容易理解了.将界面设计师设计的页面中的内容根据复用程度分别放到基础模板base.html和专用模板productlist.html中. depot/t ...
- Think PHP 3.2 界面及JS多语言实现
1.多语言实现的原理在实现多语言的时候需要调用L()函数.那么L函数是如何实现多语言的输出呢?在L函数内部有一个静态变量$_lang一维数组.所有的语言数据都存在在这个数组中.系统在加载的时候根据选择 ...
- 洛谷P3527 [POI2011]MET-Meteors [整体二分]
题目传送门 Meteors 格式难调,题面就不妨放了. 分析: 一道整体二分的练手题. 就是一般的整体二分的套路,但是要注意,将修改和询问加入队列的时候要先加修改再加询问.另外,博主代码打得太丑,常数 ...
- linux 下rocketmq安装
一.解压mq(/data下)tar -zxvf Rocketmq-3.5.8.tar.gz 二.修改配置文件vi /etc/profileexport rocketmq=/data/alibaba-r ...
- Bipartite Graph hdu 5313 bitset 并查集 二分图
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5313 题意: 给出n个顶点,m条边,问最多添加多少条边使之构成一个完全二分图 存储结构: bitset ...
- poj3349(hash table)
做的第一道哈希表的题目.速度很慢,跑了3000+ms.采用六条边的和对一个大质数的余数作为哈希表的key,理论上质数取得越大,消耗的空间就越大,但是速度会加快,这里取了14997.地址冲突用链表解决. ...