Redis在线管理篇

Redis在线管理篇
一.引入
    Redis是什么:搜索引擎上面一大推,这里不说了。
    Redis特点:性能极高 – Redis能支持超过 100K+ 每秒的读写频率,同时具备丰富的数据类型 – 支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作......
    因此Redis用作为高速缓存场景非常适合,(如:集群环境下session的存储,新提醒等)。
    然而redis大多数都是通过client进行管理的,对于系统用户来说,不能直接图形化管理redis数据是一个弊端,此篇文章就记录一下开发redis在线管理的要点。

二.操作要点

先上代码吧

1.  配置文件  redis.properties

#============ Redis Configuration Begin ==========#
redis_host=127.0.0.1
redis_port=6379
redis_pwd=123456
redis_maxTotal=200
redis_maxIdle=50
redis_minIdle=10
redis_maxWaitMillis=10000
#============= Redis Configuration End ===========#


2.  读取配置文件:PropertiesHandler.java
import java.io.InputStream;
import java.util.Properties;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 读取属性配置文件
 * @author yannguo
 */
public class PropertiesHandler {
	private static Logger log = LoggerFactory.getLogger(PropertiesHandler.class);
	private static Properties defaultProperties;
	
	static {
		ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
		if (classLoader == null) {
			classLoader = PropertiesHandler.class.getClassLoader();
		}
		try {
			if (log.isDebugEnabled()) {
				log.debug("开始装载属性资源参数文件...");
			}
			InputStream is = classLoader.getResourceAsStream("redis.properties");
			defaultProperties = new Properties();
			defaultProperties.load(is);

		} catch (Exception e) {
			try {
				throw new Exception("装载属性资源参数文件出错.", e);
			} catch (Exception e1) {
			}
		}
	}
	
	/**
	 * 返回缺省属性文件[application.properties]属性值
	 * 
	 * @param pKey
	 * @return String
	 */
	public static String getProperty(String pKey) {
		String value = defaultProperties.getProperty(pKey, "");
		return value;
	}
	
}

3.  Redis工具类  JedisUtil.java
package com.hfmx.utils.redis;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.List;
import java.util.Map;
import java.util.Set;
import com.google.gson.Gson;
import com.hfmx.formmodel.redis.FRedisModel;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

/**
 * Redis客户端
 * @author yangnuo
 */
@SuppressWarnings("deprecation")
public class JedisUtil {

//	private static Logger logger = LoggerFactory.getLogger(JedisUtil.class);

	// 连接池对象
	private static JedisPool jedisPool;

	static {
		String host = PropertiesHandler.getProperty("redis_host");
		int port = Integer.valueOf(PropertiesHandler.getProperty("redis_port"));
		String password = PropertiesHandler.getProperty("redis_pwd");
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxTotal(Integer.valueOf(PropertiesHandler.getProperty("redis_maxTotal")));
        config.setMaxIdle(Integer.valueOf(PropertiesHandler.getProperty("redis_maxIdle")));
        config.setMinIdle(Integer.valueOf(PropertiesHandler.getProperty("redis_minIdle")));
        config.setMaxWaitMillis(Integer.valueOf(PropertiesHandler.getProperty("redis_maxWaitMillis")));
        config.setTestOnBorrow(true);
        config.setTestOnReturn(true);
        //Idle时进行连接扫描
        config.setTestWhileIdle(true);
        //表示idle object evitor两次扫描之间要sleep的毫秒数
        config.setTimeBetweenEvictionRunsMillis(30000);
        //表示idle object evitor每次扫描的最多的对象数
        config.setNumTestsPerEvictionRun(10);
        //表示一个对象至少停留在idle状态的最短时间,然后才能被idle object evitor扫描并驱逐;这一项只有在timeBetweenEvictionRunsMillis大于0时才有意义
        config.setMinEvictableIdleTimeMillis(60000);
        if (JHCJUtils.isEmpty(password)) {
        	jedisPool = new JedisPool(config, host, port);
		}else{
			jedisPool = new JedisPool(config, host, port, 0, password);
		}
	}

    /**
     * 获取Jedis连接客户端
     * 
     * @return
     */
	public static Jedis getJedisClient() {
		Jedis jedis = null;
		try {
			jedis = jedisPool.getResource();
		} catch (Exception e) {
//			logger.error("获取Redis客户端连接失败。");
			System.out.println("错误:[获取Redis客户端连接失败]");
			e.printStackTrace();
		}
		if (jedis == null) {
//			logger.warn("没有获取到Redis客户端连接。");
			System.out.println("警告:[没有获取到Redis客户端连接]");
		}
		return jedis;
	}

