编辑: 苹果的酸 2013-04-16
分布式缓存服务 最佳实践 发布日期 2019-03-20 目录1使用 Redis 实现分布式锁.

1

2 使用 Redis 实现排行榜功能.6 分布式缓存服务 最佳实践 目录2019-03-20 ii 1使用 Redis 实现分布式锁 很多互联网场景(如商品秒杀,论坛回帖盖楼等),需要用加锁的方式,以对某种资 源进行顺序访问控制.本实践介绍如何使用Redis对分布式应用加锁. 本节基于华为云分布式缓存服务实践所编写,用于指导您在以下场景使用DCS实现分 布式锁. 场景介绍 很多互联网场景(如商品秒杀,论坛回帖盖楼等),需要用加锁的方式,以对某种资 源进行顺序访问控制.如果应用服务集群部署,则涉及到对分布式应用加锁. 当前分布式加锁主要有三种方式:(磁盘)数据库、缓存数据库、Zookeeper. 使用DCS服务中Redis类型的缓存实例实现分布式加锁,有几大优势: l 加锁操作简单,使用SET、GET、DEL等几条简单命令即可实现锁的获取和释放. l 性能优越,缓存数据的读写优于磁盘数据库与Zookeeper. l 可靠性强,DCS有主备和集群实例类型,避免单点故障. 加锁实现 以下代码实现仅展示使用DCS服务进行加锁访问的便捷性.具体技术实现需要考虑死 锁、锁的检查等情况,这里不做详细说明. package dcsDemo01;

import java.util.UUID;

import redis.clients.jedis.Jedis;

public class DistributedLock { private final String host = 192.168.0.220 ;

private final int port = 6379;

private static final String SUCCESS = OK ;

private static final String SET_IF_NOT_EXIST = NX ;

private static final String EXPIRE_TIME = PX ;

分布式缓存服务 最佳实践

1 使用 Redis 实现分布式锁 2019-03-20

1 public DistributedLock(){} /* * @param lockName 锁名 * @param timeout 获取锁的超时时间 * @param lockTimeout 锁的有效时间 * @return 锁的标识 */ public String getLockWithTimeout(String lockName, long timeout, long lockTimeout) { String ret = null;

Jedis jedisClient = new Jedis(host, port);

try { String authMsg = jedisClient.auth( if (!SUCCESS.equals(authMsg)) { System.out.println( AUTH FAILED: + authMsg);

} String identifier = UUID.randomUUID().toString();

String lockKey = DLock: + lockName;

long end = System.currentTimeMillis() + timeout;

while(System.currentTimeMillis() <

end) { String result = jedisClient.set(lockKey, identifier, SET_IF_NOT_EXIST, EXPIRE_TIME, lockTimeout);

if(SUCCESS.equals(result)) { ret = identifier;

break;

} try { Thread.sleep(2);

} catch (InterruptedException e) { Thread.currentThread().interrupt();

} } } catch (Exception e) { e.printStackTrace();

}finally { jedisClient.quit();

jedisClient.close();

} return ret;

} /* * @param lockName 锁名 * @param identifier 锁的标识 */ public void releaseLock(String lockName, String identifier) { Jedis jedisClient = new Jedis(host, port);

try { String authMsg = jedisClient.auth( if (!SUCCESS.equals(authMsg)) { System.out.println( AUTH FAILED: + authMsg);

} String lockKey = DLock: + lockName;

if(identifier.equals(jedisClient.get(lockKey))) { jedisClient.del(lockKey);

} } catch (Exception e) { e.printStackTrace();

}finally { jedisClient.quit();

分布式缓存服务 最佳实践

1 使用 Redis 实现分布式锁 2019-03-20

2 jedisClient.close();

} } } 测试代码 假设20个线程对10台mate10手机进行抢购: package dcsDemo01;

import java.util.UUID;

public class CaseTest { public static void main(String[] args) { ServiceOrder service = new ServiceOrder();

下载(注:源文件不在本站服务器,都将跳转到源网站下载)
备用下载
发帖评论
相关话题
发布一个新话题