1. 程式人生 > >【Redis】Java之Redis工具類

【Redis】Java之Redis工具類

我就不介紹Redis是什麼了。
(一個月前寫的工具類,一直忘記分享了,算是比較全的Java-Redis工具類)
直接上程式碼吧。

先給出在spring 中配置Redis的程式碼。你在其他類用的時候,直接用註解自動注入就可以了。

redis.properties

##訪問地址
redis.host=127.0.0.1
##訪問埠
redis.port=6379
##注意,如果沒有password,此處不設定值,但這一項要保留
redis.password=你的密碼

#最大能夠保持idel狀態的物件數
redis.maxIdle=150
#連線池的最大資料庫連線數。設為0表示無限制 最大分配的物件數
redis.maxActive=300
#連線耗盡時是否阻塞, false報異常,ture阻塞直到超時, 預設true
redis.blockWhenExhausted=true
#獲取連線時的最大等待毫秒數(如果設定為阻塞時BlockWhenExhausted),如果超時就拋異常, 小於零:阻塞不確定的時間,  預設-1
redis.maxWait=10000
#在borrow一個jedis例項時,是否提前進行alidate操作;如果為true,則得到的jedis例項均是可用的;
redis.testOnBorrow=true
#jedis呼叫returnObject方法時,是否進行有效檢查 #
redis.testOnReturn=true
#在空閒時檢查有效性, 預設false
redis.testWhileIdle=true
#表示idle object evitor兩次掃描之間要sleep的毫秒數;
redis.timeBetweenEvictionRunsMillis=30000
#表示一個物件至少停留在idle狀態的最短時間,
#然後才能被idle object evitor掃描並驅逐;這一項只有在timeBetweenEvictionRunsMillis大於0時才有意義;
redis.minEvictableIdleTimeMillis=-1

#連線空閒的最小時間,達到此值後空閒連結將會被移除,且保留“minIdle”個空閒連線數。
#如果minEvictableIdleTimeMillis>0,則此項設定無意義,且只有在timeBetweenEvictionRunsMillis大於0時才有意義;
redis.softMinEvictableIdleTimeMillis=60000

spring.xml中配置redis

  <!-- S Redis 配置-->
    <!-- scanner redis properties  -->
    <context:property-placeholder location="classpath:redis.properties" ignore-unresolvable="true"/>
    <!--(1)如果你有多個數據源需要通過
    <context:property-placeholder管理,且不願意放在一個配置檔案裡,
    那麼一定要加上ignore-unresolvable=“true"(每一個都需要加這個屬性)-->
<!--(2)注意新版的(從3.0版本開始棄用)JedisPoolConfig的property name, 不是maxActive而是maxTotal,而且沒有maxWait屬性,建議看一下Jedis原始碼。--> <!-- redis連線池 --> <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig"> <property name="maxTotal" value="${redis.maxActive}">
</property> <property name="maxIdle" value="${redis.maxIdle}"></property> <property name="maxWaitMillis" value="${redis.maxWait}"></property> <property name="testOnBorrow" value="${redis.testOnBorrow}"></property> <property name="testOnReturn" value="${redis.testOnReturn}"></property> <property name="blockWhenExhausted" value="${redis.blockWhenExhausted}"></property> <property name="testWhileIdle" value="${redis.testWhileIdle}"></property> <property name="timeBetweenEvictionRunsMillis" value="${redis.timeBetweenEvictionRunsMillis}"></property> <property name="minEvictableIdleTimeMillis" value="${redis.minEvictableIdleTimeMillis}"></property> <property name="softMinEvictableIdleTimeMillis" value="${redis.softMinEvictableIdleTimeMillis}"></property> </bean> <!-- redis連線工廠 --> <bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:host-name="${redis.host}" p:port="${redis.port}" p:password="${redis.password}" p:pool-config-ref="jedisPoolConfig" p:usePool="true"/> <!-- redis操作模板,這裡採用儘量面向物件的模板 --> <!--<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate"> 使用上句會無法使用模糊匹配 --> <!-- p:enable-transaction-support="false" 設定setEnableTransactionSupport(true),當前執行緒會強制先 MULTI命令 --> <bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate" p:enable-transaction-support="true"> <property name="connectionFactory" ref="connectionFactory"/> <!-- 如果不配置Serializer,那麼儲存的時候只能使用String,如果用物件型別儲存,那麼會提示錯誤 can't cast to String!!!--> <property name="keySerializer"> <!--對key的預設序列化器。預設值是StringSerializer--> <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/> </property> <!--是對value的預設序列化器,預設值是取自DefaultSerializer的JdkSerializationRedisSerializer。--> <property name="valueSerializer"> <bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/> </property> <!--儲存Map時key需要的序列化配置--> <property name="hashKeySerializer"> <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/> </property> <!--儲存Map時value需要的序列化配置--> <property name="hashValueSerializer"> <bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/> </property> <!--開啟事務 系統自動幫我們拿到了事務中繫結的連線。可以在一個方法的多次對Redis增刪該查中,始終使用同一個連線。 --> <property name="enableTransactionSupport" value="true"/> <!--在Spring中@Transactional 也是可以進行事物控制的。--> </bean> <!-- 快取管理器: 使用redis 當做快取 --> <!--<bean id="cacheManager" class="org.springframework.data.redis.cache.RedisCacheManager">--> <!--<constructor-arg ref="redisTemplate"/>--> <!--</bean>--> <!-- cache配置 --> <!-- E Redis 配置-->

