redis介绍、使用场景,请参考Redis总结(一)
redis配置、发布订阅,请参考Redis总结(二)
1、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); } }
基于内存的锁
private static final AtomicBoolean handleAccessDataFlag = new AtomicBoolean(true);
使用volatile的时候要注意,volatile 变量具有 synchronized 的可见性特性,但是不具备原子特性,线程能够自动发现 volatile 变量的最新值。因此作为内存锁的时候,需要配合synchronized 块使用。
使用volatile的条件是:
a、对变量的写操作不依赖于当前值。
b、该变量没有包含在具有其他变量的不变式中
private volatile boolean status;// 当前主机状态,1:可用,0不可用
2、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(); } } }
3、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; }