Spring集成redis的过程分享

1、pom.xml引入jar包

      <dependency>    
          <groupId>org.springframework.data</groupId>    
          <artifactId>spring-data-redis</artifactId>    
          <version>1.7.1.RELEASE</version>  
        </dependency>
        
        <dependency>
              <groupId>redis.clients</groupId>
              <artifactId>jedis</artifactId>
              <version>2.9.0</version>
        </dependency>

2、增加配置文件,我这里用的是.properties文件

redis.host =1xx.xx.xx.xx
redis.port =6379
redis.timeout=30000
redis.password =******
redis.database =0
redis.pool.maxActive=200
redis.pool.maxIdle=50

3、创建spring-redis.xml

<?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:jee="http://www.springframework.org/schema/jee"
    xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
                            http://www.springframework.org/schema/beans/spring-beans-4.0.xsd 
                            http://www.springframework.org/schema/jee 
                            http://www.springframework.org/schema/jee/spring-jee-4.0.xsd 
                            http://www.springframework.org/schema/context 
                            http://www.springframework.org/schema/context/spring-context-4.0.xsd
                            http://www.springframework.org/schema/aop
                            http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
                            http://www.springframework.org/schema/tx
                            http://www.springframework.org/schema/tx/spring-tx-3.1.xsd">
   
   
   <!--Jedis连接池的相关配置-->
    <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <!--新版是maxTotal,旧版是maxActive-->
        <property name="maxTotal">
            <value>${redis.pool.maxActive}</value>
        </property>
        <property name="maxIdle">
            <value>${redis.pool.maxIdle}</value>
        </property>
        <property name="testOnBorrow" value="true"/>
        <property name="testOnReturn" value="true"/>
    </bean>

    <bean id="jedisPool" class="redis.clients.jedis.JedisPool">
        <constructor-arg name="poolConfig" ref="jedisPoolConfig" />
        <constructor-arg name="host" value="${redis.host}" />
        <constructor-arg name="port" value="${redis.port}" type="int" />
        <constructor-arg name="timeout" value="${redis.timeout}" type="int" />
        <constructor-arg name="password" value="${redis.password}" />
        <constructor-arg name="database" value="${redis.database}" type="int" />
    </bean>



    <!-- 单独的商品缓存配置,使用1号库 
       <bean id="skuJedisPool" class="redis.clients.jedis.JedisPool" autowire="byName">
        <constructor-arg name="poolConfig" ref="jedisPoolConfig" />
        <constructor-arg name="host" value="${redis.host}" />
        <constructor-arg name="port" value="${redis.port}" type="int" />
        <constructor-arg name="timeout" value="${redis.timeout}" type="int" />
        <constructor-arg name="password" value="${redis.password}" />
        <constructor-arg name="database" value="${sku.redis.database}" type="int" />
    </bean>  -->
   
    <!-- redis单机版   -->
    <!-- <bean id="jedisPool" class="redis.clients.jedis.JedisPool">
        <constructor-arg name="host" value="1xx.xxx.xx.xxx"/>    
        <constructor-arg name="port" value="6389"/>    
    </bean> -->
    <bean id="jedisClientPool" class="com.truelore.xunjia.wssc.service.redis.JedisClientPool"/>
</beans>

4、加载Spring配置文件 


  

 <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
        /WEB-INF/config/security.xml
        /WEB-INF/config/spring-hibernate.xml
        /WEB-INF/config/spring-redis.xml
        /WEB-INF/config/spring-solr.xml
        /WEB-INF/config/spring-activemq.xml
        </param-value>
    </context-param>

 

5、创建客户端工具 JedisClient

package com.xxxx.xxxx.service.redis;

import java.util.List;
import java.util.Map;
import java.util.Set;

import redis.clients.jedis.Tuple;

public interface JedisClient {

    /**
     * 获取指定规则下的所有的key
     * @author lw。
     * @param pattern
     * @return
     */
    Set<String> keys(String pattern);
    
    String set(String key, String value);
    String get(String key);
    Long del(String key);
    