Redis操作的介面


package com.uifuture.utils.redis;

import org.springframework.data.redis.connection.DataType;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.data.redis.core.ZSetOperations;
import org.springframework.util.CollectionUtils;

import java.io.Serializable;
import java.util.*;
import java.util.concurrent.TimeUnit;

/**
 * Created with IntelliJ IDEA.
 * User: 陳浩翔.
 * Date: 2017/4/10.
 * Time: 上午 12:11.
 * Explain: Redis操作的介面
 */
public interface RedisCommand<K, V> {

    /**
     * 使用者排序通過註冊時間的 權重值
     * @param date
     * @return
     */
    double getCreateTimeScore(long date);
    /**
     * 獲取Redis中所有的鍵的key
     * @return
     */
    Set<K> getAllKeys();

    /**
     * 獲取所有的普通key-value
     * @return
     */
    Map<K,V> getAllString();

    /**
     * 獲取所有的Set -key-value
     * @return
     */
    Map<K,Set<V>> getAllSet();
    /**
     * 獲取所有的ZSet正序  -key-value 不獲取權重值
     * @return
     */
    Map<K,Set<V>> getAllZSetReverseRange();
    /**
     * 獲取所有的ZSet倒序  -key-value 不獲取權重值
     * @return
     */
    Map<K,Set<V>> getAllZSetRange();

    /**
     * 獲取所有的List -key-value
     * @return
     */
    Map<K,List<V>> getAllList();

    /**
     * 獲取所有的Map -key-value
     * @return
     */
    Map<K,Map<K,V>> getAllMap();

    /**
     * 新增一個list
     * @param key
     * @param objectList
     */
    void addList(K key, List<V> objectList);
    /**
     * 向list中增加值
     * @param key
     * @param obj
     * @return 返回在list中的下標
     */
    long addList(K key,V obj);
    /**
     *
     * 向list中增加值
     * @param key
     * @param obj
     * @return 返回在list中的下標
     */
    long addList(K key,V ...obj);

    /**
     *
     * 輸出list
     * @param key List的key
     * @param s 開始下標
     * @param e 結束的下標
     * @return
     */
    List<V> getList(K key, long s, long e);
    /**
     * 輸出完整的list
     * @param key
     */
    List<V> getList(K key);
    /**
     * 獲取list集合中元素的個數
     * @param key
     * @return
     */
    long getListSize(K key);
    /**
     * 移除list中某值
     * 移除list中 count個value為object的值,並且返回移除的數量,
     * 如果count為0,或者大於list中為value為object數量的總和,
     * 那麼移除所有value為object的值,並且返回移除數量
     * @param key
     * @param object
     * @return 返回移除數量
     */
    long removeListValue(K key,V object);
    /**
     * 移除list中某值
     * @param key
     * @param object
     * @return 返回移除數量
     */
    long removeListValue(K key,V... object);

    /**
     * 批量刪除key對應的value
     * @param keys
     */
    void remove(final K... keys);
    /**
     * 刪除快取
     * 根據key精確匹配刪除
     * @param key
     */
    void remove(final K key);

    /**
     * 通過分數刪除ZSet中的值
     * @param key
     * @param s
     * @param e
     */
    void removeZSetRangeByScore(String key,double s , double e);
    /**
     * 設定Set的過期時間
     * @param key
     * @param time
     * @return
     */
    Boolean setSetExpireTime(String key,Long time);

