All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.jahhan.cache.repository.common.AbstractSimpleRepository Maven / Gradle / Ivy

package net.jahhan.cache.repository.common;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;

import javax.inject.Inject;

import net.jahhan.cache.util.SerializerUtil;
import net.jahhan.common.extension.constant.BaseConfiguration;
import net.jahhan.common.extension.utils.BeanTools;
import net.jahhan.spi.DBCache;

public abstract class AbstractSimpleRepository {

	@Inject
	protected DBCache cache;

	/**
	 * 在redis中存活的时间
	 * 
	 * @return
	 */
	public int getExistSecond() {
		return BaseConfiguration.GLOBAL_EXPIRE_SECOND;
	}

	/**
	 * 获取redis对应的key,一般是在id前面加个前缀
	 * 
	 * @param k
	 *            记录的id
	 * @return
	 */
	protected abstract String getKey(String id);

	/**
	 * 获取本Repository要操作的表名称
	 * 
	 * @return
	 */
	protected abstract String getType();

	/**
	 * 根据id获取值
	 * 
	 * @param id
	 * @return
	 */
	public String get(String id) {
		String key = getKey(id);
		return cache.get(key);
	}

	public byte[] getBytes(String id) {
		String key = getKey(id);
		return cache.getBinary(key.getBytes());
	}

	/**
	 * @param id
	 *            根据id获取json
	 * @param json
	 */
	public void set(String id, Object object) {
		String key = getKey(id);
		cache.setByte(key.getBytes(), SerializerUtil.serializeFrom(object));
	}

	public void del(String id) {
		String key = getKey(id);
		cache.del(key);
	}

	protected String[] getKeys(String[] ids) {
		String[] keys = new String[ids.length];
		for (int i = 0; i < ids.length; i++) {
			keys[i] = getKey(ids[i]);
		}
		return keys;
	}

	/**
	 * 只能在不分库的表中使用
	 * 
	 * @param ids
	 */
	public void delMulti(String[] ids) {
		if (ids == null || ids.length == 0) {
			return;
		}
		cache.del(ids);
	}

	/**
	 * 批量获取id对应的值. 注意:这个方法仅适用于不需要分库的表
	 * 
	 * @param ids
	 * @return
	 */
	public List getMultiValue(Collection ids) {
		if (ids == null || ids.isEmpty()) {
			return new ArrayList();
		}
		String[] keys = getKeys(ids.toArray(new String[ids.size()]));
		return cache.mget(keys);
	}

	public List getMultiByteValue(Collection ids) {
		if (ids == null || ids.isEmpty()) {
			return new ArrayList();
		}
		String[] idsString = new String[ids.size()];
		int i = 0;
		for (byte[] idByte : ids) {
			idsString[i] = new String(idByte);
			i++;
		}
		String[] keys = getKeys(idsString);
		byte[][] keysB = new byte[ids.size()][];
		for (int j = 0; j < ids.size(); j++) {
			keysB[j] = keys[j].getBytes();
		}
		return cache.mgetByte(keysB);
	}

	/**
	 * 批量获取id对应的值. 注意:这个方法仅适用于不需要分库的表
	 * 
	 * @param 
	 * 
	 * @param ids
	 * @return
	 */
	public  List getMultiValue(Collection ids, Class clazz) {
		if (ids == null || ids.isEmpty()) {
			return new ArrayList();
		}
		String[] keys = getKeys(ids.toArray(new String[ids.size()]));
		byte[][] keysB = new byte[ids.size()][];
		for (int i = 0; i < ids.size(); i++) {
			keysB[i] = keys[i].getBytes();
		}
		List multi = cache.mgetByte(keysB);
		List result = new ArrayList<>();
		for (byte[] b : multi) {
			T object = SerializerUtil.deserialize(b, clazz);
			result.add(object);
		}
		return result;
	}

	/**
	 * 批量获取id对应的值.值的顺序和ids的顺序一致 注意:这个方法仅适用于不需要分库的表
	 * 
	 * @param ids
	 * @return
	 */
	public List getMultiValue(String[] ids) {
		if (ids == null || ids.length == 0) {
			return new ArrayList();
		}
		String[] keys = getKeys(ids);
		return cache.mget(keys);
	}

	/**
	 * @param id
	 * @param time
	 *            系统时间,单位是毫秒
	 */
	public void pexpiredAt(String id, long time) {
		String key = getKey(id);
		cache.pexpireAt(key, time);
	}

	public void expired(String id, int seconds) {
		String key = getKey(id);
		cache.expire(key, seconds);
	}

	public boolean exists(String id) {
		String key = getKey(id);
		return cache.exists(key);
	}

	/**
	 * 部分更新对象的时候,如果redis中有当前对象,将当前对象取出,更新对象,然后刷新到缓存
	 * 
	 * @param id
	 *            redis中的id,注意:不是key
	 * @param updatedObj
	 *            部分更新的对象
	 * @param checkedClass
	 *            用于校验updatedObj,如果updatedObj不能转义为该类型,就不做操作
	 * @author nince
	 */
	protected void merge(String id, Object updatedObj, Class checkedClass) {
		if (!checkedClass.isInstance(updatedObj)) {
			return;
		}
		byte[] returnBytes = getBytes(id);

		if (returnBytes != null) {
			Object mergeObject = mergeObject(SerializerUtil.deserialize(returnBytes, checkedClass), updatedObj);
			set(id, mergeObject);
			expired(id, getExistSecond());
		}
	}

	private static Object mergeObject(Object old, Object updatedObject) {
		Map map = BeanTools.toMap(old);
		Map map2 = BeanTools.toMap(updatedObject);
		map.putAll(map2);
		BeanTools.copyFromMap(updatedObject, map);
		return updatedObject;
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy