gu.sql2java.redis.cache.RedisCacheReader Maven / Gradle / Ivy
The newest version!
package gu.sql2java.redis.cache;
import gu.simplemq.Channel;
import gu.simplemq.redis.JedisPoolLazy;
import gu.simplemq.redis.RedisFactory;
import gu.simplemq.redis.RedisTable;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.parser.ParserConfig;
import com.alibaba.fastjson.util.TypeUtils;
import com.google.common.base.Predicate;
import com.google.common.collect.Maps;
import java.util.Arrays;
import java.util.Collections;
import java.util.Map;
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
import static gu.sql2java.redis.cache.RedisCaches.getCacheKeyPrefix;
import static com.google.common.base.Strings.isNullOrEmpty;
/**
* 基于REDIS的数据库表记录缓存访问实现用于读取{@link RedisCache}保存在REDIS中的数据
* @author guyadong
*
*/
public class RedisCacheReader{
private final RedisTable table;
private final Channel channel;
/**
* 构造方法
* @param keyPrefix KEY的统一前缀,为{@code null}或空使用默认值{@link RedisCaches#getCacheKeyPrefix() }
* @param beanClassName 数据库记录对象
* @param columnName 用作REDIS key的字段名
*/
RedisCacheReader(String keyPrefix,String beanClassName,String columnName) {
if(isNullOrEmpty(keyPrefix)){
keyPrefix = getCacheKeyPrefix();
}
checkArgument(!isNullOrEmpty(beanClassName),"beanClassName is null or empty");
checkArgument(!isNullOrEmpty(columnName),"columnName is null or empty");
String channelName = RedisCaches.channelNameOf(keyPrefix, beanClassName, columnName);
channel = new Channel<>(channelName, JSONObject.class);
table = RedisFactory.getTable(channel, JedisPoolLazy.getDefaultInstance());
}
/**
* 构造方法
* @param beanClassName 数据库记录对象
* @param columnName 用作REDIS key的字段名
*/
RedisCacheReader(String beanClassName,String columnName) {
this(null, beanClassName, columnName);
}
/**
* @since 3.21.1
*/
public RedisTable getTable() {
return table;
}
/**
* 返回主键或索引键返回指定的数据库记录对象
* @param key
*/
public JSONObject get(Object key) {
return table.get(String.valueOf(key));
}
/**
* 返回主键或索引键返回指定的数据库记录对象的指定字段值,
* 如果不存在指定记录返回{@code defaultValue}
* @param key 主键值
* @param fieldName 字段名
* @param defaultValue 没找到记录或字段值为{@code null}时的返回的默认值
*/
public Object getField(Object key,String fieldName,Object defaultValue) {
JSONObject json = get(key);
Object v;
if(null != json && (null != (v = json.get(fieldName)))){
return v;
}
return defaultValue;
}
/**
* 返回主键或索引键返回指定的数据库记录对象的指定字段值,
* 如果不存在指定记录返回{@code null}
* @param key 主键值
* @param fieldName 字段名
*/
public Object getField(Object key,String fieldName) {
return getField(fieldName,null);
}
/**
* 返回主键或索引键返回指定的数据库记录对象的指定字段值,
* 如果不存在指定记录返回{@code defaultValue},否则将返回字段值转换为指定的字段类型
* @param key 主键值
* @param fieldName 字段名
* @param targetType 字段类型
* @param defaultValue 没找到记录或字段值为{@code null}时的返回的默认值
* @see TypeUtils#cast(Object, Class, ParserConfig)
*/
public T getField(Object key,String fieldName,Class targetType, T defaultValue) {
JSONObject json = get(key);
Object v;
if(null != json && (null != (v = json.get(fieldName)))){
return TypeUtils.cast(v,checkNotNull(targetType,"targetType is null"),ParserConfig.global);
}
return defaultValue;
}
/**
* 返回主键或索引键返回指定的数据库记录对象的指定字段值,
* 如果不存在指定记录返回{@code null},否则将返回字段值转换为指定的字段类型
* @param key 主键值
* @param fieldName 字段名
* @param targetType 字段类型
*/
public T getField(Object key,String fieldName,Class targetType) {
return getField(key,fieldName,targetType,null);
}
/**
* 返回主键或索引键返回指定的数据库记录对象的指定字段值,
* 如果不存在指定记录对应的字段值返回{@code defaultValue},否则将返回字段值转换为指定的字段类型
* @param fieldName 字段名
* @param targetType 字段类型
* @param defaultValue 没找到记录或字段值为{@code null}时的返回的默认值
* @param keys 主键值列表
* @see TypeUtils#cast(Object, Class, ParserConfig)
*/
public Map getField(String fieldName,Class targetType,T defaultValue,Iterable keys) {
Map values = get(keys);
return Maps.transformValues(values, r->{
Object v = r.get(fieldName);
return null == v ? defaultValue : TypeUtils.cast(v,targetType,ParserConfig.global);
});
}
/**
* 返回主键或索引键返回指定的数据库记录对象的指定字段值,
* 如果不存在指定记录对应的字段值返回{@code defaultValue},否则将返回字段值转换为指定的字段类型
* @see #getField(String, Class, Object, Iterable)
*/
@SuppressWarnings("unchecked")
public Map getField(String fieldName,Class targetType,T defaultValue, K... keys) {
return getField(fieldName,targetType,defaultValue,null != keys ? Arrays.asList(keys) : Collections.emptyList());
}
/**
* 返回主键或索引键返回指定的数据库记录对象的指定字段值,
* 如果不存在指定记录对应的字段值返回{@code null},否则将返回字段值转换为指定的字段类型
* @see #getField(String, Class, Object, Iterable)
*/
public Map getField(String fieldName,Class targetType,Iterable keys) {
return getField(fieldName, targetType, null,keys);
}
/**
* 返回主键或索引键返回指定的数据库记录对象的指定字段值,
* 如果不存在指定记录对应的字段值返回{@code null},否则将返回字段值转换为指定的字段类型
* @see #getField(String, Class, Object, Iterable)
*/
@SuppressWarnings("unchecked")
public Map getField(String fieldName,Class targetType,K... keys) {
return getField(fieldName, targetType, null,keys);
}
public Map get(String... keys) {
return table.get(keys);
}
/**
* 以T-JSON映射形式返回主键或索引键返回指定的数据库记录对象
* @param keys
*/
public Map get(Iterable keys) {
return table.get(keys);
}
/**
* 以T-JSON映射形式返回主键或索引键返回指定的数据库记录对象
* @param keys
*/
@SuppressWarnings("unchecked")
public Map get(T... keys) {
return table.get(keys);
}
/**
* 遍历表中所有key执行指定的{@code action}
* @param action
* @return 返回{@code action}执行为{@code true}的数量
*/
public int foreach(Predicate action) {
return table.foreach(null, action);
}
/**
* 遍历表所有元素执行指定的{@code action}
* @param action
* @return 返回{@code action}执行为{@code true}的数量
* @since 3.21.1
*/
public int foreachValue(Predicate action) {
return table.foreachValue(null, action);
}
}