要想在Java中连接Redis,并进行操作,由两种方式,一种是spring data redis,它是由spring集成的,不支持集群,一种是官方推荐的jedis,支持集群,其他功能差不多一样,
这里我们介绍jedis操作实例,以下是使用Jedis的具体步骤:
1、如果是在Maven项目中,在pom.xml中增加如下语句,如果不是Maven项目下载包导入项目即可:
redis.clients
jedis
2.6.2
# Redis settings
redis.host=192.168.0.240
redis.port=6379
redis.pass=xxxxxx
redis.timeout=10000
redis.maxIdle=300
redis.maxTotal=600
# 毫秒
redis.maxWaitMillis=1000
redis.testOnBorrow=false
3、创建属性文件加载工具类,用于获取redis.properties文件
package com.rmd.cart.utils;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
/**
* 属性文件加载工具类
* @author lc
*/
public class PropertyUtil {
//加载property文件到io流里面
public static Properties loadProperties(String propertyFile) {
Properties properties = new Properties();
try {
InputStream is = PropertyUtil.class.getClassLoader().getResourceAsStream(propertyFile);
if(is == null){
is = PropertyUtil.class.getClassLoader().getResourceAsStream("properties/" + propertyFile);
}
properties.load(is);
} catch (IOException e) {
e.printStackTrace();
}
return properties;
}
/**
* 根据key值取得对应的value值
*
* @param key
* @return
*/
public static String getValue(String propertyFile, String key) {
Properties properties = loadProperties(propertyFile);
return properties.getProperty(key);
}
}
package com.rmd.cart.utils;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
/**
* redis工具类
* @author lc
*/
public class JedisUtil {
private static JedisPool jedisPool = null;
private JedisUtil() {
}
//写成静态代码块形式,只加载一次,节省资源
static {
Properties properties = PropertyUtil.loadProperties("redis.properties");
String host = properties.getProperty("redis.host");
String port = properties.getProperty("redis.port");
String pass = properties.getProperty("redis.pass");
String timeout = properties.getProperty("redis.timeout");
String maxIdle = properties.getProperty("redis.maxIdle");
String maxTotal = properties.getProperty("redis.maxTotal");
String maxWaitMillis = properties.getProperty("redis.maxWaitMillis");
String testOnBorrow = properties.getProperty("redis.testOnBorrow");
JedisPoolConfig config = new JedisPoolConfig();
//控制一个pool可分配多少个jedis实例,通过pool.getResource()来获取;
//如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。
config.setMaxTotal(Integer.parseInt(maxTotal));
//控制一个pool最多有多少个状态为idle(空闲的)的jedis实例。
config.setMaxIdle(Integer.parseInt(maxIdle));
//表示当borrow(引入)一个jedis实例时,最大的等待时间,如果超过等待时间,则直接抛出JedisConnectionException;
config.setMaxWaitMillis(Long.parseLong(maxWaitMillis));
//在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;
config.setTestOnBorrow(Boolean.valueOf(testOnBorrow));
jedisPool = new JedisPool(config, host, Integer.parseInt(port), Integer.parseInt(timeout), pass);
}
/**
* 从jedis连接池中获取获取jedis对象
*
* @return
*/
private Jedis getJedis() {
return jedisPool.getResource();
}
private static final JedisUtil jedisUtil = new JedisUtil();
/**
* 获取JedisUtil实例
*
* @return
*/
public static JedisUtil getInstance() {
return jedisUtil;
}
/**
* 回收jedis(放到finally中)
*
* @param jedis
*/
private void returnJedis(Jedis jedis) {
if (null != jedis && null != jedisPool) {
jedisPool.returnResource(jedis);
}
}
/**
* 销毁连接(放到catch中)
*
* @param jedis
*/
private static void returnBrokenResource(Jedis jedis) {
if (null != jedis && null != jedisPool) {
jedisPool.returnResource(jedis);
}
}
/**
* 添加sorted set
*
* @param key
* @param value
* @param score
*/
public void zadd(String key, String value, double score) {
Jedis jedis = getJedis();
jedis.zadd(key, score, value);
returnJedis(jedis);
}
/**
* 返回指定位置的集合元素,0为第一个元素,-1为最后一个元素
* @param key
* @param start
* @param end
* @return
*/
public Set zrange(String key, int start, int end) {
Jedis jedis = getJedis();
Set set = jedis.zrange(key, start, end);
returnJedis(jedis);
return set;
}
/**
* 获取给定区间的元素,原始按照权重由高到低排序
* @param key
* @param start
* @param end
* @return
*/
public Set zrevrange(String key, int start, int end) {
Jedis jedis = getJedis();
Set set = jedis.zrevrange(key, start, end);
returnJedis(jedis);
return set;
}
/**
* 添加对应关系,如果对应关系已存在,则覆盖
*
* @param key
* @param map 对应关系
* @return 状态,成功返回OK
*/
public String hmset(String key, Map map) {
Jedis jedis = getJedis();
String s = jedis.hmset(key, map);
returnJedis(jedis);
return s;
}
/**
* 向List头部追加记录
*
* @param key
* @param value
* @return 记录总数
*/
public long rpush(String key, String value) {
Jedis jedis = getJedis();
long count = jedis.rpush(key, value);
returnJedis(jedis);
return count;
}
/**
* 向List头部追加记录
*
* @param key
* @param value
* @return 记录总数
*/
private long rpush(byte[] key, byte[] value) {
Jedis jedis = getJedis();
long count = jedis.rpush(key, value);
returnJedis(jedis);
return count;
}
/**
* 删除
*
* @param key
* @return
*/
public long del(String key) {
Jedis jedis = getJedis();
long s = jedis.del(key);
returnJedis(jedis);
return s;
}
/**
* 从集合中删除成员
* @param key
* @param value
* @return 返回1成功
* */
public long zrem(String key, String... value) {
Jedis jedis = getJedis();
long s = jedis.zrem(key, value);
returnJedis(jedis);
return s;
}
public void saveValueByKey(int dbIndex, byte[] key, byte[] value, int expireTime)
throws Exception {
Jedis jedis = null;
boolean isBroken = false;
try {
jedis = getJedis();
jedis.select(dbIndex);
jedis.set(key, value);
if (expireTime > 0)
jedis.expire(key, expireTime);
} catch (Exception e) {
isBroken = true;
throw e;
} finally {
returnResource(jedis, isBroken);
}
}
public byte[] getValueByKey(int dbIndex, byte[] key) throws Exception {
Jedis jedis = null;
byte[] result = null;
boolean isBroken = false;
try {
jedis = getJedis();
jedis.select(dbIndex);
result = jedis.get(key);
} catch (Exception e) {
isBroken = true;
throw e;
} finally {
returnResource(jedis, isBroken);
}
return result;
}
public void deleteByKey(int dbIndex, byte[] key) throws Exception {
Jedis jedis = null;
boolean isBroken = false;
try {
jedis = getJedis();
jedis.select(dbIndex);
jedis.del(key);
} catch (Exception e) {
isBroken = true;
throw e;
} finally {
returnResource(jedis, isBroken);
}
}
public void returnResource(Jedis jedis, boolean isBroken) {
if (jedis == null)
return;
if (isBroken)
jedisPool.returnBrokenResource(jedis);
else
jedisPool.returnResource(jedis);
}
/**
* 获取总数量
* @param key
* @return
*/
public long zcard(String key) {
Jedis jedis = getJedis();
long count = jedis.zcard(key);
returnJedis(jedis);
return count;
}
/**
* 是否存在KEY
* @param key
* @return
*/
public boolean exists(String key) {
Jedis jedis = getJedis();
boolean exists = jedis.exists(key);
returnJedis(jedis);
return exists;
}
/**
* 重命名KEY
* @param oldKey
* @param newKey
* @return
*/
public String rename(String oldKey, String newKey) {
Jedis jedis = getJedis();
String result = jedis.rename(oldKey, newKey);
returnJedis(jedis);
return result;
}
/**
* 设置失效时间
* @param key
* @param seconds
*/
public void expire(String key, int seconds) {
Jedis jedis = getJedis();
jedis.expire(key, seconds);
returnJedis(jedis);
}
/**
* 删除失效时间
* @param key
*/
public void persist(String key) {
Jedis jedis = getJedis();
jedis.persist(key);
returnJedis(jedis);
}
/**
* 添加一个键值对,如果键存在不在添加,如果不存在,添加完成以后设置键的有效期
* @param key
* @param value
* @param timeOut
*/
public void setnxWithTimeOut(String key,String value,int timeOut){
Jedis jedis = getJedis();
if(0!=jedis.setnx(key, value)){
jedis.expire(key, timeOut);
}
returnJedis(jedis);
}
/**
* 返回指定key序列值
* @param key
* @return
*/
public long incr(String key){
Jedis jedis = getJedis();
long l = jedis.incr(key);
returnJedis(jedis);
return l;
}
/**
* 获取当前时间
* @return 秒
*/
public long currentTimeSecond(){
Long l = 0l;
Jedis jedis = getJedis();
Object obj = jedis.eval("return redis.call('TIME')",0);
if(obj != null){
List list = (List)obj;
l = Long.valueOf(list.get(0));
}
returnJedis(jedis);
return l;
}
}
package com.rmd.cart.service.impl;
import java.util.Date;
import java.util.Set;
import org.springframework.stereotype.Service;
import com.rmd.cart.utils.JedisUtil;
/**
* redis服务
* @author lc
*/
@Service("redisService")
public class RedisService {
/**
* 添加SortSet型数据
* @param key
* @param value
*/
public void addSortSet(String key, String value) {
double score = new Date().getTime();
JedisUtil jedisUtil = JedisUtil.getInstance();
jedisUtil.zadd(key, value, score);
}
/**
* 获取倒序的SortSet型的数据
* @param key
* @return
*/
public Set getDescSortSet(String key) {
JedisUtil jedisUtil = JedisUtil.getInstance();
return jedisUtil.zrevrange(key, 0, -1);
}
/**
* 删除SortSet型数据
* @param key
* @param value
*/
public void deleteSortSet(String key, String value) {
JedisUtil jedisUtil = JedisUtil.getInstance();
jedisUtil.zrem(key, value);
}
/**
* 批量删除SortSet型数据
* @param key
* @param value
*/
public void deleteSortSetBatch(String key, String[] value) {
JedisUtil jedisUtil = JedisUtil.getInstance();
jedisUtil.zrem(key, value);
}
/**
* 范围获取倒序的SortSet型的数据
* @param key
* @return
*/
public Set getDescSortSetPage(String key,int start, int end) {
JedisUtil jedisUtil = JedisUtil.getInstance();
return jedisUtil.zrevrange(key, start, end);
}
/**
* 获取SortSet型的总数量
* @param key
* @return
*/
public long getSortSetAllCount(String key) {
JedisUtil jedisUtil = JedisUtil.getInstance();
return jedisUtil.zcard(key);
}
/**
* 检查KEY是否存在
* @param key
* @return
*/
public boolean checkExistsKey(String key) {
JedisUtil jedisUtil = JedisUtil.getInstance();
return jedisUtil.exists(key);
}
/**
* 重命名KEY
* @param oldKey
* @param newKey
* @return
*/
public String renameKey(String oldKey, String newKey) {
JedisUtil jedisUtil = JedisUtil.getInstance();
return jedisUtil.rename(oldKey, newKey);
}
/**
* 删除KEY
* @param key
*/
public void deleteKey(String key) {
JedisUtil jedisUtil = JedisUtil.getInstance();
jedisUtil.del(key);
}
/**
* 设置失效时间
* @param key
* @param seconds 失效时间,秒
*/
public void setExpireTime(String key, int seconds) {
JedisUtil jedisUtil = JedisUtil.getInstance();
jedisUtil.expire(key, seconds);
}
/**
* 删除失效时间
* @param key
*/
public void deleteExpireTime(String key) {
JedisUtil jedisUtil = JedisUtil.getInstance();
jedisUtil.persist(key);
}
}
注意:以上是公共基础,下面是我业务操作,怎样保存数据和获取数据
6、由于我想做购物车,创建购物车service接口,代码如下
package com.rmd.cart.service;
import java.util.Set;
/**
* @Description: 购物车service
* @author lc
*/
public interface CartService {
/**
*
* @Description: 添加购物车
* @author lc
* @param customerId
* void
*/
public void add(String customerId);
/**
* @Description: 获取购物车数据
* @author lc
* @param customerId
* @return
* Set
*/
public Set getCart(String customerId);
}
package com.rmd.cart.service.impl;
import java.util.Set;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.rmd.cart.service.CartService;
@Service("cartService")
public class CartServiceImpl implements CartService {
@Autowired
private RedisService redisService;
@Override
public void add(String customerId) {
redisService.addSortSet("rmd_cart_test123", customerId);
}
@Override
public Set getCart(String customerId) {
return redisService.getDescSortSet("rmd_cart_test123");
}
}
package com.rmd.cart.bean;
import java.io.Serializable;
import java.util.List;
public class SpuInfo implements Serializable{
private Integer spuid;//spuid
private long createTime;//添加时间
private List skuList;//sku信息集合
public Integer getSpuid() {
return spuid;
}
public void setSpuid(Integer spuid) {
this.spuid = spuid;
}
public long getCreateTime() {
return createTime;
}
public void setCreateTime(long createTime) {
this.createTime = createTime;
}
public List getSkuList() {
return skuList;
}
public void setSkuList(List skuList) {
this.skuList = skuList;
}
}
添加数据
package rmd_cart_provider.service.test;
import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;
import javax.annotation.Resource;
import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.rmd.cart.bean.SpuInfo;
import com.rmd.cart.service.CartService;
@RunWith(SpringJUnit4ClassRunner.class) //使用junit4进行测试
@ContextConfiguration({"/applicationContext.xml"}) //加载配置文件
public class CartTest {
@Resource
private CartService cartService;
@Test
public void test() throws JsonGenerationException, JsonMappingException, IOException{
SpuInfo spu = new SpuInfo();
spu.setSpuid(123);
spu.setCreateTime(105456464);
//将对象转换成json字符串
ObjectMapper om = new ObjectMapper();
Writer wr = new StringWriter();
om.writeValue(wr, spu);
String str = wr.toString();
//添加数据
cartService.add(str);
}
}
package rmd_cart_provider.service.test;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import javax.annotation.Resource;
import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.rmd.cart.bean.SpuInfo;
import com.rmd.cart.service.CartService;
@RunWith(SpringJUnit4ClassRunner.class) //使用junit4进行测试
@ContextConfiguration({"/applicationContext.xml"}) //加载配置文件
public class CartTest {
@Resource
private CartService cartService;
@Test
public void test() throws JsonGenerationException, JsonMappingException, IOException{
//获取数据
List spuList = new ArrayList<>();
ObjectMapper om = new ObjectMapper();
//转回对象
Set set = cartService.getCart(null);
Iterator iterator = set.iterator();
while (iterator.hasNext()) {
String value = iterator.next();
SpuInfo spuVo = om.readValue(value, SpuInfo.class);
spuList.add(spuVo);
}
}
}
JUnit4单元测试,这个应该都知道,只要加入包就行
junit
junit
4.12
test
org.springframework
spring-test
${spring.version}
org.springframework
spring-tx
${spring.version}
org.codehaus.jackson
jackson-mapper-asl
1.9.4