首页天道酬勤,

,

admin 05-05 19:09 143次浏览

一篇特殊的redis工具类 -- 独此一家、绝无分店

一、引言本博客以redis缓存为中心。 什么是redis缓存? 没有其他的现金吗? 哪些缓存可以提高性能? 这里不介绍! 感兴趣的人请自己去百度看看。

在日常开发中,缓存或多或少地被使用。 用户体验对于提高系统性能、提高用户体验是多么重要; 这不仅需要可靠性、安全性、可扩展性、可维护性等指标,还需要注重用户体验来设计软件。 用户体验分为多个方面,但对用户操作的响应速度非常重要。 要提高用户访问的响应速度,这是体系结构设计中必须解决的问题。 说到提高服务的响应速度,不得不说是缓存;

在系统级别,CPU速度远远高于磁盘I/o速度; 因此,为了提高响应速度,必须减少磁盘I/o操作,但数据库中存在很多信息,每次查询数据库时都是I/o操作。请求响应时间等于网络响应时间和服务器响应时间; 网络是无法控制的。 服务器的响应时间包括CPU计算时间和磁盘IO时间。 其中,CPU计算时间由硬件资源决定。 尽量降低算法的复杂性来减少它。 磁盘IO时间,这个时间非常慢,应该尽量减少。

客户端调用某个接口获取信息时,执行顺序为1、2、3、4; 由于信息存储在数据库中,因此2、3中有一次磁盘I/o操作; 虽然这看起来像一个非常简单的业务逻辑,但个性发卡进行体系结构设计时,必须考虑最坏的场景。 或者,如果成千上万的用户经常调用这个界面,就必须考虑该如何应对。 使用如上图所示的体系结构处理时,这个看起来像简单业务的接口会使整个系统变慢,无法长时间响应用户的请求。 这样的问题怎么解决,这个时候现金应该出现;

缓存有多种类型和策略。 这里不一一讨论,只是这个博客是关于的工具类! 总之,为了提高系统的性能,使用尽可能少的IO操作,特别是磁盘IO操作的缓存可以有效地避免这种情况。 因此,在体系结构设计过程中,如果涉及到对数据库的查询,则需要考虑是否使用缓存技术来提高系统性能和减轻数据库压力。