    /**
     * 設定ZSet的過期時間
     * @param key
     * @param time
     * @return
     */
    Boolean setZSetExpireTime(String key,Long time);
    /**
     * 判斷快取中是否有key對應的value
     * @param key
     * @return
     */
    boolean exists(final K key);

    /**
     * 讀取String快取 可以是物件
     * @param key
     * @return
     */
    V get(final K key);
    /**
     * 讀取String快取 可以是物件
     * @param key
     * @return
     */
    List<V> get(final K... key);
    /**
     * 讀取快取 可以是物件 根據正則表示式匹配
     * @param regKey
     * @return
     */
    List<Object> getByRegular(final K regKey);


    /**
     * 寫入快取 可以是物件
     * @param key
     * @param value
     */
    void set(final K key, V value);

    /**
     * 寫入快取
     * @param key
     * @param value
     * @param expireTime 過期時間 -單位s
     * @return
     */
    void set(final K key, V value, Long expireTime);

    /**
     * 設定一個key的過期時間(單位:秒)
     * @param key
     * @param expireTime
     * @return
     */
    boolean setExpireTime(K key, Long expireTime);

    /**
     * 獲取key的型別
     * @param key
     * @return
     */
    DataType getType(K key);

    /**
     * 刪除map中的某個物件
     * @param key   map對應的key
     * @param field map中該物件的key
     */
    void removeMapField(K key, V... field);
    /*
     * 獲取map物件
     * @param key map對應的key
     * @return
     */
    Map<K,V> getMap(K key);
    /*
     * 獲取map物件
     * @param key map對應的key
     * @return
     */
    Long getMapSize(K key);
    /**
     * 獲取map快取中的某個物件
     * @param key map對應的key
     * @param field map中該物件的key
     * @return
     */
    <T> T getMapField(K key, K field);
    /**
     * 判斷map中對應key的key是否存在
     * @param key map對應的key
     * @return
     */
    Boolean hasMapKey(K key,K field);

    /**
     * 獲取map對應key的value
     * @param key map對應的key
     * @return
     */
    List<V> getMapFieldValue(K key);
    /**
     * 獲取map的key
     * @param key map對應的key
     * @return
     */
    Set<V> getMapFieldKey(K key);
    /**
     * 新增map
     * @param key
     * @param map
     */
    void addMap(K key, Map<K,V> map);
    /**
     * 向key對應的map中新增快取物件
     * @param key   cache物件key
     * @param field map對應的key
     * @param value     值
     */
    void addMap(K key, K field, Object value);
    /**
     * 向key對應的map中新增快取物件
     * @param key   cache物件key
     * @param field map對應的key
     * @param time 過期時間-整個MAP的過期時間
     * @param value     值
     */
    void addMap(K key, K field, V value,long time);

    /**
     * 向set中加入物件
     * @param key  物件key
     * @param obj  值
     */
    void addSet(K key, V... obj);

    /**
     * 處理事務時鎖定key
     * @param key
     */
    void watch(String key);

    /**
     * 移除set中的某些值
     * @param key  物件key
     * @param obj  值
     */
    long removeSetValue(K key, V obj);
    /**
     * 移除set中的某些值
     * @param key  物件key
     * @param obj  值
     */
    long removeSetValue(K key, V... obj);

    /**
     * 獲取set的物件數
     * @param key  物件key
     */
    long getSetSize(K key);

    /**
     * 判斷set中是否存在這個值
     * @param key  物件key
     */
    Boolean hasSetValue(K key,V obj);
    /**
     * 獲得整個set
     * @param key  物件key
     */
    Set<V> getSet(K key);

    /**
     * 獲得set 並集
     * @param key
     * @param otherKey
     * @return
     */
    Set<V> getSetUnion(K key,K otherKey);

    /**
     * 獲得set 並集
     * @param key
     * @param set
     * @return
     */
    Set<V> getSetUnion(K key,Set<Object> set);

    /**
     * 獲得set 交集
     * @param key
     * @param otherKey
     * @return
     */
    Set<V> getSetIntersect(K key,K otherKey);

    /**
     * 獲得set 交集
     * @param key
     * @param set
     * @return
     */
    Set<V> getSetIntersect(K key,Set<Object> set);

    /**
     * 模糊移除 支援*號等匹配移除
     * @param blears
     */
    void removeBlear(K... blears);