    Boolean exists(String key);
    Long expire(String key, int seconds);
    Long ttl(String key);
    Long incr(String key);
    Long hset(String key, String field, String value);
    String hget(String key, String field);
    Long hdel(String key, String... field);
    Map<String, String> hgetAll(String key);
    
    /**
     * 获取list数据结构下指定的key下的field集合
     * @author lw。
     * @param key
     * @return
     */
    Set<String> hkeys(String key);
    
    /**
     * 批量设置redis的key的失效时间
     *         说明:内部使用的Pipeline对象来操作的。
     * @author lw。
     * @param keys
     * @param seconds
     */
    void batchExpire(List<String> keys, int seconds);
    
    /**
     * 批量删除Hash数据
     * @author lw。
     * @param keys
     */
    void batchHDelete(String key, List<String> keys);
    
    /**
     * 批量List添加
     * @author lw。
     * @param key
     * @param fields
     * @return
     */
    void batchHSet(String key, Map<String, String> fields);
    
    /**
     * 批量添加以(baseKey + value)为key的String类型数据
     * @author lw。
     * @param baseKey
     * @param vals
     */
    void batchBaseKeyAppendValueSet(String key, List<String> vals, int seconds);
    
    /**
     * sorted set的添加
     * @author lw。
     * @param key
     * @param score
     * @param value
     */
    void zaddWithScore(String key, Long score, String value);
    
    /**
     * sorted set的移除一条数据
     * @author lw。
     * @param key
     * @param value
     */
    void zrem(String key, String value);
    
    /**
     * 删除指定分数范围的数据
     * @author lw。
     * @param key
     * @param start
     * @param end
     */
    void zremrangeByScore(String key, Long start, Long end);
    
    /**
     * sorted set数据降序获取指定范围的数据
     *         说明:此接口自己根据传入的当前页及每页的数量做数值计算处理,不需要调用者再处理
     * @author lw。
     * @param key
     * @param pageNo
     * @param pageSize
     * @return
     */
    Set<Tuple> zrevrangeWithScores(String key, Long pageNo, Long pageSize);
    
    /* ------------ >>>>>>    商品缓存相关        <<<<<< ------------ */
    
    /**
     * 设置单个key的失效时间
     * @author lw。
     * @param key
     * @param expireSeconds
     */
    void skuSingleExpire(String key, Integer expireSeconds);
    
    /**
     * 商品数据的存放
     * @author lw。
     * @param key
     * @param value
     * @param expireSeconds
     * @return
     */
    String skuSet(String key, String value, Integer expireSeconds);
    
    /**
     * 商品数据的获取
     * @author lw。
     * @param key
     * @return
     */
    String skuGet(String key);
    
    /**
     * 删除一件商品
     * @author lw。
     * @param key
     * @return
     */
    Long skuDel(String key);
    
    /**
     * 获取redis中存储的Map结构的数据
     * @author lw。
     * @param skuKey
     * @return
     */
    Map<String, String> skuMGet(String skuKey);
    
    /**
     * 向redis中存放一个Map
     * @author lw。
     * @param skuKey
     * @param value
     */
    void skuMSet(String skuKey, Map<String, String> value);
    
    /**
     * 批量以Map的形式保存商品信息,即一件商品对应一个Redis的Map数据格式
     * @author lw。
     * @param values        最外层Map的key既是Redis里存放的key又是Redis的map类型里的key,value为Redis的map类型里的value
     * @param expireSeconds    单Map的失效时间
     */
    void skuHMSet(Map<String, Map<String, String>> values, Integer expireSeconds);
    
    /**
     * 批量获取以Map的形式获取商品信息
     * @author lw。
     * @param skuKeys    Redis里存放的key
     * @return
     */
    Map<String, Map<String, String>> skuHMGet(List<String> skuKeys);
    
}

6、 JedisClientPool

package com.xxxx.xxxx.service.redis;

import org.springframework.beans.factory.annotation.Autowired;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.Pipeline;
import redis.clients.jedis.Response;
import redis.clients.jedis.Tuple;

