redis+spring+maven构建项目(带有缓存)

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>redis</groupId>
  <artifactId>redis</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>
  <name>redis</name>
  <description/>
  <properties>
    <webVersion>3.1</webVersion>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
  <dependencies>
    <dependency>
      <groupId>javax</groupId>
      <artifactId>javaee-api</artifactId>
      <version>7.0</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>org.glassfish.web</groupId>
      <artifactId>javax.servlet.jsp.jstl</artifactId>
      <version>1.2.2</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aop</artifactId>
      <version>4.1.0.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aspects</artifactId>
      <version>4.1.0.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
      <version>4.1.0.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>4.1.0.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context-support</artifactId>
      <version>4.1.0.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-expression</artifactId>
      <version>4.1.0.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-instrument</artifactId>
      <version>4.1.0.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-instrument-tomcat</artifactId>
      <version>4.1.0.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>4.1.0.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>aopalliance</groupId>
      <artifactId>aopalliance</artifactId>
      <version>1.0</version>
    </dependency>
    <dependency>
      <groupId>commons-pool</groupId>
      <artifactId>commons-pool</artifactId>
      <version>1.6</version>
    </dependency>
    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>1.2.17</version>
    </dependency>
    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjweaver</artifactId>
      <version>1.8.2</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>4.1.0.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>4.1.0.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc-portlet</artifactId>
      <version>4.1.0.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jms</artifactId>
      <version>4.1.0.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-oxm</artifactId>
      <version>4.1.0.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework.security</groupId>
      <artifactId>spring-security-web</artifactId>
      <version>3.2.5.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework.security</groupId>
      <artifactId>spring-security-core</artifactId>
      <version>3.2.5.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework.security</groupId>
      <artifactId>spring-security-acl</artifactId>
      <version>3.2.5.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework.security</groupId>
      <artifactId>spring-security-aspects</artifactId>
      <version>3.2.5.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework.security</groupId>
      <artifactId>spring-security-cas</artifactId>
      <version>3.2.5.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework.security</groupId>
      <artifactId>spring-security-config</artifactId>
      <version>3.2.5.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework.security</groupId>
      <artifactId>spring-security-crypto</artifactId>
      <version>3.2.5.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework.security</groupId>
      <artifactId>spring-security-ldap</artifactId>
      <version>3.2.5.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework.security</groupId>
      <artifactId>spring-security-openid</artifactId>
      <version>3.2.5.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework.security</groupId>
      <artifactId>spring-security-remoting</artifactId>
      <version>3.2.5.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework.security</groupId>
      <artifactId>spring-security-taglibs</artifactId>
      <version>3.2.5.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework.webflow</groupId>
      <artifactId>spring-webflow</artifactId>
      <version>2.4.0.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework.webflow</groupId>
      <artifactId>spring-binding</artifactId>
      <version>2.4.0.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework.webflow</groupId>
      <artifactId>spring-js</artifactId>
      <version>2.4.0.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework.webflow</groupId>
      <artifactId>spring-js-resources</artifactId>
      <version>2.4.0.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-test</artifactId>
      <version>4.1.0.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>opensymphony</groupId>
      <artifactId>ognl</artifactId>
      <version>2.6.11</version>
    </dependency>
    <!-- 引入redis jar包 -->
    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
        <version>2.8.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>3.3.2</version>
    </dependency> 
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-redis</artifactId>
        <version>1.6.1.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-pool2</artifactId>
        <version>2.2</version>
    </dependency>
     <!-- Jackson Json处理工具包 -->  
     <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.7.3</version>
   </dependency>  
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>2.3.2</version>
        <configuration>
          <source>1.7</source>
          <target>1.7</target>
        </configuration>
      </plugin>
      <plugin>
        <artifactId>maven-war-plugin</artifactId>
        <version>2.6</version>
        <configuration>
          <failOnMissingWebXml>false</failOnMissingWebXml>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

spring.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:context="http://www.springframework.org/schema/context"  
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"  
    xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:task="http://www.springframework.org/schema/task"  
    xsi:schemaLocation="http://www.springframework.org/schema/mvc   
        http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd  
        http://www.springframework.org/schema/beans  
                    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
                    http://www.springframework.org/schema/context  
                    http://www.springframework.org/schema/context/spring-context-3.0.xsd  
                    http://www.springframework.org/schema/aop  
                    http://www.springframework.org/schema/aop/spring-aop-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/task  
                    http://www.springframework.org/schema/task/spring-task-3.0.xsd"> 

     <!-- 引入properties配置文件 -->  
     <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <!--要是有多个配置文件,只需在这里继续添加即可 -->
               <value>classpath:redis.properties</value>
            </list>
        </property>
    </bean>
    <context:annotation-config />
    <task:annotation-driven /> 
    <!-- 配置自动扫描的包 -->
     <context:component-scan base-package="com.wangh"></context:component-scan>
     <!-- jedis客户端单机版 -->  
    <bean id="redisClient" class="redis.clients.jedis.JedisPool">  
        <constructor-arg name="host" value="${redis.host}"></constructor-arg>  
        <constructor-arg name="port" value="${redis.port}"></constructor-arg>
        <constructor-arg name="poolConfig" ref="poolConfig"></constructor-arg>   
    </bean>  
    <bean id="jedisClient" class="com.wangh.dao.JedisClientSingle"/>  

    <bean id="addService" class="com.wangh.service.impl.AddServiceImpl"></bean>

     <!-- jedis集群版配置 -->  