    /**
     * 修改key名 如果不存在該key或者沒有修改成功返回false
     * @param oldKey
     * @param newKey
     * @return
     */
    Boolean renameIfAbsent(String oldKey,String newKey);
    /**
     * 模糊移除 支援*號等匹配移除
     * @param blear
     */
    void removeBlear(K blear);

    /**
     * 根據正則表示式來移除key-value
     * @param blears
     */
    void removeByRegular(String... blears);

    /**
     * 根據正則表示式來移除key-value
     * @param blears
     */
    void removeByRegular(String blears);

    /**
     * 根據正則表示式來移除 Map中的key-value
     * @param key
     * @param blears
     */
    void removeMapFieldByRegular(K key,K... blears);

    /**
     * 根據正則表示式來移除 Map中的key-value
     * @param key
     * @param blear
     */
    void removeMapFieldByRegular(K key,K blear);

    /**
     * 移除key 對應的value
     * @param key
     * @param value
     * @return
     */
    Long removeZSetValue(K key, V... value);
    /**
     * 移除key ZSet
     * @param key
     * @return
     */
    void removeZSet(K key);
    /**
     *刪除,鍵為K的集合,索引start<=index<=end的元素子集
     * @param key
     * @param start
     * @param end
     * @return
     */
    void removeZSetRange(K key,Long start,Long end);

    /**
     * 並集 將key對應的集合和key1對應的集合合併到key2中
     * 如果分數相同的值,都會保留
     * 原來key2的值會被覆蓋
     * @param key
     * @param key1
     * @param key2
     */
    void setZSetUnionAndStore(String key,String key1, String key2);

    /**
     * 獲取整個有序集合ZSET,正序
     * @param key
     */
    <T> T getZSetRange(K key);

    /**
     * 獲取有序集合ZSET
     * 鍵為K的集合,索引start<=index<=end的元素子集,正序
     * @param key
     * @param start 開始位置
     * @param end 結束位置
     */
    <T> T getZSetRange(K key,long start,long end);
    /**
     * 獲取整個有序集合ZSET,倒序
     * @param key
     */
    Set<Object> getZSetReverseRange(K key);

    /**
     * 獲取有序集合ZSET
     * 鍵為K的集合,索引start<=index<=end的元素子集,倒序
     * @param key
     * @param start 開始位置
     * @param end 結束位置
     */
    Set<V> getZSetReverseRange(K key,long start,long end);

    /**
     * 通過分數(權值)獲取ZSET集合 正序 -從小到大
     * @param key
     * @param start
     * @param end
     * @return
     */
    Set<V> getZSetRangeByScore(String key, double start, double end);

    /**
     * 通過分數(權值)獲取ZSET集合 倒序 -從大到小
     * @param key
     * @param start
     * @param end
     * @return
     */
    Set<V> getZSetReverseRangeByScore(String key, double start, double end);

    /**
     * 鍵為K的集合,索引start<=index<=end的元素子集
     * 返回泛型介面(包括score和value),正序
     * @param key
     * @param start
     * @param end
     * @return
     */
    Set<ZSetOperations.TypedTuple<V>> getZSetRangeWithScores(K key, long start, long end);
    /**
     * 鍵為K的集合,索引start<=index<=end的元素子集
     * 返回泛型介面(包括score和value),倒序
     * @param key
     * @param start
     * @param end
     * @return
     */
    Set<ZSetOperations.TypedTuple<V>> getZSetReverseRangeWithScores(K key, long start, long end);

    /**
     * 鍵為K的集合
     * 返回泛型介面(包括score和value),正序
     * @param key
     * @return
     */
    Set<ZSetOperations.TypedTuple<V>> getZSetRangeWithScores(K key);
    /**
     * 鍵為K的集合
     * 返回泛型介面(包括score和value),倒序
     * @param key
     * @return
     */
    Set<ZSetOperations.TypedTuple<V>> getZSetReverseRangeWithScores(K key);

    /**
     * 鍵為K的集合,sMin<=score<=sMax的元素個數
     * @param key
     * @param sMin
     * @param sMax
     * @return
     */
    long getZSetCountSize(K key,double sMin,double sMax);

    /**
     * 獲取Zset 鍵為K的集合元素個數
     * @param key
     * @return
     */
    long getZSetSize(K key);

    /**
     * 獲取鍵為K的集合,value為obj的元素分數
     * @param key
     * @param value
     * @return
     */
    double getZSetScore(K key,V value);

