java中使用Jedis操作Redis实例

要想在Java中连接Redis,并进行操作,由两种方式,一种是spring data redis,它是由spring集成的,不支持集群,一种是官方推荐的jedis,支持集群,其他功能差不多一样,

这里我们介绍jedis操作实例,以下是使用Jedis的具体步骤:

1、如果是在Maven项目中,在pom.xml中增加如下语句,如果不是Maven项目下载包导入项目即可:


            redis.clients
            jedis
            2.6.2
        

2、创建redis.properties配置文件,设置连接参数

# 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);
    }
}

4、创建连接redis工具类

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;
    }
}

5、编写redis服务类

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);

}

7、创建impl类实现service接口,代码如下

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");
	}

}

8、创建一个对象类,用户数据测试

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;
	}
}

9、创建测试类,使用junit4进行测试

添加数据

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和ObjectMapper

JUnit4单元测试,这个应该都知道,只要加入包就行

        
	     junit
	     junit
	     4.12
	     test
	
	
		org.springframework
		spring-test
		${spring.version}
	
	
		org.springframework
		spring-tx
		${spring.version}
	

ObjectMapper这个是一个高效的对象和json之间转换的类,具体方法查文档,谁用都说好,推荐给大家


         org.codehaus.jackson
         jackson-mapper-asl
         1.9.4
    	

以上是个人在学习和做项目中用到的东西,记录一下,如有更好的建议一起研究学习


你可能感兴趣的:(java中使用Jedis操作Redis实例)