<!--     <bean id="redisClient" class="redis.clients.jedis.JedisCluster">  
        <constructor-arg name="nodes">  
            <set>  
                <bean class="redis.clients.jedis.HostAndPort">  
                    <constructor-arg name="host" value="192.168.1.87"></constructor-arg>  
                    <constructor-arg name="port" value="7006"></constructor-arg>  
                </bean>  
                <bean class="redis.clients.jedis.HostAndPort">  
                    <constructor-arg name="host" value="192.168.1.87"></constructor-arg>  
                    <constructor-arg name="port" value="7001"></constructor-arg>  
                </bean>  
                <bean class="redis.clients.jedis.HostAndPort">  
                    <constructor-arg name="host" value="192.168.1.87"></constructor-arg>  
                    <constructor-arg name="port" value="7002"></constructor-arg>  
                </bean>  
                <bean class="redis.clients.jedis.HostAndPort">  
                    <constructor-arg name="host" value="192.168.1.87"></constructor-arg>  
                    <constructor-arg name="port" value="7003"></constructor-arg>  
                </bean>  
                <bean class="redis.clients.jedis.HostAndPort">  
                    <constructor-arg name="host" value="192.168.1.87"></constructor-arg>  
                    <constructor-arg name="port" value="7004"></constructor-arg>  
                </bean>  
                <bean class="redis.clients.jedis.HostAndPort">  
                    <constructor-arg name="host" value="192.168.1.87"></constructor-arg>  
                    <constructor-arg name="port" value="7005"></constructor-arg>  
                </bean>  
            </set>  
        </constructor-arg>  
        <constructor-arg name="poolConfig" ref="jedisPoolConfig"></constructor-arg>  
    </bean>  
    <bean id="jedisClientCluster" class="com.wangh.dao.JedisClientCluster"></bean> -->  


     <!-- jedis 配置 -->
      <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig" >
          <!-- 最大空闲连接数 --> 
          <property name="maxIdle" value="${redis.maxIdle}"/>
          <!-- 获取连接时的最大等待毫秒数,小于零:阻塞不确定的时间,默认-1 -->
          <property name="maxWaitMillis" value="${redis.maxWait}"/>
           <!-- 在获取连接的时候检查有效性, 默认false --> 
          <property name="testOnBorrow" value="${redis.testOnBorrow}"/>
    </bean >
      <!-- redis连接工厂 -->
    <bean id="connectionFactory"  class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" >
          <property name="poolConfig" ref="poolConfig"/>
          <property name="port" value="${redis.port}"/>
          <property name="hostName" value="${redis.host}"/>
          <property name="password" value="${redis.password}"/>
          <property name="timeout" value="${redis.timeout}"></property>
    </bean >
    <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" >
          <property name="connectionFactory" ref="connectionFactory" />
           <!--如果不配置Serializer,那么存储的时候只能使用String,如果用对象类型存储,那么会提示错误 can't cast to String!!!--> 
          <property name="keySerializer">
              <bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />
          </property>
          <property name="valueSerializer">
              <bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer" />
          </property>
    </bean >

    <bean id="redisUtil" class="com.wangh.util.RedisUtil" >
          <property name="redisTemplate" ref="redisTemplate" />
    </bean >
    <!-- 开启切面代理-->
    <aop:aspectj-autoproxy/> 

</beans>

redis.properties

#redis set
redis.host=127.0.0.1
redis.port=6379
redis.password=
redis.maxIdle=100
redis.maxActive=300
redis.maxWait=1000
redis.testOnBorrow=true
redis.timeout=100000
# no need add cache class
targetNames=xxxRecordManager,xxxSetRecordManager,xxxStatisticsIdentificationManager
# no need add cache method
methodNames=

#set cache expired time
com.service.impl.xxxRecordManager= 60
com.service.impl.xxxSetRecordManager= 60
defaultCacheExpireTime=3600

fep.local.cache.capacity =10000

RedisUtil

package com.wangh.util;

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

import org.apache.log4j.Logger;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
/**
 * 
* @ClassName: RedisUtil
* @Description:redis cache 工具类
* @author Wanghao
* @date 2017年6月5日 上午11:06:07
 */
public final class RedisUtil implements Serializable{

    private static final long serialVersionUID = 1L;
    private Logger logger = Logger.getLogger(RedisUtil.class);
    private RedisTemplate<Serializable, Object> redisTemplate;

    /**
     * 批量删除对应的value
     * @param keys
     */
    public void remove(final String... keys) {
        for (String key : keys) {
            remove(key);
        }
    }

    /**
     * 批量删除key
     * @param pattern
     */
    public void removePattern(final String pattern) {
        Set<Serializable> keys = redisTemplate.keys(pattern);
        if (keys.size() > 0)
            redisTemplate.delete(keys);
    }

    /**
     * 删除对应的value
     * 
     * @param key
     */
    public void remove(final String key) {
        if (exists(key)) {
            redisTemplate.delete(key);
        }
    }

    /**
     * 判断缓存中是否有对应的value
     * 
     * @param key
     * @return
     */
    public boolean exists(final String key) {
        return redisTemplate.hasKey(key);
    }

    /**
     * 读取缓存
     * @param key
     * @return
     */
    public Object get(final String key) {
        Object result = null;
        ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();
        result = operations.get(key);
        return result;
    }