    /**
     * 元素分數增加,delta是增量
     * @param key
     * @param value
     * @param delta
     * @return
     */
    double incrementZSetScore(K key,V value,double delta);

    /**
     * 新增有序集合ZSET
     * 預設按照score升序排列,儲存格式K(1)==V(n),V(1)=S(1)
     * @param key
     * @param score
     * @param value
     * @return
     */
    Boolean addZSet(String key ,double score, Object value);

    /**
     * 新增有序集合ZSET
     * @param key
     * @param value
     * @return
     */
    Long addZSet(K key,TreeSet<V> value);

    /**
     * 新增有序集合ZSET
     * @param key
     * @param score
     * @param value
     * @return
     */
    Boolean addZSet(K key,double[] score, Object[] value);



}

Redis的工具類


package com.uifuture.utils.redis;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.DataType;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ZSetOperations;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;

import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.regex.Pattern;

/**
 * Created with IntelliJ IDEA.
 * User: 陳浩翔.
 * Date: 2017/4/10.
 * Time: 上午 12:51.
 * Explain: Redis的工具類
 * 增刪改 -不能在這裡面抓取異常 -因為可能有事務處理
 */
@Component
public class RedisHandle implements RedisCommand<String, Object> {
    private Logger logger = Logger.getLogger(RedisHandle.class);
    @Autowired
    protected RedisTemplate redisTemplate;
    /**
     * 出異常,重複操作的次數
     */
    private static Integer times = 5;

    @Override
    public double getCreateTimeScore(long date) {
        return date/ 100000.0;
    }

    @Override
    public Set<String> getAllKeys() {
        return redisTemplate.keys("*");
    }

    @Override
    public Map<String, Object> getAllString() {
        Set<String> stringSet = getAllKeys();
        Map<String, Object> map = new HashMap<String, Object>();
        Iterator<String> iterator = stringSet.iterator();
        while (iterator.hasNext()) {
            String k = iterator.next();
            if (getType(k) == DataType.STRING) {
                map.put(k, get(k));
            }
        }
        return map;
    }

    @Override
    public Map<String, Set<Object>> getAllSet() {
        Set<String> stringSet = getAllKeys();
        Map<String, Set<Object>> map = new HashMap<String, Set<Object>>();
        Iterator<String> iterator = stringSet.iterator();
        while (iterator.hasNext()) {
            String k = iterator.next();
            if (getType(k) == DataType.SET) {
                map.put(k, getSet(k));
            }
        }
        return map;
    }

    @Override
    public Map<String, Set<Object>> getAllZSetRange() {
        Set<String> stringSet = getAllKeys();
        Map<String, Set<Object>> map = new HashMap<String, Set<Object>>();
        Iterator<String> iterator = stringSet.iterator();
        while (iterator.hasNext()) {
            String k = iterator.next();
            if (getType(k) == DataType.ZSET) {
                logger.debug("k:"+k);
                map.put(k, getZSetRange(k));
            }
        }
        return map;
    }

    @Override
    public Map<String, Set<Object>> getAllZSetReverseRange() {
        Set<String> stringSet = getAllKeys();
        Map<String, Set<Object>> map = new HashMap<String, Set<Object>>();
        Iterator<String> iterator = stringSet.iterator();
        while (iterator.hasNext()) {
            String k = iterator.next();
            if (getType(k) == DataType.ZSET) {
                map.put(k, getZSetReverseRange(k));
            }
        }
        return map;
    }

    @Override
    public Map<String, List<Object>> getAllList() {
        Set<String> stringSet = getAllKeys();
        Map<String, List<Object>> map = new HashMap<String, List<Object>>();
        Iterator<String> iterator = stringSet.iterator();
        while (iterator.hasNext()) {
            String k = iterator.next();
            if (getType(k) == DataType.LIST) {
                map.put(k, getList(k));
            }
        }
        return map;
    }

    @Override
    public Map<String, Map<String, Object>> getAllMap() {
        Set<String> stringSet = getAllKeys();
        Map<String, Map<String, Object>> map = new HashMap<String, Map<String, Object>>();
        Iterator<String> iterator = stringSet.iterator();
        while (iterator.hasNext()) {
            String k = iterator.next();
            if (getType(k) == DataType.HASH) {
                map.put(k, getMap(k));
            }
        }
        return map;
    }

    @Override
    public void addList(String key, List<Object> objectList) {
        for (Object obj : objectList) {
            addList(key, obj);
        }
    }

