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