Redis总结(三)

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;
    }
相关文章
相关标签/搜索