	/**
	 * 安全回收资源
	 * 
	 * @param jedis
	 */
	public static void close(Jedis jedis) {
		try {
			jedisPool.returnResource(jedis);
		} catch (Exception e) {
			if (jedis.isConnected()) {
				jedis.quit();
				jedis.disconnect();
			}
		}
	}

	/**
	 * 设置字符串型数据
	 * 
	 * @param key
	 *            存储键
	 * @param value
	 *            存储值
	 * @param timeout
	 *            超时时间(单位:秒) 设置为0,则无时效性。
	 * @return
	 */
	public static void setString(String key, String value, int timeout) {
		if (JHCJUtils.isEmpty(key)) {
			throw new NullPointerException("Key不能为空!");
		}
		Jedis jedis = null;
		try {
			jedis = getJedisClient();
			jedis.set(key, value);
			if (timeout > 0) {
				jedis.expire(key, timeout);
			}
		} catch (Exception e) {
			jedisPool.returnBrokenResource(jedis);
//			logger.error("操作Redis失败", e);
			System.out.println("错误:[操作Redis失败]");
		} finally {
			close(jedis);
		}
	}
	
	/**
	 * 设置字符串型数据过期时间
	 * 
	 * @param key
	 *            存储键
	 * @param timeout
	 *            超时时间(单位:秒)
	 * @param key
	 */
	public static void exprString(String key, int timeout) {
		if (JHCJUtils.isEmpty(key)) {
			return;
		}
		Jedis jedis = null;
		try {
			jedis = getJedisClient();
			jedis.expire(key, timeout);
		} catch (Exception e) {
			jedisPool.returnBrokenResource(jedis);
//			logger.error("操作Redis失败", e);
			System.out.println("错误:[操作Redis失败]");
		} finally {
			close(jedis);
		}
	}

	/**
	 * 设置序列化对象数据
	 * 
	 * @param key
	 *            存储键
	 * @param value
	 *            存储值
	 * @param timeout
	 *            超时时间(单位:秒) 设置为0,则无时效性。
	 * @return
	 */
	public static void setObj(String key, byte[] value, int timeout) {
		if (JHCJUtils.isEmpty(key)) {
			throw new NullPointerException("Key不能为空!");
		}
		Jedis jedis = null;
		try {
			jedis = getJedisClient();
			jedis.set(key.getBytes(), value);
			if (timeout > 0) {
				jedis.expire(key, timeout);
			}
		} catch (Exception e) {
			jedisPool.returnBrokenResource(jedis);
//			logger.error("操作Redis失败", e);
			System.out.println("错误:[操作Redis失败]");
		} finally {
			close(jedis);
		}
	}
	
	
	
	
	
	/**
	 * 添加集合数据
	 * @param type
	 * @param obj
	 * @param existtime
	 */
	public static void addAggregate(FRedisModel redisModel){
		Jedis jedis = JedisUtil.getJedisClient();
		if(redisModel.getType().equals("list")){
			List list = (List) redisModel.getVal();
			for (int i=0;i<list.size();i++) {
				jedis.lpush(redisModel.getKey(), new Gson().toJson(list.get(i)));
			}
		}else if(redisModel.getType().equals("set")){
			Set set =  (Set) redisModel.getVal();
			for (Object object : set) {
				jedis.sadd(redisModel.getKey(), new Gson().toJson(object));
			}
		}else if(redisModel.getType().equals("hashObj")){
			jedis.hmset(redisModel.getKey().getBytes(),(Map<byte[], byte[]>) redisModel.getVal());
		}else if(redisModel.getType().equals("hashStr")){
			jedis.hmset(redisModel.getKey(), (Map<String, String>) redisModel.getVal());
		}
		
		if (redisModel.getExisttime() > 0) {
			jedis.expire(redisModel.getKey(), (int)redisModel.getExisttime());
		}
		JedisUtil.close(jedis);
		System.out.println("完成添加   ["+redisModel.getType()+"]  集合");
	}
	
	
	