    /**
     * 写入缓存
     * @param key
     * @param value
     * @return
     */
    public boolean set(final String key, Object value) {
        boolean result = false;
        try {
            ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();
            operations.set(key, value);
            result = true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * 写入缓存
     * @param key
     * @param value
     * @return
     */
    public boolean set(final String key, Object value, Long expireTime) {
        boolean result = false;
        try {
            ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();
            operations.set(key, value);
            redisTemplate.expire(key, expireTime, TimeUnit.SECONDS);
            result = true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    public void setRedisTemplate(RedisTemplate<Serializable, Object> redisTemplate) {
        this.redisTemplate = redisTemplate;
    }
}

RedisEvict

package com.wangh.util;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
 * 定义标注在Service实现方法上的注解,用于传递类型参数
* @ClassName: RedisEvict
* @Description: TODO
* @author Wh
* @date 2017年6月5日 下午4:25:49
 */

@Retention(RetentionPolicy.RUNTIME)  
@Target(ElementType.METHOD)
public @interface RedisEvict {
    @SuppressWarnings("rawtypes")
    Class type();
}

RedisCache

package com.wangh.util;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
 * 定义标注在Service实现方法上的注解,用于传递类型参数
* @ClassName: RedisCache
* @Description: TODO
* @author Wh
* @date 2017年6月5日 下午4:23:18
 */
@Retention(RetentionPolicy.RUNTIME)  
@Target(ElementType.METHOD)  
@Documented 
public @interface RedisCache {
     @SuppressWarnings("rawtypes")
     Class type();  
     public int expire() default 0;  //缓存多少秒,默认无限期    
}

JsonUtils

package com.wangh.util;

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

import org.apache.log4j.Logger;

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;
/**
 * Json字符串互转类
* @ClassName: JsonUtils
* @Description: TODO
* @author Wh
* @date 2017年6月5日 下午6:54:34
 */
public class JsonUtils {
     private static Logger logger = Logger.getLogger(JsonUtils.class);  
        // 定义jackson对象  
        private static final ObjectMapper MAPPER = new ObjectMapper();  
        /**  
         * 将对象转换成json字符串  
         * @param data  
         * @return  
         * @throws IOException  
         */  
        public static String objectToJson(Object data) {  
            try {  
                String string = MAPPER.writeValueAsString(data);  
                return string;  
            } catch (Exception e) {  
                e.printStackTrace();  
            }  
            return null;  
        }  

        /**  
         * 将json结果集转化为对象  
         * @param jsonData  json数据  
         * @param clazz  对象中的object类型  
         * @return  
         */  
        public static <T> T jsonToPojo(String jsonData, Class<T> beanType) {  
            try {  
                T t = MAPPER.readValue(jsonData, beanType);  
                return t;  
            } catch (Exception e) {  
                e.printStackTrace();  
            }  
            return null;  
        }  

        /**  
         * 将json数据转换成pojo对象list  
         *   
         * @param jsonData  
         * @param beanType  
         * @return  
         */  
        public static <T> List<T> jsonToList(String jsonData, Class<T> beanType) {  
            JavaType javaType = MAPPER.getTypeFactory().constructParametricType(List.class, beanType);  
            try {  
                List<T> list = MAPPER.readValue(jsonData, javaType);  
                return list;  
            } catch (Exception e) {  
                e.printStackTrace();  
            }  
            return null;  
        }  

        /**  
         * json string convert to map with javaBean  
         */  
        public static <T> Map<String, T> jsonToMap(String jsonStr, Class<T> clazz) throws Exception {  
            Map<String, Map<String, Object>> map = MAPPER.readValue(jsonStr, 
                    new TypeReference<Map<String, T>>() { });  
            Map<String, T> result = new HashMap<String, T>();  
            for (Entry<String, Map<String, Object>> entry : map.entrySet()) {  
                result.put(entry.getKey(), mapTopojo(entry.getValue(), clazz));  
            }  
            return result;  
        }  

        /**  
         * json string convert to map  
         */  
        @SuppressWarnings("unchecked")
        public static <T> Map<String, Object> jsonTomap(String jsonStr) {  
            try {  
                return MAPPER.readValue(jsonStr, Map.class);  
            } catch (Exception e) {  
                e.printStackTrace();  
            }  
            return null;  
        }  

        /**  
         * map convert to javaBean  
         */  
        public static <T> T mapTopojo(Map<?, ?> map, Class<T> clazz) {  
            try {  
                return MAPPER.convertValue(map, clazz);  
            } catch (Exception e) {  
                e.printStackTrace();  
            }  
            return null;  
        }  
}

CacheInterceptor

package com.wangh.util;

import java.util.List;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.wangh.dao.JedisClient;

@Aspect  
@Component 
public class CacheInterceptor {

    @Autowired  
    JedisClient jedisClient; 

     //前置由于数据库数据变更  清理redis缓存  
    @Before("@annotation(redisEvict)")  
    public void doBefore(JoinPoint jp,RedisEvict redisEvict){  
          try{  
              String modelName = redisEvict.type().getName();  
              // 清除对应缓存  
              jedisClient.del(modelName);    
          }catch (Exception e) {  
                e.printStackTrace();  
                System.out.println("缓存服务器出现问题");       
        }  
    }  

 // 配置环绕方法  
    @Around("@annotation(redisCache)")  
    public Object doAround(ProceedingJoinPoint pjp, RedisCache redisCache)throws Throwable {  
        Class<?> modelType = redisCache.type();  
        // 去Redis中看看有没有我们的数据 包名+ 类名 + 方法名 + 参数(多个)  
        String cacheKey = getCacheKey(pjp);  
        System.out.println(cacheKey);  
        String value = null;  
        try {//当取redis发生异常时,为了不影响程序正常执行,需要try..catch()...  
            //检查redis中是否有缓存  
            value = jedisClient.hget(modelType.getName(),cacheKey);  
        } catch (Exception e) {  
            e.printStackTrace();  
            System.out.println("缓存服务器出现问题");  
        }  
        // result是方法的最终返回结果  
        Object result = null;  
        if (null == value) {  
            // 缓存未命中  
            System.out.println("缓存未命中");  
            // 后端查询数据    
            result = pjp.proceed();  
            try {//当取redis发生异常时,为了不影响程序正常执行,需要try..catch()...  
                // 序列化结果放入缓存  
                String json = serialize(result);  
                jedisClient.hset(modelType.getName(), cacheKey, json);  
                if(redisCache.expire()>0) {   
                    jedisClient.expire(cacheKey, redisCache.expire());//设置缓存时间  
                }  
            } catch (Exception e) {  
                e.printStackTrace();  
                System.out.println("缓存服务器出现问题");  
            }  
        } else {  
            try{//当数据转换失败发生异常时,为了不影响程序正常执行,需要try..catch()...  
                // 得到被代理方法的返回值类型  
                Class<?> returnType = ((MethodSignature) pjp.getSignature()).getReturnType();  
                //把json反序列化  
                result = deserialize(value, returnType, modelType);  
                // 缓存命中  
                System.out.println("缓存命中");  
            } catch (Exception e) {  
                //数据转换失败,到后端查询数据    
                result = pjp.proceed();  
                e.printStackTrace();  
                System.out.println("缓存命中,但数据转换失败...");  
            }  
        }  
        return result;  
    }

    private Object deserialize(String jsonString, Class<?> clazz, Class<?> modelType) {
         // 序列化结果应该是List对象  
        if (clazz.isAssignableFrom(List.class)) {  
            return JsonUtils.jsonToList(jsonString, modelType);  
        }  
        // 序列化结果是普通对象  
        return JsonUtils.jsonToPojo(jsonString, clazz);  
    }

    private String serialize(Object target) {
         return JsonUtils.objectToJson(target); 
    }

     // 包名+ 类名 + 方法名 + 参数(多个) 生成Key 
    private String getCacheKey(ProceedingJoinPoint pjp) {
         StringBuffer key = new StringBuffer();  
            // 包名+ 类名 cn.core.serice.product.ProductServiceImpl.productList  
            String packageName = pjp.getTarget().getClass().getName();  
            key.append(packageName);  
            // 方法名  
            String methodName = pjp.getSignature().getName();  
            key.append(".").append(methodName);  
            // 参数(多个)  
            Object[] args = pjp.getArgs();  
            for (Object arg : args) {  
                // 参数  
                key.append(".").append(arg.toString());  
            }  
            return key.toString();  
    }  
}

JedisClient接口

package com.wangh.dao;

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

public interface JedisClient {
    /**
     * 获取key的值
    * @Title: get
    * @param @param key
    * @param @return 
    * @return String 
    * @throws
    * @author Wanghao
     */
    String get(String key);  
    /**
     * 获取所有key
    * @Title: getAll
    * @param @return 
    * @return Set<String> 
    * @throws
    * @author Wanghao
     */
    Set<String> getAll();

    byte[] get(byte[] key);  
  /**
   * 新增key值
  * @Title: set
  * @param @param key
  * @param @param value
  * @param @return 
  * @return String 
  * @throws
  * @author Wanghao
   */
    String set(String key, String value);  

    String set(byte[] key, byte[] value);  
  /**
   * 返回名称为hkey的hash中key对应的value
  * @Title: hget
  * @param @param hkey
  * @param @param key
  * @param @return 
  * @return String 
  * @throws
  * @author Wanghao
   */
    String hget(String hkey, String key);  
  /**
   * 向名称为hkey的hash中添加元素key
  * @Title: hset
  * @param @param hkey
  * @param @param key
  * @param @param value
  * @param @return 
  * @return long 
  * @throws
  * @author Wanghao
   */
    long hset(String hkey, String key, String value);  
  /**
   * 名称为key的string增1操作
  * @Title: incr
  * @param @param key
  * @param @return 
  * @return long 
  * @throws
  * @author Wanghao
   */
    long incr(String key);  
  /**
   * 设置key值过期时间
  * @Title: expire
  * @param @param key
  * @param @param second
  * @param @return 
  * @return long 
  * @throws
  * @author Wanghao
   */
    long expire(String key, int second);  
  /**
   * 查看key值剩余生存时间
  * @Title: ttl
  * @param @param key
  * @param @return 
  * @return long 
  * @throws
  * @author Wanghao
   */
    long ttl(String key);  
  /**
   * 删除一个key
  * @Title: del
  * @param @param key
  * @param @return 
  * @return long 
  * @throws
  * @author Wanghao
   */
    long del(String key);  
  /**
   * 删除名称为hkey的hash中键为key的域
  * @Title: hdel
  * @param @param hkey
  * @param @param key
  * @param @return 
  * @return long 
  * @throws
  * @author Wanghao
   */
    long hdel(String hkey, String key); 
    /**
     * 判断key是否存在
    * @Title: isExists
    * @param @param key
    * @param @return 
    * @return boolean 
    * @throws
    * @author Wanghao
     */
    boolean isExists(String key);
    /**
     * 返回值的类型
    * @Title: type
    * @param @param key
    * @param @return 
    * @return String 
    * @throws
    * @author Wanghao
     */
    String type(String key);
    /**
     * 重命名key
    * @Title: keyrename
    * @param @param oldname
    * @param @param newname
    * @param @return 
    * @return String 
    * @throws
    * @author Wanghao
     */
    String keyrename(String oldname, String newname);
    /**
     * 返回当前数据库中key的数目
    * @Title: dbsize
    * @param @return 
    * @return long 
    * @throws
    * @author Wanghao
     */
    long dbsize();
    /**
     * 按索引查询.切换到指定的数据库,数据库索引号 index 用数字值指定,以 0 作为起始索引值。
    * @Title: select
    * @param @return 
    * @return String 
    * @throws
    * @author Wanghao
     */
   String select(int index);
   /**
    * 删除当前选择数据库中的所有key
   * @Title: flushdb
   * @param @return 
   * @return String 
   * @throws
   * @author Wanghao
    */
   String flushdb();
   /**
    * 删除所有数据库中的所有key
   * @Title: flushall
   * @param @return 
   * @return String 
   * @throws
   * @author Wanghao
    */
   String flushall();
   /**
    * 返回库中多个string的value
   * @Title: mget
   * @param @param keys
   * @param @return 
   * @return List<String> 
   * @throws
   * @author Wanghao
    */
   List<String> mget(String... keys);
   /**
    * 批量设置多个string的值
   * @Title: mset
   * @param @param keys
   * @param @return 
   * @return String 
   * @throws
   * @author Wanghao
    */
   String mset(String... keys);
   /**
    * 添加string,名称为key,值为value
   * @Title: setnx
   * @param @param key
   * @param @param value
   * @param @return 
   * @return long 
   * @throws
   * @author Wanghao
    */
   long setnx(String key, String value);
   /**
    * 名称为key的string增加integer
   * @Title: incrby
   * @param key
   * @param integer
   * @return long 
   * @throws
   * @author Wanghao
    */
   long incrby(String key, int integer);
   /**
    * 名称为key的string减1操作
   * @Title: decr
   * @param key
   * @return
   * long
   * @throws
   * @author Wanghao
    */
   long decr(String key);
   /**
    * 名称为key的string减少integer
   * @Title: decrby
   * @param key
   * @param integer
   * @return
   * String
   * @throws
   * @author Wanghao
    */
   long decrby(String key, int integer);
   /**
    * 名称为key的string的值附加value
   * @Title: append
   * @param key
   * @param value
   * @return
   * long
   * @throws
   * @author Wanghao
    */
   long append(String key, String value);
   /**
    * 返回名称为key的string的value的子串
   * @Title: substr
   * @param key
   * @param start
   * @param end
   * @return
   * String
   * @throws
   * @author Wanghao
    */
   String substr(String key, int start, int end);
   /**
    * 删除多个key
   * @Title: mdel
   * @param key
   * @return
   * long
   * @throws
   * @author Wanghao
    */
   long mdel(String... key);

   //#################### List ################################
   /**
    * 在名称为key的list头添加一个值为value的 元素
   * @Title: lpush
   * @param key
   * @param value
   * @return
   * String
   * @throws
   * @author Wanghao
    */
   long lpush(String key, String value);
   /**
    * 在名称为key的list尾添加一个值为value的元素
   * @Title: lpush
   * @param key
   * @param value
   * @return
   * String
   * @throws
   * @author Wanghao
    */
   long rpush(String key, String value);
   /**
    * 返回名称为key的list的长度
   * @Title: llen
   * @param key
   * @return
   * long
   * @throws
   * @author Wanghao
    */
   long llen(String key);
   /**
    * 返回名称为key的list中start至end之间的元素
   * @Title: lrange
   * @param key
   * @param start
   * @param end
   * @return
   * String
   * @throws
   * @author Wanghao
    */
   List<String> lrange(String key, int start,int end);
   /**
    * 截取名称为key的list
   * @Title: ltrim
   * @param key
   * @param start
   * @param end
   * @return
   * List<String>
   * @throws
   * @author Wanghao
    */
   String ltrim(String key, int start, int end);
   /**
    * 返回名称为key的list中index位置的元素
   * @Title: lindex
   * @param key
   * @param index
   * @return
   * String
   * @throws
   * @author Wanghao
    */
   String lindex(String key, long index);
   /**
    * 给名称为key的list中index位置的元素赋值
   * @Title: lset
   * @param key
   * @param index
   * @param value
   * @return
   * String
   * @throws
   * @author Wanghao
    */
   String lset(String key, int index, String value);
   /**
    * 删除count个key的list中值为value的元素
   * @Title: lrem
   * @param key
   * @param count
   * @param value
   * @return
   * long
   * @throws
   * @author Wanghao
    */
   long lrem(String key,int count, String value);
   /**
    * 返回并删除名称为key的list中的首元素
   * @Title: lpop
   * @param key
   * @return
   * String
   * @throws
   * @author Wanghao
    */
   String lpop(String key);
   /**
    * 返回并删除名称为key的list中的尾元素
   * @Title: lpop
   * @param key
   * @return
   * String
   * @throws
   * @author Wanghao
    */
   String rpop(String key);
   /**
    * 返回并删除名称为srckey的list的尾元素,并将该元素添加到名称为dstkey的list的头部
   * @Title: rpoplpush
   * @param srckey
   * @param dstkey
   * @return
   * String
   * @throws
   * @author Wanghao
    */
   String rpoplpush(String srckey, String dstkey);

   //########################### SET ############################################
   /**
    * 向名称为key的set中添加元素member
   * @Title: sadd
   * @param key
   * @param member
   * @return
   * String
   * @throws
   * @author Wanghao
    */
   Long sadd(String key,String... members);
   /**
    * 删除名称为key的set中的元素member
   * @Title: srem
   * @param key
   * @param member
   * @return
   * Long
   * @throws
   * @author Wanghao
    */
   Long srem(String key, String... members);
   /**
    * 随机返回并删除名称为key的set中一个元素
   * @Title: spop
   * @param key
   * @return
   * String
   * @throws
   * @author Wanghao
    */
   String spop(String key);
   /**
    * member元素从srckey集合移到dstkey集合 。member 元素从 source 集合中被移除,并添加到 destination 集合中去
   * @Title: smove
   * @param srckey
   * @param dstkey
   * @param member
   * @return
   * String
   * @throws
   * @author Wanghao
    */
   Long smove(String srckey, String dstkey, String member);
   /**
    * 返回名称为key的set的基数
   * @Title: scard
   * @param key
   * @return
   * Long
   * @throws
   * @author Wanghao
    */
   Long scard(String key);
   /**
    * member是否是名称为key的set的元素
   * @Title: sismember
   * @param key
   * @param member
   * @return
   * Boolean
   * @throws
   * @author Wanghao
    */
   Boolean sismember(String key, String member);
   /**
    * 求交集
   * @Title: sinter
   * @param keys
   * @return
   * List<String>
   * @throws
   * @author Wanghao
    */
   Set<String> sinter(String...keys);
   /**
    * 求交集并将交集保存到dstkey的集合
   * @Title: sinterstore
   * @param dstkey
   * @param keys
   * @return
   * String
   * @throws
   * @author Wanghao
    */
   Long sinterstore(String dstkey, String... keys);
   /**
    * 求并集
   * @Title: sunion
   * @param keys
   * @return
   * List<String>
   * @throws
   * @author Wanghao
    */
   Set<String> sunion(String... keys);
   /**
    * 求并集并将并集保存到dstkey的集合
   * @Title: sunionstore
   * @param dstkey
   * @param keys
   * @return
   * String
   * @throws
   * @author Wanghao
    */
   Long sunionstore(String dstkey, String... keys);
   /**
    * 求差集
   * @Title: sdiff
   * @param keys
   * @return
   * Set<String>
   * @throws
   * @author Wanghao
    */
   Set<String> sdiff(String... keys);
   /**
    * 求差集并将差集保存到dstkey的集合
   * @Title: sdiffstore
   * @param dstkey
   * @param keys
   * @return
   * String
   * @throws
   * @author Wanghao
    */
   Long sdiffstore(String dstkey, String... keys);
   /**
    * 返回名称为key的set的所有元素
   * @Title: smembers
   * @param key
   * @return
   * Set<String>
   * @throws
   * @author Wanghao
    */
   Set<String> smembers(String key);
   /**
    * 随机返回名称为key的set的一个元素
   * @Title: srandmember
   * @param key
   * @return
   * String
   * @throws
   * @author Wanghao
    */
   String srandmember(String key);
   //########################### Hash ####################################
}

JedisClientSingle

package com.wangh.dao;

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

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

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

public class JedisClientSingle implements JedisClient{
     @Autowired  
     private JedisPool jedisPool;

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

    @Override
    public byte[] get(byte[] key) {
        Jedis jedis = jedisPool.getResource();  
        byte[] result = jedis.get(key);  
        jedis.close();  
        return result; 
    }

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

    @Override
    public String set(byte[] key, byte[] value) {
        Jedis jedis = jedisPool.getResource();  
        String result = jedis.set(key, value);  
        jedis.close();  
        return result;  
    }

    @Override
    public String hget(String hkey, String key) {
        Jedis jedis = jedisPool.getResource();  
        String string = jedis.hget(hkey, key);  
        jedis.close();  
        return string;  
    }

    @Override
    public long hset(String hkey, String key, String value) {
        Jedis jedis = jedisPool.getResource();  
        Long result = jedis.hset(hkey, key, value);  
        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 expire(String key, int second) {
        Jedis jedis = jedisPool.getResource();  
        Long result = jedis.expire(key, second);  
        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 del(String key) {
        Jedis jedis = jedisPool.getResource();  
        Long result = jedis.del(key);  
        jedis.close();  
        return result;  
    }

    @Override
    public long mdel(String... key) {
        Jedis jedis = jedisPool.getResource();  
        Long result = jedis.del(key);  
        jedis.close();  
        return result;  
    }

    @Override
    public long hdel(String hkey, String key) {
        Jedis jedis = jedisPool.getResource();  
        Long result = jedis.hdel(hkey, key);  
        jedis.close();  
        return result; 
    }

    @Override
    public Set<String> getAll() {
        Jedis jedis = jedisPool.getResource();
        Set<String> keys = jedis.keys("*");
        jedis.close(); 
        return keys;
    }

    @Override
    public boolean isExists(String key) {
        Jedis jedis = jedisPool.getResource();
        boolean b = jedis.exists(key);
        jedis.close(); 
        return b;
    }

    @Override
    public String type(String key) {
        Jedis jedis = jedisPool.getResource();
        String type = jedis.type(key);
        jedis.close(); 
        return type;
    }

    @Override
    public String keyrename(String oldname, String newname) {
        Jedis jedis = jedisPool.getResource();
        String name = jedis.rename(oldname, newname);
        jedis.close(); 
        return name;
    }

    @Override
    public long dbsize() {
        Jedis jedis = jedisPool.getResource();
        long size = jedis.dbSize();
        jedis.close(); 
        return size;
    }

    @Override
    public String select(int index) {
        Jedis jedis = jedisPool.getResource();
        String key = jedis.select(index);
        jedis.close(); 
        return key;
    }

    @Override
    public String flushdb() {
        Jedis jedis = jedisPool.getResource();
        String flush = jedis.flushDB();
        jedis.close(); 
        return flush;
    }

    @Override
    public String flushall() {
        Jedis jedis = jedisPool.getResource();
        String flush = jedis.flushAll();
        jedis.close(); 
        return flush;
    }

    @Override
    public List<String> mget(String... keys) {
        Jedis jedis = jedisPool.getResource();
        List<String> values = jedis.mget(keys);
        jedis.close(); 
        return values;
    }

    @Override
    public String mset(String... keys) {
        Jedis jedis = jedisPool.getResource();
        String s = jedis.mset(keys);
        jedis.close(); 
        return s;
    }

    @Override
    public long setnx(String key, String value) {
        Jedis jedis = jedisPool.getResource();
        long l = jedis.setnx(key, value);
        jedis.close(); 
        return l;
    }

    @Override
    public long incrby(String key, int integer) {
        Jedis jedis = jedisPool.getResource();
        long l = jedis.incrBy(key, integer);
        jedis.close(); 
        return l;
    }

    @Override
    public long decr(String key) {
        Jedis jedis = jedisPool.getResource();
        long l = jedis.decr(key);
        jedis.close(); 
        return l;
    }

    @Override
    public long decrby(String key, int integer) {
        Jedis jedis = jedisPool.getResource();
        long l = jedis.decrBy(key, integer);
        jedis.close(); 
        return l;
    }

    @Override
    public long append(String key, String value) {
        Jedis jedis = jedisPool.getResource();
        long l = jedis.append(key, value);
        jedis.close(); 
        return l;
    }

    @Override
    public String substr(String key, int start, int end) {
        Jedis jedis = jedisPool.getResource();
        String s = jedis.substr(key, start, end);
        jedis.close(); 
        return s;
    }

    @Override
    public long lpush(String key, String value) {
        Jedis jedis = jedisPool.getResource();
        long l = jedis.lpush(key, value);
        jedis.close(); 
        return l;
    }

    @Override
    public long rpush(String key, String value) {
        Jedis jedis = jedisPool.getResource();
        long l = jedis.rpush(key, value);
        jedis.close(); 
        return l;
    }

    @Override
    public long llen(String key) {
        Jedis jedis = jedisPool.getResource();
        long len = jedis.llen(key);
        jedis.close(); 
        return len;
    }

    @Override
    public List<String> lrange(String key, int start, int end) {
        Jedis jedis = jedisPool.getResource();
        List<String> list = jedis.lrange(key, start, end);
        jedis.close(); 
        return list;
    }

    @Override
    public String ltrim(String key, int start, int end) {
        Jedis jedis = jedisPool.getResource();
        String s = jedis.ltrim(key, start, end);
        jedis.close(); 
        return s;
    }

    @Override
    public String lindex(String key, long index) {
        Jedis jedis = jedisPool.getResource();
        String s = jedis.lindex(key, index);
        jedis.close(); 
        return s;
    }

    @Override
    public String lset(String key, int index, String value) {
        Jedis jedis = jedisPool.getResource();
        String s = jedis.lset(key, index, value);
        jedis.close(); 
        return s;
    }

    @Override
    public long lrem(String key, int count, String value) {
        Jedis jedis = jedisPool.getResource();
        Long l = jedis.lrem(key, count, value);
        jedis.close(); 
        return l;
    }

    @Override
    public String lpop(String key) {
        Jedis jedis = jedisPool.getResource();
        String s = jedis.lpop(key);
        jedis.close(); 
        return s;
    }

    @Override
    public String rpop(String key) {
        Jedis jedis = jedisPool.getResource();
        String s = jedis.rpop(key);
        jedis.close(); 
        return s;
    }

    @Override
    public String rpoplpush(String srckey, String dstkey) {
        Jedis jedis = jedisPool.getResource();
        String s = jedis.rpoplpush(srckey, dstkey);
        jedis.close(); 
        return s;
    }

    @Override
    public Long sadd(String key, String... member) {
        Jedis jedis = jedisPool.getResource();
        Long l = jedis.sadd(key, member);
        jedis.close(); 
        return l;
    }

    @Override
    public Long srem(String key, String... members) {
        Jedis jedis = jedisPool.getResource();
        Long l = jedis.srem(key, members);
        jedis.close(); 
        return l;
    }

    @Override
    public String spop(String key) {
        Jedis jedis = jedisPool.getResource();
        String s = jedis.spop(key);
        jedis.close(); 
        return s;
    }

    @Override
    public Long smove(String srckey, String dstkey, String member) {
        Jedis jedis = jedisPool.getResource();
        Long l = jedis.smove(srckey, dstkey, member);
        jedis.close(); 
        return l;
    }

    @Override
    public Long scard(String key) {
        Jedis jedis = jedisPool.getResource();
        Long l = jedis.scard(key);
        jedis.close(); 
        return l;
    }

    @Override
    public Boolean sismember(String key, String member) {
        Jedis jedis = jedisPool.getResource();
        Boolean b = jedis.sismember(key, member);
        jedis.close(); 
        return b;
    }

    @Override
    public Set<String> sinter(String... keys) {
        Jedis jedis = jedisPool.getResource();
        Set<String> sets = jedis.sinter(keys);
        jedis.close(); 
        return sets;
    }

    @Override
    public Long sinterstore(String dstkey, String... keys) {
        Jedis jedis = jedisPool.getResource();
        Long l = jedis.sinterstore(dstkey, keys);
        jedis.close(); 
        return l;
    }

    @Override
    public Set<String> sunion(String... keys) {
        Jedis jedis = jedisPool.getResource();
        Set<String> sets = jedis.sunion(keys);
        jedis.close(); 
        return sets;
    }

    @Override
    public Long sunionstore(String dstkey, String... keys) {
        Jedis jedis = jedisPool.getResource();
        Long l = jedis.sunionstore(dstkey, keys);
        jedis.close(); 
        return l;
    }

    @Override
    public Set<String> sdiff(String... keys) {
        Jedis jedis = jedisPool.getResource();
        Set<String> sets = jedis.sdiff(keys);
        jedis.close(); 
        return sets;
    }

    @Override
    public Long sdiffstore(String dstkey, String... keys) {
        Jedis jedis = jedisPool.getResource();
        Long l = jedis.sdiffstore(dstkey, keys);
        jedis.close(); 
        return l;
    }

    @Override
    public Set<String> smembers(String key) {
        Jedis jedis = jedisPool.getResource();
        Set<String> sets = jedis.smembers(key);
        jedis.close(); 
        return sets;
    }

    @Override
    public String srandmember(String key) {
        Jedis jedis = jedisPool.getResource();
        String s = jedis.srandmember(key);
        jedis.close(); 
        return s;
    }



}

AddService

package com.wangh.service;

import java.util.Set;

public interface AddService {
    public String setName(String key,String value);
    public String getName(String key);
    public long del(String key);
    public String incr(String key,String value);
    public Set<String> getAllKeys();

}

AddServiceImpl

package com.wangh.service.impl;

import java.util.Set;

import javax.annotation.Resource;

import com.wangh.dao.JedisClientSingle;
import com.wangh.service.AddService;
import com.wangh.util.RedisCache;

public class AddServiceImpl implements AddService {

    @Resource
    private JedisClientSingle jedisClientSingle;


    @Override
    @RedisCache(type = String.class, expire = 200000000)
    public String setName( String key,  String value) {
        return jedisClientSingle.set(key, value);
    }

    @Override
    public String getName(final String x) {
        return jedisClientSingle.get(x);
    }

    @Override
    public long del(String key) {
        long l = jedisClientSingle.del(key);
        return l;
    }

    @Override
    public String incr(String key, String value) {
        long l = jedisClientSingle.incr(key);
        return String.valueOf(l);
    }

    @Override
    public Set<String> getAllKeys() {
        Set<String> keys = jedisClientSingle.getAll();
        return keys;
    }

}

RedisTest

package com.wangh.main;

import java.util.Iterator;
import java.util.List;
import java.util.Set;

import javax.annotation.Resource;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.wangh.dao.JedisClientSingle;
import com.wangh.service.AddService;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:spring.xml")
public class RedisTest {

    @Resource
    private AddService addService;

    @Resource
    private JedisClientSingle jedisClientSingle;

    @Test
    public void getTest() {
        String aa = addService.setName("c","d");
        System.out.println(addService.getName("c")+"--"+aa);

        long a = addService.del("c");
        System.out.println(a);

        Set<String>  keys = addService.getAllKeys();
        for(String key :keys){
            System.out.println(key);
        }
    }
    //String类型
    @Test
    public void test2(){
        jedisClientSingle.set("name", "wangh");
        jedisClientSingle.set("age", "18");
        jedisClientSingle.set("sex", "man");
        jedisClientSingle.set("addr", "man");

        long size = jedisClientSingle.dbsize();
        System.out.println("key数量:"+size);
        Iterator<String> its = jedisClientSingle.getAll().iterator();
        while(its.hasNext()){
            System.out.println("key:"+its.next());
        }
        long age = jedisClientSingle.decr("age");
        System.out.println("age:"+age);
        long d = jedisClientSingle.mdel("java.lang.String","a","v");
        System.out.println("mdel:"+d);
        long addr = jedisClientSingle.expire("addr", 100000);
        System.out.println("addr:"+addr);
        long ttl = jedisClientSingle.ttl("addr");
        System.out.println("ttl:"+ttl);
        //String nname = jedisClientSingle.keyrename("addr", "address");
        //System.out.println(nname);
    }
    //List 类型
    @Test
    public void test3(){
        jedisClientSingle.lpush("list", "1");
        jedisClientSingle.lpush("list", "2");
        jedisClientSingle.lpush("list", "3");
        jedisClientSingle.lpush("list", "1");

        long l = jedisClientSingle.llen("list");
        System.out.println("长度:"+l);

        List<String> lists = jedisClientSingle.lrange("list", 0, -1);
        for(String elem:lists){
            System.out.println("list中值:"+elem);
        }

        String four = jedisClientSingle.lset("list", 3, "4");
        System.out.println("第四个值改为:"+four);

        jedisClientSingle.rpush("list1", "1");
        jedisClientSingle.rpush("list1", "2");
        jedisClientSingle.rpush("list1", "3");
        List<String> lists1 = jedisClientSingle.lrange("list1", 0, -1);
        for(String elem:lists1){
            System.out.println("list1中值:"+elem);
        }
        long rem = jedisClientSingle.lrem("list1", 2, "1");
        System.out.println("rem:"+rem);
    }
    //SET 
    @Test
    public void test4(){
        jedisClientSingle.sadd("set", "1","2","3","1");
        long l = jedisClientSingle.scard("set");
        System.out.println("基数:"+l);
        Iterator<String> its = jedisClientSingle.smembers("set").iterator();
        while(its.hasNext()){
            System.out.println("值为:"+its.next());
        }
        boolean b = jedisClientSingle.sismember("set", "1");
        System.out.println(b);

        long ll = jedisClientSingle.smove("set", "set1", "1");
        System.out.println(ll);
        Iterator<String> its1 = jedisClientSingle.smembers("set1").iterator();
        while(its1.hasNext()){
            System.out.println("set1值为:"+its1.next());
        }
        Iterator<String> its2 = jedisClientSingle.smembers("set").iterator();
        while(its2.hasNext()){
            System.out.println("值为:"+its2.next());
        }
    }
}

常用命令

1)连接操作命令
quit:关闭连接(connection)
auth:简单密码认证
help cmd: 查看cmd帮助,例如:help quit

2)持久化
save:将数据同步保存到磁盘
bgsave:将数据异步保存到磁盘
lastsave:返回上次成功将数据保存到磁盘的Unix时戳
shundown:将数据同步保存到磁盘,然后关闭服务

3)远程服务控制
info:提供服务器的信息和统计
monitor:实时转储收到的请求
slaveof:改变复制策略设置
config:在运行时配置Redis服务器

4)对value操作的命令
exists(key):确认一个key是否存在
del(key):删除一个key
type(key):返回值的类型
keys(pattern):返回满足给定pattern的所有key
randomkey:随机返回key空间的一个
keyrename(oldname, newname):重命名key
dbsize:返回当前数据库中key的数目
expire:设定一个key的活动时间(s)
ttl:获得一个key的活动时间
select(index):按索引查询
move(key, dbindex):移动当前数据库中的key到dbindex数据库
flushdb:删除当前选择数据库中的所有key
flushall:删除所有数据库中的所有key

5)String
set(key, value):给数据库中名称为key的string赋予值value
get(key):返回数据库中名称为key的string的value
getset(key, value):给名称为key的string赋予上一次的value
mget(key1, key2,…, key N):返回库中多个string的value
setnx(key, value):添加string,名称为key,值为value
setex(key, time, value):向库中添加string,设定过期时间time
mset(key N, value N):批量设置多个string的值
msetnx(key N, value N):如果所有名称为key i的string都不存在
incr(key):名称为key的string增1操作
incrby(key, integer):名称为key的string增加integer
decr(key):名称为key的string减1操作
decrby(key, integer):名称为key的string减少integer
append(key, value):名称为key的string的值附加value
substr(key, start, end):返回名称为key的string的value的子串

6)List 
rpush(key, value):在名称为key的list尾添加一个值为value的元素
lpush(key, value):在名称为key的list头添加一个值为value的 元素
llen(key):返回名称为key的list的长度
lrange(key, start, end):返回名称为key的list中start至end之间的元素
ltrim(key, start, end):截取名称为key的list
lindex(key, index):返回名称为key的list中index位置的元素
lset(key, index, value):给名称为key的list中index位置的元素赋值
lrem(key, count, value):删除count个key的list中值为value的元素
lpop(key):返回并删除名称为key的list中的首元素
rpop(key):返回并删除名称为key的list中的尾元素
blpop(key1, key2,… key N, timeout):lpop命令的block版本。
brpop(key1, key2,… key N, timeout):rpop的block版本。
rpoplpush(srckey, dstkey):返回并删除名称为srckey的list的尾元素,

              并将该元素添加到名称为dstkey的list的头部

