package com.muyu.common.cache;

import com.muyu.common.cache.decoration.DecorationKey;

import java.util.List;
import java.util.Map;
import java.util.function.Function;

/**
 * @author DongZl
 * @description: Hash缓存基准
 * @Date 2024-3-29 下午 03:16
 */
public interface HashCache <K, HK, HV> extends DecorationKey<K> {


    /**
     * 编码
     * @param hashKey ID
     * @return 键
     */
    public String encodeHashKey(HK hashKey);

    /**
     * 解码
     * @param redisHashKey 数据库键
     * @return ID
     */
    public HK decodeHashKey(String redisHashKey);

    /**
     * 通过Key获取所有的map
     * @param key 数据库键
     * @return 所有集合Map
     */
    public Map<HK, HV> get(K key);

    /**
     * 通过键和hashKey获取数据库hashValue
     * @param key 键
     * @param hashKey hash键
     * @return hash值
     */
    public HV get(K key, HK hashKey);

    /**
     * 通过键和hashKey获取数据库hashValue
     * @param key 键
     * @param hashKeyList hash键集合
     * @return hash值
     */
    public List<HV> get(K key, HK... hashKeyList);

    /**
     * 获取hash值集合
     * @param key 键
     * @return hash值集合
     */
    public List<HV> getToList(K key);

    /**
     * 存储数据
     * @param key redis键
     * @param map hashMap集合
     */
    public void put(K key, Map<HK, HV> map);

    /**
     * 存储数据
     * @param key redis键
     * @param dataList 数据值
     * @param hashKey hash键
     */
    public void put(K key, List<HV> dataList, Function<HV, HK> hashKey);

    /**
     * 存储数据
     * @param key redis键
     * @param hashKey hash键
     * @param hashValue hash值
     */
    public void put(K key, HK hashKey, HV hashValue);

    /**
     * 通过redis键删除
     * @param key hash键
     */
    public void remove(K key);

    /**
     * 通过redis键和hash键删除
     * @param key redis键
     * @param hashKey hash键
     */
    public void remove(K key, HK hashKey);

    /**
     * 判断redis中hashKey是否存在
     * @param key redis键
     * @param hashKey hash键
     */
    public boolean hasKey(K key, HK hashKey);

}
