Redis在线管理篇
来源:互联网 发布:4g移动网络接入点设置 编辑:程序博客网 时间:2024/06/05 16:21
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.1redis_port=6379redis_pwd=123456redis_maxTotal=200redis_maxIdle=50redis_minIdle=10redis_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所有数据信息
其他方法自己看吧,都有注释的
这里写一些 添加集合数据的示例:
//添加listList<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);//添加对象 HashmapMap<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);//添加字符串 HashMapMap<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);//添加setSet<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);//包装成DataGridDataGrid<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
- Redis在线管理篇
- 在线管理
- Redis在线用户设计
- Linux 在线安装 Redis
- Redis管理
- Redis管理
- Redis --- 管理
- 在线日志管理
- 在线登陆用户管理
- tomcat7.0在线管理
- 在线项目管理平台
- 【应用】在线文件管理
- 文档在线管理
- 【Linux】管理在线用户
- 在线文档管理系统
- SM04在线用户管理
- 在线License管理系统
- redis统计APP在线人数
- 梁贿郊的兼职选择方法一定行的通吗
- 深刻理解Linux进程间通信(IPC)
- JS实现密码加密
- 解决输出字典/数组 打印编码问题
- Can't create handler inside thread that has not called Looper.prepare()
- Redis在线管理篇
- 修改UITableViewStyleGrouped形式的tableview的背景色 此博文包含图片(2013-09-10 11:11:57)转载▼ 分类: IOS笔记 在使用UITable
- 动态规划延伸 背包问题
- hdu1023 Train Problem II 卡特兰数
- Oracle数据库索引失效
- git操作基础:删除文件夹
- Oracle数据库解決因为for update未提交断掉导致锁表的问题
- 字体图标--Font Awesome
- cocos2dx 场景切换注意的问题