    @Override
    public long addList(String key, Object obj) {
        return redisTemplate.boundListOps(key).rightPush(obj);
    }

    @Override
    public long addList(String key, Object... obj) {
        return redisTemplate.boundListOps(key).rightPushAll(obj);
    }

    @Override
    public List<Object> getList(String key, long s, long e) {
        return redisTemplate.boundListOps(key).range(s, e);
    }

    @Override
    public List<Object> getList(String key) {
        return redisTemplate.boundListOps(key).range(0, getListSize(key));
    }

    @Override
    public long getListSize(String key) {
        return redisTemplate.boundListOps(key).size();
    }

    @Override
    public long removeListValue(String key, Object object) {
        return redisTemplate.boundListOps(key).remove(0, object);
    }

    @Override
    public long removeListValue(String key, Object... objects) {
        long r = 0;
        for (Object object : objects) {
            r += removeListValue(key, object);
        }
        return r;
    }

    @Override
    public void remove(String... key) {
        if (key != null && key.length > 0) {
            if (key.length == 1) {
                remove(key[0]);
            } else {
                redisTemplate.delete(CollectionUtils.arrayToList(key));
            }
        }
    }

    @Override
    public void removeBlear(String... blears) {
        for (String blear : blears) {
            removeBlear(blear);
        }
    }

    @Override
    public Boolean renameIfAbsent(String oldKey, String newKey) {
        return redisTemplate.renameIfAbsent(oldKey, newKey);
    }

    @Override
    public void removeBlear(String blear) {
        redisTemplate.delete(redisTemplate.keys(blear));
    }

    @Override
    public void removeByRegular(String... blears) {
        for (String blear : blears) {
            removeBlear(blear);
        }
    }

    @Override
    public void removeByRegular(String blear) {
        Set<String> stringSet = getAllKeys();
        for (String s : stringSet) {
            if (Pattern.compile(blear).matcher(s).matches()) {
                redisTemplate.delete(s);
            }
        }
    }

    @Override
    public void removeMapFieldByRegular(String key, String... blears) {
        for (String blear : blears) {
            removeMapFieldByRegular(key, blear);
        }
    }

    @Override
    public void removeMapFieldByRegular(String key, String blear) {
        Map<String, Object> map = getMap(key);
        Set<String> stringSet = map.keySet();
        for (String s : stringSet) {
            if (Pattern.compile(blear).matcher(s).matches()) {
                redisTemplate.boundHashOps(key).delete(s);
            }
        }
    }

    @Override
    public Long removeZSetValue(String key, Object... value) {
        return redisTemplate.boundZSetOps(key).remove(value);
    }

    @Override
    public void removeZSet(String key) {
        removeZSetRange(key, 0L, getZSetSize(key));
    }

    @Override
    public void removeZSetRange(String key, Long start, Long end) {
        redisTemplate.boundZSetOps(key).removeRange(start, end);
    }

    @Override
    public void setZSetUnionAndStore(String key,String key1, String key2) {
        redisTemplate.boundZSetOps(key).unionAndStore(key1,key2);
    }

    @Override
    public Set<Object> getZSetRange(String key) {
        return getZSetRange(key, 0, getZSetSize(key));
    }

    @Override
    public Set<Object> getZSetRange(String key, long s, long e) {
        return redisTemplate.boundZSetOps(key).range(s, e);
    }

    @Override
    public Set<Object> getZSetReverseRange(String key) {
        return getZSetReverseRange(key, 0, getZSetSize(key));
    }

    @Override
    public Set<Object> getZSetReverseRange(String key, long start, long end) {
        return redisTemplate.boundZSetOps(key).reverseRange(start, end);
    }

    @Override
    public Set<Object> getZSetRangeByScore(String key, double start, double end) {
        return redisTemplate.boundZSetOps(key).rangeByScore(start, end);
    }
    @Override
    public Set<Object> getZSetReverseRangeByScore(String key, double start, double end) {
        return redisTemplate.boundZSetOps(key).reverseRangeByScore(start, end);
    }

    @Override
    public Set<ZSetOperations.TypedTuple<Object>> getZSetRangeWithScores(String key, long start, long end) {
        return redisTemplate.boundZSetOps(key).rangeWithScores(start, end);
    }

    @Override
    public Set<ZSetOperations.TypedTuple<Object>> getZSetReverseRangeWithScores(String key, long start, long end) {
        return redisTemplate.boundZSetOps(key).reverseRangeWithScores(start, end);
    }