	/**
	 * 获取字符串型数据
	 * 
	 * @param key
	 * @return
	 */
	public static String getString(String key) {
		if (JHCJUtils.isEmpty(key)) {
			throw new NullPointerException("Key不能为空!");
		}
		String value = null;
		Jedis jedis = null;
		try {
			jedis = getJedisClient();
			value = jedis.get(key);
		} catch (Exception e) {
			jedisPool.returnBrokenResource(jedis);
//			logger.error("操作Redis失败", e);
			System.out.println("错误:[操作Redis失败]");
		} finally {
			close(jedis);
		}
		return value;
	}

	/**
	 * 获取序列化对象数据
	 * 
	 * @param key
	 * @return
	 */
	public static byte[] getObj(String key) {
		if (JHCJUtils.isEmpty(key)) {
			throw new NullPointerException("Key不能为空!");
		}
		byte[] value = null;
		Jedis jedis = null;
		try {
			jedis = getJedisClient();
			value = jedis.get(key.getBytes());
		} catch (Exception e) {
			jedisPool.returnBrokenResource(jedis);
//			logger.error("操作Redis失败", e);
			System.out.println("错误:[操作Redis失败]");
		} finally {
			close(jedis);
		}
		return value;
	}

	/**
	 * 删除对象数据
	 * 
	 * @param key
	 */
	public static void delObj(String key) {
		if (JHCJUtils.isEmpty(key)) {
			return;
		}
		Jedis jedis = null;
		try {
			jedis = getJedisClient();
			jedis.del(key.getBytes());
		} catch (Exception e) {
			jedisPool.returnBrokenResource(jedis);
//			logger.error("操作Redis失败", e);
			System.out.println("错误:[操作Redis失败]");
		} finally {
			close(jedis);
		}
	}

	/**
	 * 删除字符串数据
	 * 
	 * @param key
	 */
	public static void delString(String key) {
		if (JHCJUtils.isEmpty(key)) {
			return;
		}
		Jedis jedis = null;
		try {
			jedis = getJedisClient();
			jedis.del(key);
		} catch (Exception e) {
			jedisPool.returnBrokenResource(jedis);
//			logger.error("操作Redis失败", e);
			System.out.println("错误:[操作Redis失败]");
		} finally {
			close(jedis);
		}
	}
	
	/**
	 * 清除DB
	 * 
	 * @param key
	 */
	public static void flushDB() {
		Jedis jedis = null;
		try {
			jedis = getJedisClient();
			jedis.flushDB();
//			logger.info("Redsi缓存DB重置成功。");
			System.out.println("输出:[Redsi缓存DB重置成功]");
		} catch (Exception e) {
			jedisPool.returnBrokenResource(jedis);
//			logger.error("操作Redis失败", e);
			System.out.println("错误:[操作Redis失败]");
		} finally {
			close(jedis);
		}
	}
	
	
	
    /**
     * Object转换byte[]类型
     * @param object
     * @return
     */
    public static byte[] toBytes(Object object){
        return serialize(object);
    }
	
	
    
    /**
     * 对象转 byte[]
     * @param obj
     * @return
     */
    public static byte[] serialize (Object obj) {
        byte[] bytes = null;     
        ByteArrayOutputStream bos = new ByteArrayOutputStream();     
        try {       
            ObjectOutputStream oos = new ObjectOutputStream(bos);        
            oos.writeObject(obj);       
            oos.flush();        
            bytes = bos.toByteArray ();     
            oos.close();        
            bos.close();       
        } catch (IOException ex) {       
            ex.printStackTrace();  
        }     
        return bytes;   
    }
    
    
	/**
	 * 测试
	 */
	public static void main(String[] args) {
		Jedis jedis = JedisUtil.getJedisClient();
		jedis.set("XC", "1");
		System.out.println(jedis.get("XC"));
		System.out.println(jedis.info());
		JedisUtil.close(jedis);
	}

}


4.   Redis实体类   FRedisModel.java
public class FRedisModel implements Serializable{	
	private String key;
	private String type;
	private Object val;
	private long existtime;
	public FRedisModel(String key, String type, Object val, long existtime) {
		this.key = key;
		this.type = type;
		this.val = val;
		this.existtime = existtime;
	}
	public FRedisModel() {

	}
	get方法
	set方法
}



说明:  JedisUtil.addAggregate(FRedisModel ) 用来存储集合数据的

list :   FRedisModel(String key, "list", Object val, long existtime)
set:   FRedisModel(String key, "set", Object val, long existtime)
map<String,String>:    FRedisModel(String key, "hashStr", Object val, long existtime)
map<String,Object>:  FRedisModel(String key, "hashObj", Object val, long existtime)