import java.io.IOException;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import javax.annotation.Resource;


public class JedisClientPool implements JedisClient {
    @Autowired
    private JedisPool jedisPool;
    @Resource(name = "skuJedisPool")
    private JedisPool skuJedisPool;

    /**

     * 获取指定规则下的所有的key

     * @author lw。

     * @param pattern

     * @return

     */
    @Override
    public Set<String> keys(String pattern) {
        Jedis jedis = jedisPool.getResource();

        Set<String> keys = jedis.keys(pattern);

        return keys;
    }

    @Override
    public String set(String key, String value) {
        Jedis jedis = jedisPool.getResource();

        String result = jedis.set(key, value);

        jedis.close();

        return result;
    }

    @Override
    public String get(String key) {
        Jedis jedis = jedisPool.getResource();

        String result = jedis.get(key);

        jedis.close();

        return result;
    }

    @Override
    public Long del(String key) {
        Jedis jedis = jedisPool.getResource();

        Long result = jedis.del(key);

        jedis.close();

        return result;
    }

    @Override
    public Boolean exists(String key) {
        Jedis jedis = jedisPool.getResource();

        Boolean result = jedis.exists(key);

        jedis.close();

        return result;
    }

    @Override
    public Long expire(String key, int seconds) {
        Jedis jedis = jedisPool.getResource();

        Long result = jedis.expire(key, seconds);

        jedis.close();

        return result;
    }

    @Override
    public Long ttl(String key) {
        Jedis jedis = jedisPool.getResource();

        Long result = jedis.ttl(key);

        jedis.close();

        return result;
    }

    @Override
    public Long incr(String key) {
        Jedis jedis = jedisPool.getResource();

        Long result = jedis.incr(key);

        jedis.close();

        return result;
    }

    @Override
    public Long hset(String key, String field, String value) {
        Jedis jedis = jedisPool.getResource();

        Long result = jedis.hset(key, field, value);

        jedis.close();

        return result;
    }

    @Override
    public String hget(String key, String field) {
        Jedis jedis = jedisPool.getResource();

        String result = jedis.hget(key, field);

        jedis.close();

        return result;
    }

    @Override
    public Long hdel(String key, String... field) {
        Jedis jedis = jedisPool.getResource();

        Long result = jedis.hdel(key, field);

        jedis.close();

        return result;
    }

    @Override
    public Map<String, String> hgetAll(String key) {
        Jedis jedis = jedisPool.getResource();

        Map<String, String> result = jedis.hgetAll(key);

        jedis.close();

        return result;
    }

    @Override
    public Set<String> hkeys(String key) {
        Jedis jedis = jedisPool.getResource();

        Set<String> fields = jedis.hkeys(key);

        jedis.close();

        return fields;
    }

    /**

     * 批量设置redis的key的失效时间

     * 说明:内部使用的Pipeline对象来操作的。

     * @author lw。

     * @param keys

     * @param seconds

     */
    @Override
    public void batchExpire(List<String> keys, int seconds) {
        Jedis jedis = jedisPool.getResource();

        Pipeline pipeline = jedis.pipelined();

        for (String key : keys) {
            pipeline.expire(key, seconds);
        }

        pipeline.sync();

        jedis.close();
    }

    /**

     * 批量删除Hash数据

     * @author lw。

     * @param keys

     */
    @Override
    public void batchHDelete(String key, List<String> fields) {
        Jedis jedis = jedisPool.getResource();

        Pipeline pipeline = jedis.pipelined();

        for (String field : fields) {
            pipeline.hdel(key, field);
        }

        pipeline.sync();

        jedis.close();
    }

    /**

     * 批量List添加

     * @author lw。

     * @param key

     * @param fields

     * @return

     */
    @Override
    public void batchHSet(String key, Map<String, String> fields) {
        Jedis jedis = jedisPool.getResource();

        Pipeline pipeline = jedis.pipelined();

        for (Map.Entry<String, String> entry : fields.entrySet()) {
            pipeline.hset(key, entry.getKey(), entry.getValue());
        }

        pipeline.sync();

        jedis.close();
    }