    @Override
    public Set<ZSetOperations.TypedTuple<Object>> getZSetRangeWithScores(String key) {
        return getZSetRangeWithScores(key, 0, getZSetSize(key));
    }

    @Override
    public Set<ZSetOperations.TypedTuple<Object>> getZSetReverseRangeWithScores(String key) {
        return getZSetReverseRangeWithScores(key, 0, getZSetSize(key));
    }

    @Override
    public long getZSetCountSize(String key, double sMin, double sMax) {
        return redisTemplate.boundZSetOps(key).count(sMin, sMax);
    }

    @Override
    public long getZSetSize(String key) {
        return redisTemplate.boundZSetOps(key).size();
    }

    @Override
    public double getZSetScore(String key, Object value) {
        return redisTemplate.boundZSetOps(key).score(value);
    }

    @Override
    public double incrementZSetScore(String key, Object value, double delta) {
        return redisTemplate.boundZSetOps(key).incrementScore(value, delta);
    }

    @Override
    public Boolean addZSet(String key, double score, Object value) {
        return redisTemplate.boundZSetOps(key).add(value, score);
    }

    @Override
    public Long addZSet(String key, TreeSet<Object> value) {
        return redisTemplate.boundZSetOps(key).add(value);
    }

    @Override
    public Boolean addZSet(String key, double[] score, Object[] value) {
        if (score.length != value.length) {
            return false;
        }
        for (int i = 0; i < score.length; i++) {
            if (addZSet(key, score[i], value[i]) == false) {
                return false;
            }
        }
        return true;
    }

    @Override
    public void remove(String key) {
        if (exists(key)) {
            redisTemplate.delete(key);
        }
    }

    @Override
    public void removeZSetRangeByScore(String key,double s , double e) {
        redisTemplate.boundZSetOps(key).removeRangeByScore(s,e);
    }

    @Override
    public Boolean setSetExpireTime(String key, Long time) {
        return redisTemplate.boundSetOps(key).expire(time, TimeUnit.SECONDS);
    }

    @Override
    public Boolean setZSetExpireTime(String key, Long time) {
        return redisTemplate.boundZSetOps(key).expire(time, TimeUnit.SECONDS);
    }

    @Override
    public boolean exists(String key) {
        return redisTemplate.hasKey(key);
    }

    @Override
    public Object get(String key) {
        return redisTemplate.boundValueOps(key).get();
    }

    @Override
    public List<Object> get(String... keys) {
        List<Object> list = new ArrayList<Object>();
        for (String key : keys) {
            list.add(get(key));
        }
        return list;
    }

    @Override
    public List<Object> getByRegular(String regKey) {
        Set<String> stringSet = getAllKeys();
        List<Object> objectList = new ArrayList<Object>();
        for (String s : stringSet) {
            if (Pattern.compile(regKey).matcher(s).matches() && getType(s) == DataType.STRING) {
                objectList.add(get(s));
            }
        }
        return objectList;
    }

    @Override
    public void set(String key, Object value) {
        redisTemplate.boundValueOps(key).set(value);
    }

    @Override
    public void set(String key, Object value, Long expireTime) {
        redisTemplate.boundValueOps(key).set(value, expireTime, TimeUnit.SECONDS);
    }

    @Override
    public boolean setExpireTime(String key, Long expireTime) {
        return redisTemplate.expire(key, expireTime, TimeUnit.SECONDS);
    }


    @Override
    public DataType getType(String key) {
        return redisTemplate.type(key);
    }


    @Override
    public void removeMapField(String key, Object... field) {
        redisTemplate.boundHashOps(key).delete(field);
    }

    @Override
    public Long getMapSize(String key) {
        return redisTemplate.boundHashOps(key).size();
    }

    @Override
    public Map<String, Object> getMap(String key) {
        return redisTemplate.boundHashOps(key).entries();
    }

    @Override
    public <T> T getMapField(String key, String field) {
        return (T) redisTemplate.boundHashOps(key).get(field);
    }

    @Override
    public Boolean hasMapKey(String key, String field) {
        return redisTemplate.boundHashOps(key).hasKey(field);
    }

    @Override
    public List<Object> getMapFieldValue(String key) {
        return redisTemplate.boundHashOps(key).values();
    }

    @Override
    public Set<Object> getMapFieldKey(String key) {