注意:存储Map集合,优点特殊,需要区分是对象还是字符串,存储的对象必须是序列化的
   使用方法  JedisUtil.serialize(Obj) 进行序列化

JedisUtil.setString(String key, String value, int timeout)   用来存储普通字符串
JedisUtil.flushDB() 清空Redis所有数据信息

其他方法自己看吧,都有注释的




这里写一些  添加集合数据的示例:
//添加list
List<TestUser> list = new ArrayList<TestUser>();
for(int i=0;i<100;i++){
	list.add(new TestUser("哈哈"+new SimpleDateFormat("HHmmssSS").format(new Date()), new SimpleDateFormat("SS").format(new Date()), new SimpleDateFormat("HHmmssSS").format(new Date())));
}
FRedisModel redisModel_list = new FRedisModel("list_"+UUID.randomUUID().toString(), "list", list, 3600);
JedisUtil.addAggregate(redisModel_list);


//添加对象 Hashmap
Map<byte[], byte[]> hashObj = new HashMap<byte[], byte[]>();
TestUser t1 = new TestUser("落花雨1111"+new SimpleDateFormat("HHmmssSS").format(new Date()), new SimpleDateFormat("SS").format(new Date()), new SimpleDateFormat("HHmmssSS").format(new Date()));
TestUser t2 = new TestUser("落花雨2222"+new SimpleDateFormat("HHmmssSS").format(new Date()), new SimpleDateFormat("SS").format(new Date()), new SimpleDateFormat("HHmmssSS").format(new Date()));
TestUser t3 = new TestUser("落花雨3333"+new SimpleDateFormat("HHmmssSS").format(new Date()), new SimpleDateFormat("SS").format(new Date()), new SimpleDateFormat("HHmmssSS").format(new Date()));
hashObj.put("1111".getBytes(), JedisUtil.serialize(t1));
hashObj.put("2222".getBytes(), JedisUtil.serialize(t2));
hashObj.put("3333".getBytes(), JedisUtil.serialize(t3));
FRedisModel redisModel_mapObj = new FRedisModel("hash_"+UUID.randomUUID().toString(), "hashObj", hashObj, 3600);
JedisUtil.addAggregate(redisModel_mapObj);

//添加字符串  HashMap
Map<String,String> hashStr = new HashMap<String, String>();
hashStr.put("1111", "第一号");
hashStr.put("2222", "第二号");
hashStr.put("3333", "第三号");
FRedisModel redisModel_mapStr = new FRedisModel("hash_"+UUID.randomUUID().toString(), "hashStr", hashStr, 3600);
JedisUtil.addAggregate(redisModel_mapStr);



//添加set
Set<TestUser> set = new HashSet<TestUser>();
TestUser t4 = new TestUser("4444"+new SimpleDateFormat("HHmmssSS").format(new Date()), new SimpleDateFormat("SS").format(new Date()), new SimpleDateFormat("HHmmssSS").format(new Date()));
TestUser t5 = new TestUser("5555"+new SimpleDateFormat("HHmmssSS").format(new Date()), new SimpleDateFormat("SS").format(new Date()), new SimpleDateFormat("HHmmssSS").format(new Date()));
TestUser t6 = new TestUser("6666"+new SimpleDateFormat("HHmmssSS").format(new Date()), new SimpleDateFormat("SS").format(new Date()), new SimpleDateFormat("HHmmssSS").format(new Date()));
set.add(t4);
set.add(t5);
set.add(t6);
FRedisModel redisModelset = new FRedisModel("set_"+UUID.randomUUID().toString(), "set", set, 3600);
JedisUtil.addAggregate(redisModelset);





5. CatchManage.java  用来处理前台的分页查询所有key的请求,以及通过key来查询详细的数据信息,并返回,相当于service功能

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.commons.lang3.StringUtils;
import com.google.gson.Gson;

import redis.clients.jedis.Jedis;

public class CatchManage {
	