二、无知之痛(以get/set方式使用redis ) :根据需求设计业务时,如购物车)涉及添加、查询、修改、删除。 如果不详细说明这四个具体实现时间,会不会是添加、删除、更改和调查简单的对数据库? 但是,当成千上万的用户频繁访问的时候,简单的事情在高并发的情况下就会变的不简单!此时,需要一些东西来代替数据库。 而且,比数据库更快支持可能发生的高并发性。 因此,我们考虑了缓存作为key/value存在,很多开发者自然地使用set/get方式来使用redis,但实际上这并不是最佳的使用方法。 redis中的所有数据都必须存储在内存中,尤其是在未启用虚拟机的情况下,节约内存尤为重要。 如果一个key-value单元最小需要占用512个字节,则即使仅存储一个字节,也将占用512字节。 (例如,对于set/get,一个密钥值对应于一个数据。 此时,有可以将key复用,将几个key-value作为一个大value、将大value作为另一个value、set存储在一个key中的设计模式。 这样,相同的512字节将达到存放10-100倍的容量。 为了节省内存,建议使用散列类型而不是set/get来使用redis。

三.混列式使用redis-- -在指定返回类型的日常开发中,将业务中的所有特性封装在一个对象中,并将该对象存储在redis缓存中。 使用redis时,通常将redis的常用方法封装在一个工具类中。 然后,调用工具类的方法,并将寄存的对象传递给方法。 常规方法是将对象转换为字符串并存储在缓存中,根据需要检索字符串,然后将其转换为对象! 大多数情况是这样的,但在我的实际开发中,传递了与业务相关的对象,返回的是object对象(与业务没有半价关系)。我想要让返回的对象和业务有关,还得强转一下!这返回的是单个对象,如果是个list呢?循环强转吗?那如果是map呢?当然应该可以全部转动,但这样会增加实际业务中的代码量! 我认为增加一行与业务无关的代码是罪过,即使这是为了与业务相关,我想要的是 我给你存的是啥!返回的就是啥!别整那些没用的......

1 .根据key和fieid返回hash指定存储位置的值,指定返回类型/** *返回hash指定存储位置的值* @ param key * @ paramfieid * @ param obj * @ paramt * @

{ logger.info("hget >> key+fieid:{}",key +"+"+ fieid); jedis = jedisPool.getResource(); String hget = jedis.hget(key, fieid); ObjectMapper om = new ObjectMapper(); T t =(T) om.readValue(hget, obj.getClass()); return t; } catch (Exception e) { logger.error("Jedis hget 异常: " + e.getMessage()); return null; } finally { closeRedis(jedis); } }

调用:

//调用hget方法DemoDTO demoDTO = jedis.hget("key", "fieid", new DemoDTO());

 

2.hvals()方法,获取hash中value的集合,指定返回的集合类型 /** * 获取hash中value的集合,指定返回的集合类型 * @param key * @param obj * @param <T> * @return */ public<T> List<T> hvals(String key,T obj) { Jedis jedis = null; try { logger.info("hvals >> key:{}",key); jedis = jedisPool.getResource(); List<String> hvals = jedis.hvals(key); Iterator<String> iterator = hvals.iterator(); List<T> returnList = new ArrayList<>(); ObjectMapper om = new ObjectMapper(); while (iterator.hasNext()) { String next = iterator.next(); T t =(T) om.readValue(next, obj.getClass()); returnList.add(t); } return returnList; } catch (Exception e) { logger.error("Jedis hvals fail >> e:{}",e.getMessage()); return null; } finally { closeRedis(jedis); } }

调用:

//调用hvals方法List<DemoDTO> demoListDTOS = jedis.hvals("key", new DemoDTO());   3.以Map的形式返回hash中的存储和值,指定map中的value类型 /** * 以Map的形式返回hash中的存储和值 * @param key * @param obj * @param <T> * @return */ public<T> Map<String,T> hgetAll(String key,T obj) { Jedis jedis = null; try { logger.info("hget >> key+obj:{}",key+"+"+obj); jedis = jedisPool.getResource(); Map<String, String> map = jedis.hgetAll(key); Map<String, T> returnMap = new HashMap<>(); ObjectMapper om = new ObjectMapper(); for (Map.Entry<String, String> e : map.entrySet()) { T t =(T) om.readValue(e.getValue(), obj.getClass()); returnMap.put(e.getKey(),t); } return returnMap; } catch (Exception e) { logger.error("Jedis hget fail >> e:{}" + e.getMessage()); return null; } finally { closeRedis(jedis); } }

调用:

//调用hgetAll方法Map<String,DemoDTO> stringDemoDTOMap = jedis.hgetAll("key", new DemoDTO());   4.关闭jedis连接,将jedis连接归还redis连接池 /** * 关闭jedis连接池 * @param jedis */ private void closeRedis(Jedis jedis) { if (jedis != null){ try{ jedis.close(); }catch (Exception e){ logger.error("Jedis关闭异常" + e.getMessage()); } } }

closeRedis 释放资源 防止达到最大连接数出现异常 如 :maxTotal=300

如果每次获取完redis连接,不归还redis连接池的话,当超过redis的最大连接数。然后redis就雪崩了!注意!注意!!!

 

四、结尾

其实指定redis返回类型,没什么高大上的!就是用了ObjectMapper类,这个类是Jackson库的主要类。但是,我百度查过网上很多关于redis的连接工具类,发现却没有一个做过这方面的处理!其实这个也不难,在写业务的时候随手就能写出来。我也就是在用redis的时候偶尔蹦出来了这个想法,每次都要 多那么两三行与业务无关的代码让人非常的抓狂!

 

End...

转载于:https://my.oschina.net/qcxdld/blog/1920413

UGUI实现ScrollView无限滚动效果【Java 框架学习】自学笔记(更新至 类与对象)php如何将日期转为天数iOS实现电商购物车界面示例共享带宽 基础网络 UNetRedis7.0部署集群怎么实现
redis界面工具,redis客户端工具有哪些 redis使用教程,redis工具类封装
相关内容