在实际项目开发过程中会用到redis这个服务,redis是一个高效的键值对存储系统,有人也称之为非关系型数据库。其读写效率高,而且可以根据需要设置内容的存储时长,所以在web项目中很常见。

redis并不依赖spring,但是使用spring的依赖注入思想,可以很好的管理redis连接池、redis操作模板等。下面介绍如何将redis整合到spring中。除了jsdis的jar包,还需要spring-data-redis-1.0.1.RELEASE.jar(版本自定),此包提供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:p="http://www.springframework.org/schema/p" 
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="
      http://www.springframework.org/schema/beans 
      http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
      http://www.springframework.org/schema/tx 
      http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
      http://www.springframework.org/schema/context
      http://www.springframework.org/schema/context/spring-context-3.0.xsd
         ">
  
  <!-- 读取properties文件属性  --> 
  <context:property-placeholder location="classpath:redis.properties" ignore-unresolvable="true"/>
  
  <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
      <!-- 最大连接数 --> 
    <property name="maxActive" value="${redis.maxActive}" />  
    <!-- 最大空闲数 -->
    <property name="maxIdle" value="${redis.maxIdle}" /> 
    <property name="maxWait" value="${redis.maxWait}" />  
    <property name="testOnBorrow" value="${redis.testOnBorrow}" />  
    <!-- 每次释放连接的最大数目 -->
    <property name="numTestsPerEvictionRun" value="1024" />
    <!-- 释放连接的扫描间隔(毫秒) -->
    <property name="timeBetweenEvictionRunsMillis" value="30000" />
    <!-- 连接最小空闲时间 -->
    <property name="minEvictableIdleTimeMillis" value="1800000" />
    <!-- 连接空闲多久后释放, 当空闲时间>该值 且 空闲连接>最大空闲连接数 时直接释放 -->
    <property name="softMinEvictableIdleTimeMillis" value="10000" />
    <!-- 在空闲时检查有效性, 默认false -->
    <property name="testWhileIdle" value="true" />
    
  </bean>  
    
  <bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"  
    p:host-name="${redis.host}" 
    p:port="${redis.port}" 
    p:password="${redis.pass}"  
    p:pool-config-ref="poolConfig"/>  
    
  <bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">  
    <property name="connectionFactory"   ref="connectionFactory" />  
  </bean>      
   
</beans>

然后java代码的写法(使用注解方式)

package com.cbt.staticize.service.impl;

import java.util.concurrent.TimeUnit;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Service;

import com.cbt.staticize.service.RedisService;

@SuppressWarnings("unchecked")
@Service
public class RedisServiceImpl implements RedisService {

    @SuppressWarnings("rawtypes")
    @Autowired
    private RedisTemplate redisTemplate;
    
    @Override
    public void set(String key, String value) {
        try {
            ValueOperations<String, String> vop = redisTemplate
                    .opsForValue();
            vop.set(key, value);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 存储指定时长
     */
    @Override
    public void set(String key, String value, Long expire) {
        try {
            ValueOperations<String, String> vop = redisTemplate
                    .opsForValue();
            vop.set(key, value);
            redisTemplate.expire(key, expire, TimeUnit.SECONDS);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public Object get(String key) {
        Object result = null;
        ValueOperations<String, String> vop = redisTemplate
                .opsForValue();
        result = vop.get(key);
        return result;
    }

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

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

    @Override
    public void remove(String... keys) {
        for (String key : keys) {
            remove(key);
        }
    }

    @Override
    public void hset(String key, String field, String value) {
        
        HashOperations<String, String, String> hop = redisTemplate.opsForHash();
        hop.put(key, field, value);
        
    }

    @Override
    public void hset(String key, String field, String value, Long expire) {
        
        HashOperations<String, String, String> hop = redisTemplate.opsForHash();
        hop.put(key, field, value);
        redisTemplate.expire(key, expire, TimeUnit.SECONDS);
        
    }

    @Override
    public Object hget(String key, String field) {
        
        HashOperations<String, String, String> hop = redisTemplate.opsForHash();
        return hop.get(key, field);
    }

}

至此,可直接使用redisservice操作redis。