	/**
	 * 查询缓存DB中的Key
	 * 
	 * @return
	 */
	public List<FRedisModel> listKeys(int start,int end) {
		Jedis jedis = JedisUtil.getJedisClient();
		Set<String> keySet = jedis.keys("*");
		List<String> keyList = new ArrayList<String>(keySet);
		List<FRedisModel> list = new ArrayList<FRedisModel>();
		for (String key_ : keyList) {
			FRedisModel fredi = new FRedisModel();
			fredi.setKey(key_);
			fredi.setType(jedis.type(key_));
			long ttl_ = jedis.ttl(key_);
			fredi.setExisttime(ttl_);
			list.add(fredi);
		}
		JedisUtil.close(jedis);
		
		int allnum = keyList.size();

		start = Integer.valueOf(start);
//		end = start + Integer.valueOf(end);
		end = end > list.size() ? list.size() : end;
		List<FRedisModel> outList = list.subList(start, end);
		
		return outList;
	}

	/**
	 * 查询缓存DB中的Key   支持分页
	 * @param start
	 * @param end
	 * @return
	 */
	public DataGrid<Map<String, Object>> listKeysPageNation(int start,int end) {
		Jedis jedis = JedisUtil.getJedisClient();
		
		Set<String> keySet = jedis.keys("*");
		List<String> keyList = new ArrayList<String>(keySet);
		List<FRedisModel> list = new ArrayList<FRedisModel>();
		for (String key_ : keyList) {
			FRedisModel fredi = new FRedisModel();
			fredi.setKey(key_);
			fredi.setType(jedis.type(key_));
			long ttl_ = jedis.ttl(key_);
			
			fredi.setExisttime(ttl_);
			list.add(fredi);
		}
		JedisUtil.close(jedis);
		
		
		int allnum = keyList.size();
		start = Integer.valueOf(start);
		end = end > list.size() ? list.size() : end;
		
		//分页显示
		List<FRedisModel> outList = list.subList(start, end);
		
		//包装成DataGrid
		DataGrid<Map<String, Object>> grid = new DataGrid<Map<String, Object>>();

		List<Map<String, Object>> listmap = new ArrayList<Map<String, Object>>();
		for (FRedisModel fRedisModel : outList) {
			Map<String, Object> map = new HashMap<String, Object>();
			map.put("key", fRedisModel.getKey());
			map.put("type", fRedisModel.getType());
			map.put("existtime", fRedisModel.getExisttime());
			listmap.add(map);
		}
		
		grid.setTotal(allnum);
		grid.setRows(listmap);
		
		return grid;
	}
	
	/**
	 * 通过 key 来查找对应的 值 
	 * 
	 * 数据类型   list hashmap set String
	 * @param key_
	 * @return
	 */
	public List<FRedisModel> getValByKey(FRedisModel redisModel) {
		System.out.println("redis将要查找的数据类型:"+redisModel.getType()+"   key:"+redisModel.getKey()+"   存在时间"+redisModel.getExisttime());
		
		List<FRedisModel> outList = new ArrayList<FRedisModel>();
		Jedis jedis = JedisUtil.getJedisClient();
		if (StringUtils.equalsIgnoreCase(redisModel.getType(), "string")) {
			redisModel.setVal(jedis.get(redisModel.getKey()));
			outList.add(redisModel);
		} else if (StringUtils.equalsIgnoreCase(redisModel.getType(), "hash")) {
			Set<String> fieldSet = jedis.hkeys(redisModel.getKey());
			List<String> fiedList = new ArrayList<String>(fieldSet);
			
			System.out.println("fieldSet size:"+fieldSet.size());
			
			for (String value : fiedList){
				System.out.println("value->"+value);
				outList.add(new FRedisModel(redisModel.getKey(), redisModel.getType(), jedis.hget(redisModel.getKey(), value), redisModel.getExisttime()));
			}
		} else if (StringUtils.equalsIgnoreCase(redisModel.getType(), "list")) {
			List valueList = jedis.lrange(redisModel.getKey(), 0, -1);
			for (Object value : valueList) {
				outList.add(new FRedisModel(redisModel.getKey(), redisModel.getType(), value, redisModel.getExisttime()));
			}
		} else if (StringUtils.equalsIgnoreCase(redisModel.getType(), "set")) {
			// 由于API的限制,不能对SET类型进行有效的分页操作。所以随机取出10000条记录返回。
			List valueList = jedis.srandmember(redisModel.getKey(), 10000);
			for (Object value : valueList) {
				outList.add(new FRedisModel(redisModel.getKey(), redisModel.getType(), value, redisModel.getExisttime()));
			}
		}
		JedisUtil.close(jedis);
		return outList;
	}

}
 由于不能泄露 
 代码,所以只写了主要的部分,看懂了这些,其他的controller层应该很好写的。 
 

时间紧,写的比较粗糙,望见谅!










    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值