淺析redis緩存 在spring中的配置 及其簡單的使用

一:若是你須要在你的本地項目中配置redis。那麼你首先得須要在你的本地安裝redishtml

參考連接【http://www.runoob.com/redis/redis-install.htmljava

下載redis在網上有不少 我這裏就很少作解釋了 下載之後 找到這樣的三個文件  這是咱們須要操做的 每一個版本可能不同 但這幾個確定是有的redis

而後 安裝這個http://www.runoob.com/redis/redis-install.html   spring

進行配置 固然很重要的一步是你須要在 redis.windows.conf 加入json


#200MB
maxmemory 209715200

#300MB maxheap=1.5*maxmemory  
maxheap 314572800windows

兩句 防止 內存問題 致使的啓動不成功。緩存

二:安裝redis成功以後 。須要在項目中 進行redis配置服務器

首先 參數以下圖所示: 配置完成後 須要在 你的spring.xml中 載入redis-xml :<import resource="spring-redis.xml"/>ide

redis_ip=127.0.0.1
redis_port=6379

#當池內沒有返回對象時,最大等待時間
redis_maxWaitMillis=10000
#當調用borrow Object方法時,是否進行有效性檢查
redis_testOnBorrow=false  
#當調用return Object方法時,是否進行有效性檢查
redis_testOnReturn=false

redis_testWhileIdle = true

redis_maxTotal=100  
#最大可以保持idel狀態的對象數
redis_maxIdle=10 


#是否開啓緩存
enableCache=true

 

 

 

<?xml version="1.0" encoding="UTF-8"?>
<beans
        xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"
        >
    <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
        <property name="hostName" value="${redis_ip}" />
        <property name="port" value="${redis_port}" />
        <property name="poolConfig" ref="jedisPoolConfig" />
    </bean>
    <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" >
        <property name="connectionFactory" ref="jedisConnectionFactory"></property>
    </bean>

    <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <property name="maxWaitMillis" value="${redis_maxWaitMillis}"/>
        <property name="testOnBorrow" value="${redis_testOnBorrow}"/>
        <property name="testOnReturn" value="${redis_testOnReturn}"/>
        <property name="testWhileIdle" value="${redis_testWhileIdle}"/>
        <property name="maxTotal" value="${redis_maxTotal}"/>
        <property name="maxIdle" value="${redis_maxIdle}"/>
        <property name="timeBetweenEvictionRunsMillis" value="30000"/>
        <property name="minEvictableIdleTimeMillis" value="30000"/>
    </bean>

<!--只想操做類 而且把redisTemplate注入進去--> <bean class="com.cdms.service.cache.impl.IRedisCacheServiceImpl"> <property name="redisTemplate" ref="redisTemplate"></property> <property name="enableCache" value="${enableCache}"></property> </bean> </beans>

對於在代碼中的操做 只須要定義一個藉口 和 一個實現類就行測試

 

package com.cdms.service.cache;


import com.alibaba.fastjson.TypeReference;

/**
 * 建立 by 草帽boy on 2017/3/31.
 */
public interface ICacheService{

    /**
     * 存入緩存數據
     * @param key 在緩存中的key值
     * @param value 待儲存的value值
     * @param liveTime 存活時間 單位是秒
     */
    void set(final String key,final Object value,final long liveTime);

    /**
     * 獲取到緩存數據
     * @param key 獲取的key值
     * @param type 獲取的類型
     * @param <T> 泛型
     * @return 你所須要的類型值
     */
    <T> T get(final String key, final TypeReference<T> type );

    /**
     * 獲取剩餘存活時間
     * @param key 返回
     * @return
     */
    long getLiveTime(final String key);

    /**
     * 刪除緩存中的緩存數據
     * @param key key值
     */
    void del(final String key);
}
package com.cdms.service.cache.impl;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.cdms.service.cache.ICacheService;
import com.cdms.util.SerializeUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.io.UnsupportedEncodingException;

/**
 * 建立 by 草帽boy on 2017/3/31.
 */
public class IRedisCacheServiceImpl implements ICacheService{

    public final Logger logger = LoggerFactory.getLogger(this.getClass());

    //是否緩存。默認是不緩存
    private static boolean enableCache = false;

    private static RedisTemplate redisTemplate;

    public  boolean isEnableCache() {
        return enableCache;
    }

    public  void setEnableCache(boolean enableCache) {
        IRedisCacheServiceImpl.enableCache = enableCache;
    }

    public  RedisTemplate getRedisTemplate() {
        return redisTemplate;
    }

    public  void setRedisTemplate(RedisTemplate redisTemplate) {
        IRedisCacheServiceImpl.redisTemplate = redisTemplate;
    }



    private void set(final byte[] key, final byte[] value, final long ttl) {
        if (enableCache == false) {
            return;
        }
        redisTemplate.execute(new RedisCallback<Void>() {
            @Override
            public Void doInRedis(RedisConnection con) {
                try {
                    con.set(key, value);
                    if (ttl != 0) con.expire(key, ttl);
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
                return null;
            }
        });
    }

    protected byte[] get(final byte[] key) {
        if (enableCache == false) {
            return null;
        }
        try {
            return (byte[]) redisTemplate.execute(new RedisCallback<byte[]>() {
                @Override
                public byte[] doInRedis(RedisConnection con) {

                    return con.get(key);

                }
            });
        } catch (Exception ex) {
            ex.printStackTrace();
            return null;
        }
    }

    private long ttl(final byte[] key) {
        if (enableCache == false) {
            return 0;
        }
        try {
            Long t = (Long) redisTemplate.execute(new RedisCallback<Long>() {
                @Override
                public Long doInRedis(RedisConnection con) {
                    return con.ttl(key);
                }
            });

            return t.longValue();

        }catch (Exception ex){
            logger.error(ex.getMessage(), ex);
            return 0;
        }
    }

    protected void del(final byte[]... key) {
        if (enableCache == false || key == null) {
            return;
        }
        try {
            redisTemplate.execute(new RedisCallback<Void>() {
                @Override
                public Void doInRedis(RedisConnection con) {
                    con.del(key);
                    return null;
                }
            });
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    @Override
    public void set(String key, Object value, long liveTime) {
        byte[] keys = key.getBytes();
        String valString = JSON.toJSONString(value);
        byte[] values = valString.getBytes();
        set(keys,values,liveTime);
    }

    @Override
    public <T> T get(String key, TypeReference<T> type) {
        byte[] valueData = get(key.getBytes());
        if(valueData==null||valueData.length<0){
            return null;
        }
        String valString = "";
        try {
            valString = new String(valueData,"UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        T data = JSON.parseObject(valString,type);
        return data;
    }

    @Override
    public long getLiveTime(String key) {
        return ttl(key.getBytes());
    }

    @Override
    public void del(String key) {
        del(key.getBytes());
    }


}

三:測試 當你須要進行寫入redis緩存的時候 你的redis服務器必須是開着的

就是 你的reids應該在這個狀態:

 

@Test
    public void tests(){


        List<String> mm = new ArrayList<String>();
        mm.add("你好啊");
        mm.add("tests");
        iCacheService.set("test",mm,60);
        List<String> tesss = iCacheService.get("test",new TypeReference<List<String>>(){});
       if(tesss!=null){
           System.out.println(">>>>>>>>>>>"+tesss);
       }
        System.out.println(">>>>>>>>>>>>>"+iCacheService.getLiveTime("test"));

    }

 

 結果:

相關文章
相關標籤/搜索