7)Set
sadd(key, member):向名称为key的set中添加元素member
srem(key, member) :删除名称为key的set中的元素member
spop(key) :随机返回并删除名称为key的set中一个元素
smove(srckey, dstkey, member) :移到集合元素
scard(key) :返回名称为key的set的基数
sismember(key, member) :member是否是名称为key的set的元素
sinter(key1, key2,…key N) :求交集
sinterstore(dstkey, (keys)) :求交集并将交集保存到dstkey的集合
sunion(key1, (keys)) :求并集
sunionstore(dstkey, (keys)) :求并集并将并集保存到dstkey的集合
sdiff(key1, (keys)) :求差集
sdiffstore(dstkey, (keys)) :求差集并将差集保存到dstkey的集合
smembers(key) :返回名称为key的set的所有元素
srandmember(key) :随机返回名称为key的set的一个元素

8)Hash
hset(key, field, value):向名称为key的hash中添加元素field
hget(key, field):返回名称为key的hash中field对应的value
hmget(key, (fields)):返回名称为key的hash中field i对应的value
hmset(key, (fields)):向名称为key的hash中添加元素field 
hincrby(key, field, integer):将名称为key的hash中field的value增加integer
hexists(key, field):名称为key的hash中是否存在键为field的域
hdel(key, field):删除名称为key的hash中键为field的域
hlen(key):返回名称为key的hash中元素个数
hkeys(key):返回名称为key的hash中所有键
hvals(key):返回名称为key的hash中所有键对应的value
hgetall(key):返回名称为key的hash中所有的键(field)及其对应的value
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值