缓存AS的增删改查

120 阅读2分钟

一 简介

   AS是Aerospike的简介,他是和redis一样的缓存,他比redis在某些条件下更快一些,但是AS的支持的数据结构比较单一,而redis支持的比较丰富。另外AS的bin的key有长度限制,大概16个字符。剩下的就不介绍了,开始进入增删改查。
Aerospike的数据结构介绍

  • Namespace:类似于数据库(Database),是数据库的最高层次划分。
  • Set:类似于表(Table),用于进一步在命名空间内对数据进行细分。
  • Key:唯一标识一条记录。
  • Bins:类似于列(Column),每条记录包含的字段和值。

二 查询

public Record queryRecord(String key){
    Key key2 = new Key(namespace, setName, key);
    Record record = null;
    try{
        record = client.get(null, key2);
    }catch(Exception e){
        log.error("AS查询数据失败, key={}", key2);
        throw new RuntimeException("AS查询数据失败");
    }
    return record;
}

三 增加

// 向as中报错一条int的value数据
public boolean saveOneData(String keyName, String binName, Long value){
    Key key = new Key(namespace, setName, key);
    Bin bin = new Bin(binName, value);
    try{
        client.put(null, key, bin);
    }catch(Exception e){
        log.error("AS添加数据失败, key={}", key);
        throw new RuntimeException("AS添加数据失败");
    }
    return true;
}
// 实际bin的value是一个Object,放什么类型都可以
public boolean saveData(String keyName, String binName, String value){
    Key key = new Key(namespace, setName, key);
    Bin bin = new Bin(binName, value);
    try{
        client.put(null, key, bin);
    }catch(Exception e){
        log.error("AS添加数据失败, key={}", key);
        throw new RuntimeException("AS添加数据失败");
    }
    return true;
}

// 还有一个统计数量的新增,这个方法的新增是原子性的
public boolean addExternalInt(String keyName, String binName, Integer value, Integer expire){
    // 设置过期时间
    WritePolicy policy = asConfig.expireWritePolicy(expire);
    Key key = new Key(namespace, setName, keyName);
    // 每次操作需要增加的数量
    Bin bin = new Bin(binName, Integer.valueof(value));
    try{
        client.add(policy, key, bin);
    }catch(Exception e){
        log.error("AS添加数据失败, key={}", key);
        return false;
    }
}

// 原子性的保存
public boolean save(String keyName, Object value, Integer expire){
    // 设置过期时间
    WritePolicy policy = asConfig.expireWritePolicy(expire);
    Key key = new Key(namespace, setName, keyName);
    String name = "name";
    Bin bin = new Bin(name, value);
    try{
        Record record = client.operate(policy, key, Operation.put(bin), Operation.get(name));
    }catch(Exception e){
        log.error("AS添加数据失败, key={}", key);
        return false;
    }
}

四 删除

// 根据key删除
public void delete(String key){
    Key key = new Key(namespace, setName, key);
    try{
        //witePolicy是as自带的,直接注入使用就行@Autowired private WitePolicy witePolicy;
        client.delete(witePolicy, key);
    }catch(Exception e){
        log.error("AS删除数据失败, key={}", key);
        throw new RuntimeException("AS删除数据失败");
    }
}

// 删除key中的bin
public void deleteByBinName(String keyName, String binName){
    Key key = new Key(namespace, setName, key);
    Bin binToDel = Bin.asNull(binName);
    try{
        client.put(null, key, binToDel);
    }catch(Exception e){
        log.error("AS删除数据失败, key={}", key);
        throw new RuntimeException("AS删除数据失败");
    }
}

五 判断key是否存在

public Boolean keyIsExists(String key){
    Key key2 = new Key(namespace, setName, key);
    Boolean exists;
    try{
        exists = client.exists(null, key2);
    }catch(Exception e){
        log.error("AS删除数据失败, key={}", key2);
        throw new RuntimeException("AS删除数据失败");
    }
    return exists;
}