Redis总结(三)

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;
    }

转载于:https://my.oschina.net/u/2282993/blog/1814668

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值