redis+spring+maven构建项目(带有缓存)
来源:互联网 发布:知乎boy scout 编辑:程序博客网 时间:2024/05/29 12:24
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 setredis.host=127.0.0.1redis.port=6379redis.password=redis.maxIdle=100redis.maxActive=300redis.maxWait=1000redis.testOnBorrow=trueredis.timeout=100000# no need add cache classtargetNames=xxxRecordManager,xxxSetRecordManager,xxxStatisticsIdentificationManager# no need add cache methodmethodNames=#set cache expired timecom.service.impl.xxxRecordManager= 60com.service.impl.xxxSetRecordManager= 60defaultCacheExpireTime=3600fep.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 quit2)持久化save:将数据同步保存到磁盘bgsave:将数据异步保存到磁盘lastsave:返回上次成功将数据保存到磁盘的Unix时戳shundown:将数据同步保存到磁盘,然后关闭服务3)远程服务控制info:提供服务器的信息和统计monitor:实时转储收到的请求slaveof:改变复制策略设置config:在运行时配置Redis服务器4)对value操作的命令exists(key):确认一个key是否存在del(key):删除一个keytype(key):返回值的类型keys(pattern):返回满足给定pattern的所有keyrandomkey:随机返回key空间的一个keyrename(oldname, newname):重命名keydbsize:返回当前数据库中key的数目expire:设定一个key的活动时间(s)ttl:获得一个key的活动时间select(index):按索引查询move(key, dbindex):移动当前数据库中的key到dbindex数据库flushdb:删除当前选择数据库中的所有keyflushall:删除所有数据库中的所有key5)Stringset(key, value):给数据库中名称为key的string赋予值valueget(key):返回数据库中名称为key的string的valuegetset(key, value):给名称为key的string赋予上一次的valuemget(key1, key2,…, key N):返回库中多个string的valuesetnx(key, value):添加string,名称为key,值为valuesetex(key, time, value):向库中添加string,设定过期时间timemset(key N, value N):批量设置多个string的值msetnx(key N, value N):如果所有名称为key i的string都不存在incr(key):名称为key的string增1操作incrby(key, integer):名称为key的string增加integerdecr(key):名称为key的string减1操作decrby(key, integer):名称为key的string减少integerappend(key, value):名称为key的string的值附加valuesubstr(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的listlindex(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)Setsadd(key, member):向名称为key的set中添加元素membersrem(key, member) :删除名称为key的set中的元素memberspop(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)Hashhset(key, field, value):向名称为key的hash中添加元素fieldhget(key, field):返回名称为key的hash中field对应的valuehmget(key, (fields)):返回名称为key的hash中field i对应的valuehmset(key, (fields)):向名称为key的hash中添加元素field hincrby(key, field, integer):将名称为key的hash中field的value增加integerhexists(key, field):名称为key的hash中是否存在键为field的域hdel(key, field):删除名称为key的hash中键为field的域hlen(key):返回名称为key的hash中元素个数hkeys(key):返回名称为key的hash中所有键hvals(key):返回名称为key的hash中所有键对应的valuehgetall(key):返回名称为key的hash中所有的键(field)及其对应的value
阅读全文
1 0
- redis+spring+maven构建项目(带有缓存)
- Maven构建spring+redis项目
- redis缓存配置(spring + maven)
- maven构建Spring项目
- maven项目构建spring项目
- Maven学习(七)- 构建Spring项目
- Maven学习(七)- 构建Spring项目
- Maven学习(七)- 构建Spring项目
- Maven学习(七)- 构建Spring项目
- Maven学习(七)- 构建Spring项目
- Spring整合Redis数据库(maven项目)
- 使用Maven构建Spring项目
- maven构建项目实现对redis的操作(jedis)
- J2EE项目系列(四)--SSM框架构建积分系统和基本商品检索系统(Spring+SpringMVC+MyBatis+Lucene+Redis+MAVEN)(1)框架整合构建
- Maven的学习资料收集--(七) 构建Spring项目
- Eclipse J2EE+Maven+Tomcat(Jetty)构建Spring MVC项目
- maven构建项目二(添加配置文件)SpringMvc+Spring+Mybatis
- Maven快速使用教程(二) spring boot 项目构建
- JS之返回数组指定元素的slice
- Linux ssh
- 《linux程序设计学习笔记》之一---标准I/O库的使用
- Android 使用 Material icons
- dubbo+zookeeper+SpringMVC+Spring+Mybatis+Freemarker集成(分布式入门+源码)
- redis+spring+maven构建项目(带有缓存)
- MySQL、Oracle分页查询的SQL语句
- C# 容器详解及其整理
- Hadoop工作流:Oozie与Azkaban
- 4(2)、uboot中内存初始化函数:mem_ctrl_asm_init
- es6 javascript对象方法Object.assign()
- 比较两个Integer的int值是否相等
- 常量
- tools安装后无法使用