redis介绍、使用场景,请参考Redis总结(一)redis
redis配置、发布订阅,请参考Redis总结(二)数据库
一、redis分布式锁的使用缓存
try{lock()}finally{unLock()}分布式
/** * 获取锁 */ public static boolean lock(String key, int seconds) { try { Object value = jedisUtil.get(key); if (value != null) { log.info("【锁】任务已被锁定,KEY=" + key); return false; } if (jedisUtil.setnx(key, "", seconds) == 1) { log.info("【锁】锁定当前任务,KEY=" + key); return true; } } catch (Exception e) { log.error("【锁】任务解锁时出错", e); } return false; } /** * 释放锁 */ public synchronized static void unLock(String key) { try { Object value = jedisUtil.get(key); if (value != null) { jedisUtil.del(key); } log.info("【锁】解锁当前任务,KEY=" + key); } catch (Exception e) { log.error("【锁】任务解锁时出错", e); } }
基于内存的锁ide
private static final AtomicBoolean handleAccessDataFlag = new AtomicBoolean(true);
使用volatile的时候要注意,volatile 变量具备 synchronized 的可见性特性,可是不具有原子特性,线程可以自动发现 volatile 变量的最新值。所以做为内存锁的时候,须要配合synchronized 块使用。.net
使用volatile的条件是:线程
a、对变量的写操做不依赖于当前值。blog
b、该变量没有包含在具备其余变量的不变式中队列
private volatile boolean status;// 当前主机状态,1:可用,0不可用
二、redis队列的使用内存
public void handleUploadAccessData(String tableName,String userName,StringBuffer realPath) throws Exception{ Jedis jedis = null; try { jedis = jedisUtil.getJedis(); // 若是当前表正在执行则放入队列 if(jedis.llen(tableName) != 0){ // 放入队列等待 logger.info("台帐转换进入队列等待………………,队列名为:" + tableName); jedis.lpush(tableName,userName); return; } // 执行放入队列 jedis.lpush(tableName,userName); // 设置失效时间,防止出现异常消费不了的状况 jedis.expire(tableName,60*30); // 循环执行队列中的消息 while(true){ //todo to do you business jedis.lpop(tableName); if(jedis.llen(tableName) == 0){ return; } } } catch (Exception e) { jedis.lpop(tableName); }finally { if(jedis != null){ jedis.close(); } } }
三、redis缓存的使用
@Override public List<AccessDic> getCFAccessDic() { List<AccessDic> assetDics =null; try { assetDics = jedisUtil.getLs(JedisKey.getCFPrefixkey()); if(assetDics == null || assetDics.size() == 0){ // 查询数据库 // assetDics = dao.method(); jedisUtil.setLs(JedisKey.getCFPrefixkey(), assetDics, 1 * 60 * 60); } } catch (Exception e) { //todo } return assetDics; }