优化redis 分页(二)

来源:互联网 发布:彩通网络小额贷款牌照 编辑:程序博客网 时间:2024/06/05 09:25

这篇文章是将redis 的分页封装好了的

看之前要先对整个存储结构有一个清晰的概念 看懂:http://blog.csdn.net/qq_27292113/article/details/51926891 的图


package redis.test;import java.util.ArrayList;import java.util.Date;import java.util.HashMap;import java.util.List;import java.util.Map;import redis.clients.jedis.Jedis;import redis.util.RedisUtil;public class redisTest { //redis ids集合的 的key名称public staticString KEYIDS= "IDS";// redis 对象的 的key名称  "SYS:BILL:"+"id"  获取单个对象public staticString OBJECTKEYID= "OBJECT:";// list 的主键名称public staticString MAJORKEY="id";//num 当前页数public staticLong num = 1l;//pageCount 每页条数public staticLong pageCount = 10l;//所有缓存3天后失效public static void main(String[] args) {//写入数据setDateBase();//读取列表数据readDateBase(num,pageCount);//读取数据单个对象readObjectDateBase("0");}/** * 读取数据 */private static void readDateBase(Long num,Long pageCount) {//获取redis对象Jedis jedis = new Jedis("localhost");try {List<Map<String, String>> findPagedQuery = RedisUtil.findPagedQuery(KEYIDS, OBJECTKEYID, num, pageCount, jedis);if (findPagedQuery!=null && findPagedQuery.size()>0) {System.out.println("查询到当前的数据记录:");for (Map<String, String> map : findPagedQuery) {System.out.println(map.toString());}}else{System.out.println("当前页数据为空");}} catch (Exception e) {e.printStackTrace();}finally{jedis.close();}}/** * 读取数据单个对象 */private static void readObjectDateBase(String key) {key= OBJECTKEYID+key;//获取redis对象Jedis jedis = new Jedis("localhost");try { Map<String, String> hgetAll = jedis.hgetAll(key); System.out.println("查询id为:"+key+"的对象结果:"); System.out.println(hgetAll.toString());} catch (Exception e) {e.printStackTrace();}finally{jedis.close();}}/** * 存入数据源 */public static void setDateBase(){Jedis jedis = new Jedis("localhost");List<Map<String, Object>> list =new ArrayList<Map<String,Object>>();Date d= new Date();for (int i = 0; i < 20; i++) {Map<String, Object> map =new HashMap<String, Object>();map.put(MAJORKEY, i);map.put("name", "雄"+i);map.put("createDate", d);list.add(map);}try {RedisUtil.setCacheObjectInfo(list, KEYIDS, OBJECTKEYID, MAJORKEY, jedis);System.out.println("写入数据成功!");} catch (Exception e) {e.printStackTrace();}finally{jedis.close();}}    }


package redis.util;import java.util.ArrayList;import java.util.Date;import java.util.HashMap;import java.util.List;import java.util.Map;import redis.clients.jedis.Jedis;import redis.clients.jedis.Pipeline;import redis.clients.jedis.Response;public class RedisUtil {//缓存时间public static final Integer SECONDS=3*60*60*24; /** * 查询缓存中的数据 * @param jedis * @param keyIds        id集合的key值 * @param objectKeyId   对象key值的SYS:BILL:前缀  如:"SYS:BILL:"+订单号 * @param num 当前页数 * @param pageCount  每页条数 * @return */public static  List<Map<String, String>> findPagedQuery(String keyIds, String objectKeyId, Long num, Long pageCount,Jedis jedis) {List<Map<String, String>> list = new ArrayList<Map<String, String>>(); //获取管道对象Pipeline pipeline = jedis.pipelined();// 开始记录数Long startCount = (num - 1) * pageCount;List<String> lrange = jedis.lrange(keyIds, startCount, startCount + pageCount - 1);if (startCount.intValue() != 0 && lrange.size() != pageCount) {// 当缓存中数据不够时直接返回空return null;}// 使用pipeline 批量获取数据Map<String, Response<Map<String, String>>> responses = new HashMap<String, Response<Map<String, String>>>();for (String key : lrange) {String objectKey = objectKeyId + key;responses.put(key, pipeline.hgetAll(objectKey));}// 同步数据pipeline.sync();for (String key : responses.keySet()) {Map<String, String> map = new HashMap<String, String>();// 获取订单对象map = responses.get(key).get();list.add(map);}return list;}/** * 存入对象数据 * @param list * @param keyIds     redis ids集合的 的key名称 * @param objectKeyId  redis 对象的 的key名称 * @param majorKey   list 的主键名称 */public static void setCacheObjectInfo(List<Map<String, Object>> list,String keyIds,String objectKeyId,String majorKey, Jedis jedis) { //获取管道对象Pipeline pipeline = jedis.pipelined();jedis.del(keyIds);for (Map<String, Object> object : list) {//存储 对象 信息pipeline.rpush(keyIds, object.get(majorKey).toString());//获取封装好的对象数据Map<String, String> billMap = getEncapsulationObject(object);String key=objectKeyId+object.get(majorKey);pipeline.hmset(key, billMap);pipeline.expire(key, SECONDS);}pipeline.expire(keyIds, SECONDS);pipeline.sync();}/** * 将数据转换成字符串 * @param object * @return */public static Map<String, String> getEncapsulationObject(Map<String, Object> object){Map<String, String> billMap = new HashMap<String, String>();for(String key:object.keySet()){billMap.put(key,convertString(object.get(key)));}return billMap;}/** * 转换对象 * 当对象是一个时间类型 转成时间戳 * 其他类型都为字符串 * @param object * @return */public static String convertString(Object object){Object obj=object;if(obj == null){return "";} else if(obj instanceof Date){obj = ((Date)obj).getTime();return obj.toString();}if(isBlank(obj.toString())){return "";}   return obj.toString();}/** * 判断字符串是否为空 * @param str * @return */public static boolean isBlank(String str){if( str == null || str.length() == 0 )return true;return false;}}

后续扩展有空时再补充。


0 0
原创粉丝点击