    /**

     * 批量添加以(baseKey + value)为key的String类型数据

     * @author lw。

     * @param baseKey

     * @param vals

     */
    @Override
    public void batchBaseKeyAppendValueSet(String baseKey, List<String> vals,
        int seconds) {
        Jedis jedis = jedisPool.getResource();

        Pipeline pipeline = jedis.pipelined();

        for (String value : vals) {
            String key = baseKey + value;

            pipeline.set(key, value);

            pipeline.expire(key, seconds);
        }

        pipeline.sync();

        jedis.close();
    }

    /**

     * sorted set的添加

     * @author lw。

     * @param key

     * @param score

     * @param value

     */
    @Override
    public void zaddWithScore(String key, Long score, String value) {
        Jedis jedis = jedisPool.getResource();

        Pipeline pipeline = jedis.pipelined();

        pipeline.zadd(key, score, value);

        pipeline.sync();

        try {
            pipeline.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**

     * sorted set的移除一条数据

     * @author lw。

     * @param key

     * @param value

     */
    @Override
    public void zrem(String key, String value) {
        Jedis jedis = jedisPool.getResource();

        Pipeline pipeline = jedis.pipelined();

        pipeline.zrem(key, value);

        pipeline.sync();

        try {
            pipeline.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**

     * 删除指定分数范围的数据

     * @author lw。

     * @param key

     * @param start

     * @param end

     */
    @Override
    public void zremrangeByScore(String key, Long start, Long end) {
        Jedis jedis = jedisPool.getResource();

        Pipeline pipeline = jedis.pipelined();

        pipeline.zremrangeByScore(key, start, end);

        pipeline.sync();

        try {
            pipeline.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**

     * sorted set数据降序获取指定范围的数据

     * 说明:此接口自己根据传入的当前页及每页的数量做数值计算处理,不需要调用者再处理

     * @author lw。

     * @param key

     * @param pageNo

     * @param pageSize

     * @return

     */
    @Override
    public Set<Tuple> zrevrangeWithScores(String key, Long pageNo, Long pageSize) {
        Jedis jedis = jedisPool.getResource();

        Pipeline pipeline = jedis.pipelined();

        // 计算查询的开始值及结束值
        Long start = (pageNo - 1) * pageSize;

        Long end = (pageNo * pageSize) - 1;

        Response<Set<Tuple>> result = pipeline.zrevrangeWithScores(key, start,
                end);

        pipeline.sync();

        try {
            pipeline.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

        Set<Tuple> set = result.get();

        return set;
    }

    /**

     * 设置单个key的失效时间

     * @author lw。

     * @param key

     * @param expireSeconds

     */
    @Override
    public void skuSingleExpire(String key, Integer expireSeconds) {
        Jedis jedis = skuJedisPool.getResource();

        if ((expireSeconds != null) && (expireSeconds > 0)) {
            jedis.expire(key, expireSeconds);
        }

        jedis.close();
    }

    /**

     * 商品数据的存放

     * @author lw。

     * @param key

     * @param value

     * @return

     */
    @Override
    public String skuSet(String key, String value, Integer expireSeconds) {
        Jedis jedis = skuJedisPool.getResource();

        String result = jedis.set(key, value);

        if ((expireSeconds != null) && (expireSeconds > 0)) {
            jedis.expire(key, expireSeconds);
        }

        jedis.close();

        return result;
    }

    /**

     * 商品数据的获取

     * @author lw。

     * @param key

     * @return

     */
    @Override
    public String skuGet(String key) {
        Jedis jedis = skuJedisPool.getResource();

        String result = jedis.get(key);

        jedis.close();

        return result;
    }

    /**

     * 删除一件商品

     * @author lw。

     * @param key

     * @return

     */
    @Override
    public Long skuDel(String key) {
        Jedis jedis = skuJedisPool.getResource();

        Long result = jedis.del(key);

        jedis.close();

        return result;
    }

    /**

     * 获取redis中存储的Map结构的数据

     * @author lw。

     * @param skuKey

     * @return

     */
    @Override
    public Map<String, String> skuMGet(String skuKey) {
        Jedis jedis = skuJedisPool.getResource();

        Pipeline pipeline = jedis.pipelined();

        Response<Map<String, String>> resultMap = pipeline.hgetAll(skuKey);

        pipeline.sync();

        Map<String, String> result = resultMap.get();

        try {
            pipeline.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

        jedis.close();

        return result;
    }

    /**

     * 向redis中存放一个Map

     * @author lw。

     * @param skuKey

     * @param value

     */
    @Override
    public void skuMSet(String skuKey, Map<String, String> value) {
        Jedis jedis = skuJedisPool.getResource();

        // 利用管道的方式来直接向Map结构中插入数据
        Pipeline pipeline = jedis.pipelined();

        pipeline.hmset(skuKey, value);

        pipeline.sync();

        try {
            pipeline.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

        jedis.close();
    }

    /**

     * 批量以Map的形式保存商品信息,即一件商品对应一个Redis的Map数据格式

     * @author lw。

     * @param values 最外层Map的key既是Redis里存放的key又是Redis的map类型里的key,value为Redis的map类型里的value

     * @param expireSeconds 单Map的失效时间

     */
    @Override
    public void skuHMSet(Map<String, Map<String, String>> values,
        Integer expireSeconds) {
        if ((values == null) || (values.size() <= 0)) {
            return;
        }

        Jedis jedis = skuJedisPool.getResource();

        // 获取Pipeline对象
        Pipeline pipeline = jedis.pipelined();

        for (Entry<String, Map<String, String>> entry : values.entrySet()) {
            String key = entry.getKey();

            Map<String, String> value = entry.getValue();

            pipeline.hmset(key, value);

            if ((expireSeconds != null) && (expireSeconds > 0)) {
                pipeline.expire(key, expireSeconds);
            }
        }

        pipeline.sync();

        try {
            pipeline.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

        jedis.close();
    }

    /**

     * 批量获取以Map的形式获取商品信息

     * @author lw。

     * @param skuKeys Redis里存放的key

     * @return

     */
    @Override
    public Map<String, Map<String, String>> skuHMGet(List<String> skuKeys) {
        if ((skuKeys == null) || (skuKeys.size() <= 0)) {
            return null;
        }

        Jedis jedis = skuJedisPool.getResource();

        // 获取Pipeline对象
        Pipeline pipeline = jedis.pipelined();

        int size = skuKeys.size();

        // 定义sync方法执行前的临时存放数据的list
        Map<String, Response<Map<String, String>>> responses = new HashMap<String, Response<Map<String, String>>>(size);

        for (int i = 0; i < size; i++) {
            String key = skuKeys.get(i);

            Response<Map<String, String>> hgetAllResult = pipeline.hgetAll(key);

            responses.put(key, hgetAllResult);
        }

        pipeline.sync();

        try {
            pipeline.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

        Map<String, Map<String, String>> result = new HashMap<String, Map<String, String>>(size);

        for (Entry<String, Response<Map<String, String>>> responseEntry : responses.entrySet()) {
            Response<Map<String, String>> responseValue = responseEntry.getValue();

            Map<String, String> value = responseValue.get();

            String skuKey = responseEntry.getKey();

            if (value.isEmpty()) {
                result.put(skuKey, null);
            } else {
                result.put(skuKey, value);
            }
        }

        jedis.close();

        return result;
    }
}

 

7、使用redis进行查找存储

存商品目录:  这里传入的是个tree结构对象         

            jedisClient.set(categoryKey, JSON.toJSONString(categoryTree));
            jedisClient.expire(categoryKey, categoryExpire);

查商品目录:

            String categoriesStr = jedisClient.get(categoryKey); //查出结果后需要转成对象使用,此处不再写了

以上均是个人使用的代码片段,仅供参考!
            

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值