1、pom.xml引入jar包
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>1.7.1.RELEASE</version>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
2、增加配置文件,我这里用的是.properties文件
redis.host =1xx.xx.xx.xx
redis.port =6379
redis.timeout=30000
redis.password =******
redis.database =0
redis.pool.maxActive=200
redis.pool.maxIdle=50
3、创建spring-redis.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/jee
http://www.springframework.org/schema/jee/spring-jee-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.1.xsd">
<!--Jedis连接池的相关配置-->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<!--新版是maxTotal,旧版是maxActive-->
<property name="maxTotal">
<value>${redis.pool.maxActive}</value>
</property>
<property name="maxIdle">
<value>${redis.pool.maxIdle}</value>
</property>
<property name="testOnBorrow" value="true"/>
<property name="testOnReturn" value="true"/>
</bean>
<bean id="jedisPool" class="redis.clients.jedis.JedisPool">
<constructor-arg name="poolConfig" ref="jedisPoolConfig" />
<constructor-arg name="host" value="${redis.host}" />
<constructor-arg name="port" value="${redis.port}" type="int" />
<constructor-arg name="timeout" value="${redis.timeout}" type="int" />
<constructor-arg name="password" value="${redis.password}" />
<constructor-arg name="database" value="${redis.database}" type="int" />
</bean>
<!-- 单独的商品缓存配置,使用1号库
<bean id="skuJedisPool" class="redis.clients.jedis.JedisPool" autowire="byName">
<constructor-arg name="poolConfig" ref="jedisPoolConfig" />
<constructor-arg name="host" value="${redis.host}" />
<constructor-arg name="port" value="${redis.port}" type="int" />
<constructor-arg name="timeout" value="${redis.timeout}" type="int" />
<constructor-arg name="password" value="${redis.password}" />
<constructor-arg name="database" value="${sku.redis.database}" type="int" />
</bean> -->
<!-- redis单机版 -->
<!-- <bean id="jedisPool" class="redis.clients.jedis.JedisPool">
<constructor-arg name="host" value="1xx.xxx.xx.xxx"/>
<constructor-arg name="port" value="6389"/>
</bean> -->
<bean id="jedisClientPool" class="com.truelore.xunjia.wssc.service.redis.JedisClientPool"/>
</beans>
4、加载Spring配置文件
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/config/security.xml
/WEB-INF/config/spring-hibernate.xml
/WEB-INF/config/spring-redis.xml
/WEB-INF/config/spring-solr.xml
/WEB-INF/config/spring-activemq.xml
</param-value>
</context-param>
5、创建客户端工具 JedisClient
package com.xxxx.xxxx.service.redis;
import java.util.List;
import java.util.Map;
import java.util.Set;
import redis.clients.jedis.Tuple;
public interface JedisClient {
/**
* 获取指定规则下的所有的key
* @author lw。
* @param pattern
* @return
*/
Set<String> keys(String pattern);
String set(String key, String value);
String get(String key);
Long del(String key);
Boolean exists(String key);
Long expire(String key, int seconds);
Long ttl(String key);
Long incr(String key);
Long hset(String key, String field, String value);
String hget(String key, String field);
Long hdel(String key, String... field);
Map<String, String> hgetAll(String key);
/**
* 获取list数据结构下指定的key下的field集合
* @author lw。
* @param key
* @return
*/
Set<String> hkeys(String key);
/**
* 批量设置redis的key的失效时间
* 说明:内部使用的Pipeline对象来操作的。
* @author lw。
* @param keys
* @param seconds
*/
void batchExpire(List<String> keys, int seconds);
/**
* 批量删除Hash数据
* @author lw。
* @param keys
*/
void batchHDelete(String key, List<String> keys);
/**
* 批量List添加
* @author lw。
* @param key
* @param fields
* @return
*/
void batchHSet(String key, Map<String, String> fields);
/**
* 批量添加以(baseKey + value)为key的String类型数据
* @author lw。
* @param baseKey
* @param vals
*/
void batchBaseKeyAppendValueSet(String key, List<String> vals, int seconds);
/**
* sorted set的添加
* @author lw。
* @param key
* @param score
* @param value
*/
void zaddWithScore(String key, Long score, String value);
/**
* sorted set的移除一条数据
* @author lw。
* @param key
* @param value
*/
void zrem(String key, String value);
/**
* 删除指定分数范围的数据
* @author lw。
* @param key
* @param start
* @param end
*/
void zremrangeByScore(String key, Long start, Long end);
/**
* sorted set数据降序获取指定范围的数据
* 说明:此接口自己根据传入的当前页及每页的数量做数值计算处理,不需要调用者再处理
* @author lw。
* @param key
* @param pageNo
* @param pageSize
* @return
*/
Set<Tuple> zrevrangeWithScores(String key, Long pageNo, Long pageSize);
/* ------------ >>>>>> 商品缓存相关 <<<<<< ------------ */
/**
* 设置单个key的失效时间
* @author lw。
* @param key
* @param expireSeconds
*/
void skuSingleExpire(String key, Integer expireSeconds);
/**
* 商品数据的存放
* @author lw。
* @param key
* @param value
* @param expireSeconds
* @return
*/
String skuSet(String key, String value, Integer expireSeconds);
/**
* 商品数据的获取
* @author lw。
* @param key
* @return
*/
String skuGet(String key);
/**
* 删除一件商品
* @author lw。
* @param key
* @return
*/
Long skuDel(String key);
/**
* 获取redis中存储的Map结构的数据
* @author lw。
* @param skuKey
* @return
*/
Map<String, String> skuMGet(String skuKey);
/**
* 向redis中存放一个Map
* @author lw。
* @param skuKey
* @param value
*/
void skuMSet(String skuKey, Map<String, String> value);
/**
* 批量以Map的形式保存商品信息,即一件商品对应一个Redis的Map数据格式
* @author lw。
* @param values 最外层Map的key既是Redis里存放的key又是Redis的map类型里的key,value为Redis的map类型里的value
* @param expireSeconds 单Map的失效时间
*/
void skuHMSet(Map<String, Map<String, String>> values, Integer expireSeconds);
/**
* 批量获取以Map的形式获取商品信息
* @author lw。
* @param skuKeys Redis里存放的key
* @return
*/
Map<String, Map<String, String>> skuHMGet(List<String> skuKeys);
}
6、 JedisClientPool
package com.xxxx.xxxx.service.redis;
import org.springframework.beans.factory.annotation.Autowired;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.Pipeline;
import redis.clients.jedis.Response;
import redis.clients.jedis.Tuple;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import javax.annotation.Resource;
public class JedisClientPool implements JedisClient {
@Autowired
private JedisPool jedisPool;
@Resource(name = "skuJedisPool")
private JedisPool skuJedisPool;
/**
* 获取指定规则下的所有的key
* @author lw。
* @param pattern
* @return
*/
@Override
public Set<String> keys(String pattern) {
Jedis jedis = jedisPool.getResource();
Set<String> keys = jedis.keys(pattern);
return keys;
}
@Override
public String set(String key, String value) {
Jedis jedis = jedisPool.getResource();
String result = jedis.set(key, value);
jedis.close();
return result;
}
@Override
public String get(String key) {
Jedis jedis = jedisPool.getResource();
String result = jedis.get(key);
jedis.close();
return result;
}
@Override
public Long del(String key) {
Jedis jedis = jedisPool.getResource();
Long result = jedis.del(key);
jedis.close();
return result;
}
@Override
public Boolean exists(String key) {
Jedis jedis = jedisPool.getResource();
Boolean result = jedis.exists(key);
jedis.close();
return result;
}
@Override
public Long expire(String key, int seconds) {
Jedis jedis = jedisPool.getResource();
Long result = jedis.expire(key, seconds);
jedis.close();
return result;
}
@Override
public Long ttl(String key) {
Jedis jedis = jedisPool.getResource();
Long result = jedis.ttl(key);
jedis.close();
return result;
}
@Override
public Long incr(String key) {
Jedis jedis = jedisPool.getResource();
Long result = jedis.incr(key);
jedis.close();
return result;
}
@Override
public Long hset(String key, String field, String value) {
Jedis jedis = jedisPool.getResource();
Long result = jedis.hset(key, field, value);
jedis.close();
return result;
}
@Override
public String hget(String key, String field) {
Jedis jedis = jedisPool.getResource();
String result = jedis.hget(key, field);
jedis.close();
return result;
}
@Override
public Long hdel(String key, String... field) {
Jedis jedis = jedisPool.getResource();
Long result = jedis.hdel(key, field);
jedis.close();
return result;
}
@Override
public Map<String, String> hgetAll(String key) {
Jedis jedis = jedisPool.getResource();
Map<String, String> result = jedis.hgetAll(key);
jedis.close();
return result;
}
@Override
public Set<String> hkeys(String key) {
Jedis jedis = jedisPool.getResource();
Set<String> fields = jedis.hkeys(key);
jedis.close();
return fields;
}
/**
* 批量设置redis的key的失效时间
* 说明:内部使用的Pipeline对象来操作的。
* @author lw。
* @param keys
* @param seconds
*/
@Override
public void batchExpire(List<String> keys, int seconds) {
Jedis jedis = jedisPool.getResource();
Pipeline pipeline = jedis.pipelined();
for (String key : keys) {
pipeline.expire(key, seconds);
}
pipeline.sync();
jedis.close();
}
/**
* 批量删除Hash数据
* @author lw。
* @param keys
*/
@Override
public void batchHDelete(String key, List<String> fields) {
Jedis jedis = jedisPool.getResource();
Pipeline pipeline = jedis.pipelined();
for (String field : fields) {
pipeline.hdel(key, field);
}
pipeline.sync();
jedis.close();
}
/**
* 批量List添加
* @author lw。
* @param key
* @param fields
* @return
*/
@Override
public void batchHSet(String key, Map<String, String> fields) {
Jedis jedis = jedisPool.getResource();
Pipeline pipeline = jedis.pipelined();
for (Map.Entry<String, String> entry : fields.entrySet()) {
pipeline.hset(key, entry.getKey(), entry.getValue());
}
pipeline.sync();
jedis.close();
}
/**
* 批量添加以(baseKey + value)为key的String类型数据
* @author lw。
* @param baseKey
* @param vals
*/
@Override
public void batchBaseKeyAppendValueSet(String baseKey, List<String> vals,
int seconds) {
Jedis jedis = jedisPool.getResource();
Pipeline pipeline = jedis.pipelined();
for (String value : vals) {
String key = baseKey + value;
pipeline.set(key, value);
pipeline.expire(key, seconds);
}
pipeline.sync();
jedis.close();
}
/**
* sorted set的添加
* @author lw。
* @param key
* @param score
* @param value
*/
@Override
public void zaddWithScore(String key, Long score, String value) {
Jedis jedis = jedisPool.getResource();
Pipeline pipeline = jedis.pipelined();
pipeline.zadd(key, score, value);
pipeline.sync();
try {
pipeline.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* sorted set的移除一条数据
* @author lw。
* @param key
* @param value
*/
@Override
public void zrem(String key, String value) {
Jedis jedis = jedisPool.getResource();
Pipeline pipeline = jedis.pipelined();
pipeline.zrem(key, value);
pipeline.sync();
try {
pipeline.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 删除指定分数范围的数据
* @author lw。
* @param key
* @param start
* @param end
*/
@Override
public void zremrangeByScore(String key, Long start, Long end) {
Jedis jedis = jedisPool.getResource();
Pipeline pipeline = jedis.pipelined();
pipeline.zremrangeByScore(key, start, end);
pipeline.sync();
try {
pipeline.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* sorted set数据降序获取指定范围的数据
* 说明:此接口自己根据传入的当前页及每页的数量做数值计算处理,不需要调用者再处理
* @author lw。
* @param key
* @param pageNo
* @param pageSize
* @return
*/
@Override
public Set<Tuple> zrevrangeWithScores(String key, Long pageNo, Long pageSize) {
Jedis jedis = jedisPool.getResource();
Pipeline pipeline = jedis.pipelined();
// 计算查询的开始值及结束值
Long start = (pageNo - 1) * pageSize;
Long end = (pageNo * pageSize) - 1;
Response<Set<Tuple>> result = pipeline.zrevrangeWithScores(key, start,
end);
pipeline.sync();
try {
pipeline.close();
} catch (IOException e) {
e.printStackTrace();
}
Set<Tuple> set = result.get();
return set;
}
/**
* 设置单个key的失效时间
* @author lw。
* @param key
* @param expireSeconds
*/
@Override
public void skuSingleExpire(String key, Integer expireSeconds) {
Jedis jedis = skuJedisPool.getResource();
if ((expireSeconds != null) && (expireSeconds > 0)) {
jedis.expire(key, expireSeconds);
}
jedis.close();
}
/**
* 商品数据的存放
* @author lw。
* @param key
* @param value
* @return
*/
@Override
public String skuSet(String key, String value, Integer expireSeconds) {
Jedis jedis = skuJedisPool.getResource();
String result = jedis.set(key, value);
if ((expireSeconds != null) && (expireSeconds > 0)) {
jedis.expire(key, expireSeconds);
}
jedis.close();
return result;
}
/**
* 商品数据的获取
* @author lw。
* @param key
* @return
*/
@Override
public String skuGet(String key) {
Jedis jedis = skuJedisPool.getResource();
String result = jedis.get(key);
jedis.close();
return result;
}
/**
* 删除一件商品
* @author lw。
* @param key
* @return
*/
@Override
public Long skuDel(String key) {
Jedis jedis = skuJedisPool.getResource();
Long result = jedis.del(key);
jedis.close();
return result;
}
/**
* 获取redis中存储的Map结构的数据
* @author lw。
* @param skuKey
* @return
*/
@Override
public Map<String, String> skuMGet(String skuKey) {
Jedis jedis = skuJedisPool.getResource();
Pipeline pipeline = jedis.pipelined();
Response<Map<String, String>> resultMap = pipeline.hgetAll(skuKey);
pipeline.sync();
Map<String, String> result = resultMap.get();
try {
pipeline.close();
} catch (IOException e) {
e.printStackTrace();
}
jedis.close();
return result;
}
/**
* 向redis中存放一个Map
* @author lw。
* @param skuKey
* @param value
*/
@Override
public void skuMSet(String skuKey, Map<String, String> value) {
Jedis jedis = skuJedisPool.getResource();
// 利用管道的方式来直接向Map结构中插入数据
Pipeline pipeline = jedis.pipelined();
pipeline.hmset(skuKey, value);
pipeline.sync();
try {
pipeline.close();
} catch (IOException e) {
e.printStackTrace();
}
jedis.close();
}
/**
* 批量以Map的形式保存商品信息,即一件商品对应一个Redis的Map数据格式
* @author lw。
* @param values 最外层Map的key既是Redis里存放的key又是Redis的map类型里的key,value为Redis的map类型里的value
* @param expireSeconds 单Map的失效时间
*/
@Override
public void skuHMSet(Map<String, Map<String, String>> values,
Integer expireSeconds) {
if ((values == null) || (values.size() <= 0)) {
return;
}
Jedis jedis = skuJedisPool.getResource();
// 获取Pipeline对象
Pipeline pipeline = jedis.pipelined();
for (Entry<String, Map<String, String>> entry : values.entrySet()) {
String key = entry.getKey();
Map<String, String> value = entry.getValue();
pipeline.hmset(key, value);
if ((expireSeconds != null) && (expireSeconds > 0)) {
pipeline.expire(key, expireSeconds);
}
}
pipeline.sync();
try {
pipeline.close();
} catch (IOException e) {
e.printStackTrace();
}
jedis.close();
}
/**
* 批量获取以Map的形式获取商品信息
* @author lw。
* @param skuKeys Redis里存放的key
* @return
*/
@Override
public Map<String, Map<String, String>> skuHMGet(List<String> skuKeys) {
if ((skuKeys == null) || (skuKeys.size() <= 0)) {
return null;
}
Jedis jedis = skuJedisPool.getResource();
// 获取Pipeline对象
Pipeline pipeline = jedis.pipelined();
int size = skuKeys.size();
// 定义sync方法执行前的临时存放数据的list
Map<String, Response<Map<String, String>>> responses = new HashMap<String, Response<Map<String, String>>>(size);
for (int i = 0; i < size; i++) {
String key = skuKeys.get(i);
Response<Map<String, String>> hgetAllResult = pipeline.hgetAll(key);
responses.put(key, hgetAllResult);
}
pipeline.sync();
try {
pipeline.close();
} catch (IOException e) {
e.printStackTrace();
}
Map<String, Map<String, String>> result = new HashMap<String, Map<String, String>>(size);
for (Entry<String, Response<Map<String, String>>> responseEntry : responses.entrySet()) {
Response<Map<String, String>> responseValue = responseEntry.getValue();
Map<String, String> value = responseValue.get();
String skuKey = responseEntry.getKey();
if (value.isEmpty()) {
result.put(skuKey, null);
} else {
result.put(skuKey, value);
}
}
jedis.close();
return result;
}
}
7、使用redis进行查找存储
存商品目录: 这里传入的是个tree结构对象
jedisClient.set(categoryKey, JSON.toJSONString(categoryTree));
jedisClient.expire(categoryKey, categoryExpire);
查商品目录:
String categoriesStr = jedisClient.get(categoryKey); //查出结果后需要转成对象使用,此处不再写了
以上均是个人使用的代码片段,仅供参考!