SSM框架详解6

所需积分/C币:1 2019-01-05 11:36:16 72.75MB PDF

SSM框架详解,适合初学者看的一本书籍七部分第六部分,
第17章 Redis概述 17.3.1在Java程序中使用 Redis 在Java中使用 Redis工具,要先下载 jedis. Jar包,把它加载到工程的路径中,所以首 先打开网站htt/mvnrepository.com/artifact/redisclients/jedis,如图179所示。 月结上用四(入是,日 MVNREOSTTORY Alerts/Year bome.. chants. jedis Jedis is a blazingly small and sane Redis java client License Popular categories laus Hs9on、加 Aay四 chanan C Mot intarested O Bep Command Line varner Cache Implemertatcn version 2.9290 reease 2016 212 2Bx(281 0Ma32016) Date and Time w) 63 release .2015 治5 aa Databa当 HimL Proen (Agx2015) 们TPCt DeC Tens. on M3r2015) 图17-9下载 jedis. jar 把它导入工程路径就可以使用了,可以使用代码清单17-1进行测试。 代码清单17-1:Java连接Reds Jedis jedis= new Jedis("localhost,6379);//E Redis //edis.auth(" password");//如果需密码 inti=0;//记录操作次数 try 1 ong start= System. currentrimeMi11is()://开始毫秒数 while(true) long end= System. currentTimeMillis()i if(end- start>=1000){//当大于等于1000毫秒(相当于1秒)时,结束操作 break: 1+十 jedis set("test"+ i, i + "" }fina1ly{//关闭连接 jedis close()i System,out, println(" redis每秒操作:"+1+"次");//打印1秒内对 Redis的操作次 数 这段代码主要在于测试 Redis的写入性能,这是笔者使用自己电脑(使用 Windows操 作系统)测试的结果。 487 Java ee互联网轻量级框架整合开发—SsM框架( Spring MVc+ Spring+ My Batis)和Reds实现 redis每秒操作:23308次 这里每秒只操作了2万多次,而事实上 Redis的速度比这个操作速度快得多,这里慢 是因为我们只是一条条地将命令发送给 Redis去执行。如果使用流水线技术它会快得多, 将可以达到10万次每秒的操作,十分有利于系统性能的提高。注意,这只是一个简单的连 接,更多的时候我们会使用连接池去管理它。 Java Redis的连接池提供了类 redis clients. jedis. JedisPool用来创建 Redis连接池对象。使用这个对象,需要使用类 redisclients. jedis. JedisPoolConfig对连接池进行配置,如代码清单17-2所示。 代码清单17-2:使用 Redis连接池 JedisPoolConfig poolCfg= new JedisPoolConfig(); //最大空闲数 poolCfg. setMaxIdle(50)i //最大连接数 poolCfg. setMaxTotal(100); //最大等待毫秒数 poolCfg. setMaxWaitMillis(20000); //使用配置创建连接池 JedisPool pool= new JedisPool (poolCfg, "localhost")i //从连接池中获取单个连接 Jedis jedis= pool. getResource()i //如果需密码 //jedis auth("password"); 读者可以从代码中的注释了解每一步骤的含义。使用连接池可以有效管理连接资源的 分配 由于 Redis只能提供基于字符串型的操作,而在Java中使用的却以类对象为主,所以 需要 Redis存储的字符串和Java对象相互转换。如果自己编写这些规则,工作量还是比较 大的,比如一个角色对象,我们没有办法直接把对象存入 Redis中,需要进一步进行转换, 所以对操作对象而言,使用Reis还是比较难的。好在 Spring对这些进行了封装和支持, 它提供了序列化的设计框架和一些序列化的类,使用后它可以通过序列化把Java对象转换, 使得 Redis能把它存储起来,并且在读取的时候,再把由序列化过的字符串转化为Java对 象,这样在Java环境中使用 Redis就更加简单了,所以更多的时候可以使用 Spring提供的 RedisTemplate的机制来使用 Redis 1732在 Spring中使用Reds 17.3.1节介绍了在没有封装情况下使用 Java API的缺点,需要自己编写规则把Jaa 对象和 Redis的字符串进行相互转换,而在 Spring中这些问题都可以轻松处理。在 Spring 中使用 Redis,除了需要 jedis. jar外,还需要下载 spring- data-redisjar,打开网址 htt: mvnrepository. com/artifact/org. Springframework data/ /spring-data- redis,就能够看到这样 488 第17章Reds概述 的页面,如图17-10所示。 警c 常访公火直方站有磁手上是某用网址回C入 moats-天 lilacs/Year Home. org springframework data spring-datared Spring Data Redis spring Data Redes Applican Marnes Child yoals tecopa Libran Command une Parser Type guyuan Laras 1.7.0.RBEASE release (Ap 2016) relesse 16、2LE DEc,2015 d0LDa1后x 6G. FELEASE se2015 yo Unties A2 RELFAINE release 3成2015) DBC Extenso 15x1510EA班 xn.2015 abBc pools 0,阳EAE 0MM2015) A卸 cananor, ISCH Laris L144RELEASE JM Languag :MB,.RELRSE n2015 1A4x14.2.阳ELEA9E an.2015 Logging Bex的 releas看 o试,2014) 图17-10下载 spring-data-redis jar 这里值得注意的是jar包和 Spring版本兼容的问题,笔者使用的jar包版本是1.72,而 Spring的版本是432,如果使用其他的版本可能存在不兼容的问题,从而产生异常,这是 笔者从实际操作得来的经验。 把下载的jar包导入到工程环境中,这样就可以在使用 Spring提供的 Redis Template操 作 Redis了,只是在使用前,需要对 Spring提供的方案进行探讨,以便更好地使用它们。 附录D中阐述了关于 Spring Data Redis项目的主要内容,读者需要对此项目有一定的了解 才能更好地理解如何使用 Spring操作 Redis 在大部分情况下我们都会用到连接池,于是先用 Spring配置一个 JedisPoolConfig对象, 这个配置相对而言比较简单,如代码清单17-3所示。 代码清单17-3:使用 Spring配置 Jedis PoolConfig对象 <bean id="poolConfig" class="redis. clients. jedis. JedisPoolConfig"> <!--最大空闲数--> <property name=maxIdle" value="50"/> <!--最大连接数 <property name="maxTotal"value=100"/> <!--最大等待时间--> <property name=maxWaitMillis" value=20000/> </bean> 这样就设置了一个连接池的配置,继续往下配置。 在使用 Spring提供的 RedisTemplate之前需要配置 Spring所提供的连接工厂,在 Spring Data Redis方案中它提供了4种工厂模型。 489 Java ee互联网轻量级框架整合开发—SSM框架( Spring Mvc+ Spring+ My Batis)和Res实现 Redis Connection Factory Jedis Connection Factory Lettuce Connection Factory SrpConnection Factory 虽然使用哪种实现工厂都是可以的,但是要根据环境进行测试,以验证使用哪个方案 的性能是最佳的。无论如何它们都是接口 Redis Connection Factory的实现类,更多的时候我 们都是通过接口定义去理解它们,所以它们是具有接口适用性特性的。本书将以使用最为 广泛的 Jedis connection Factory为例进行讲解。 例如,在 Spring中配置一个 JedisConnection Factory对象,如代码清单17-4所示。 代码清单17-4:配置 Jedis Connection Factory <bean id=connectionFactory" class=org. springframework data redis connection jedis. JedisConnectionFa ctory> <property name=hostName" value="localhost"/> <property name=port" value="6379"/> <!--<property name="password" value="paasword"/>--> <property name="poolConfig ref="poolConfig"/> </bean> 解释一下它的属性配置。 hostName,代表的是服务器,默认值是 localhost,所以如果是本机可以不配置它。 port,代表的是接口端口,默认值是6379,所以可以使用默认的 Redis端口,也可 以不配置它。 · password,代表的是密码,在需要密码连接 Redis的场合需要配置它。 poolConfig,是连接池配置对象,可以设置连接池的属性。 这样就完成了一个 Redis连接工厂的配置。这里配置的是 Jedis Connection Factory,如 果需要的是 Lettuce Connection Factory,可以把代码清单17-3中的Bean元素的 class属性修 改为org. springframework data redis connection. lettuce. Lettuce Connection Factor即可,这取 决于项目的需要和特殊性。有了 Redis Connection Factory工厂,就可以使用 RedisTemplate 普通的连接使用没有办法把Java对象直接存入 Redis,而需要我们自己提供方案,这 时往往就是将对象序列化,然后使用 Redis进行存储,而取回序列化的内容后,在通过转 换转变为Java对象, Spring模板中提供了封装的方案,在它内部提供了 Redis Serializer接 口(org. springframework data redis serializer Redis Serializer)和一些实现类,其原理如图17-11 所示。 可以选择 Spring提供的方案去处理序列化,当然也可以去实现在 spring data redis中定 义的 Redis serializer接口,在 Spring中提供了以下几种实现 Redis serializer接口的序列化器。 GenericJackson2 eJson Redis serializer,通用的使用Json2jar的包,将 Redis对象的序 列化器。 490 第17章Reds概述 key和 value Jackson, String等序列化器 Java对象 Redisserializer Redis Java Application 图17- Spring序列化器 Jackson2 Ison Redis serializer<T>,通过 Jackson2jar包提供的序列化进行转换。 JaeksenJsenRedisSerializer→,通过 jackson. jar包进行序列化,由于版本太旧, Spring 不推荐使用。 Jdk Serialization RedisSerializer<T>,使用JDK的序列化器进行转化。 Oxm Serializer,使用 Spring O/X对象 Object和XML相互转换。 StringRedisSerializer,使用字符串进行序列化。 Generic ToString Serializer,通过通用的字符串序列化进行相互转换。 使用它们就能够帮助我们把对象通过序列化存储到 Redis中,也可以把 Redis存储的内 容转换为Java对象,为此 Spring提供的 RedisTemplate还有两个属性。 ● key Serializer-键序列器。 · valueSerializer值序列器。 有了上面的了解,就可以配置 RedisTemplate了。假设选用 String Redis serializer作为 Reds的key的序列化器,而使用 Jdk Serialization Redis serializer作为其 value的序列化器, 则可以按照代码清单17-5的方法来配置 Redis Template 代码清单17-5:配置 Spring Redis Template <bean id="3akSerializationRedisserializer" class="org. springframework data redis serializer JdkSerializationRedisSerializer"/> <bean id="stringRedisserializer class="org. springframework data redis serializer. StringRedisSerializer"/ <bean id="redisTemplate class=org. springframework data. redis core RedisTemplate"> <property name="connectionFactory" ref=connectionFactory"/> <property name="keySerializer" ref="stringRedisserializer"/> <property name="value Serializer" ref="jdkserializationRedisSerializer"/> </bean> 这样就配置了一个 Redis Template的对象,并且 spring data redis知道会用对应的序列化 器去转换 Redis的键值。 举个例子,新建一个角色对象,使用 Redis保存它的对象,如代码清单17-6所示。 491 Java ee互联网轻量级框架整合开发—SSM框架( Spring MVC+ Spring+ My Batis和Reds实现 代码清单17-6:使用Reds保存角色类对象 package com.learn, ssm chapter17. pojo; Import java. io Serializable; *注意,对象要可序列化,需要实现 Seria1izab1e接口,往往要重写 serialversionUID public class Role implements Serializable private static final long serialVersionUID =6977402643848374753L private long id i private String roleName; private String note /**setter and getter**/ 因为要序列化对象,所以需要实现 Serializable接口,表明它能够序列化,而 serial VersionUID代表的是序列化的版本编号。 假设在 application Context. xml中配置了代码清单17-3至17-5的配置,那么就可以测试 保存这个Role对象了,测试代码如代码清单17-7所示。 代码清单17-7:使用 Redis Template保存Role对象 ApplicationContext applicationContext new ClassPathXmlApplicationContext("applicationContext. xml")i RedisTemplate redisTemplate applicationContext. getBean(RedisTemplate. class) Role role new Role(); role. setId(ll); role. setRoleName("role name 1") role. setNote("note 1")i redisTemplate. opsForvalue(). set("role 1", role)i Role role =(role) redisTemplate opsForvalue().get("role 1"); System. out. printin(rolel getRoleName(); 在 System. out. printIn( (roll. getRoleNameo);这行打下断点,可以看到如图1712所示的 测试结果。 显然这里已经成功保存和获取了一个Java对象,这段代码演示的是如何使用 StringRedis Serializer序列化 Redis的key,而使用 Jdk Serialization Redis serializer序列化 Redis 的 value,当然也可以根据需要去选择,甚至是自定义序列化器。 注意,以上的使用都是基于 Redis Template、基于连接池的操作,换句话说,并不能保 证每次使用 RedisTemplate是操作同一个对 Redis的连接,比如代码清单17-7中的下面两行 代码。 redisTemplate. opsForvalue(). set("role 1", role) Role rolel=(Role) redisTemplate opsForvalue(). get("role 1")i 492 第17章 Redis概述 publie static void testRedis() 知: Role role a nev RoleO) ole, getId(L) role,stRo1Hane(“oln1”) role. setNotegnetm1): edisTexplate. opsFor VaLue (. set(role I, role) i System. err printIn(role. setRoleName O)is 1 arm ssn test. Te递n)命ttBd HP服务品施视暴聚量×1“点 幅入新视 His spplieatiencontaxt ClassPathalApplicationComtex radistamplata RedisTenplate ain3Ral电 Ld ③xal String 图17-12写入和读取序列化对象数据 set和get方法看起来很简单,它可能就来自于同一个 Redis连接池的不同 Redis的连接。 为了使得所有的操作都来自于同一个连接,可以使用 Session callback或者 Redis callback这 两个接口,而 Rediscallback是比较底层的封装,其使用不是很友好,所以更多的时候会使 用 Session callback这个接口,通过这个接口就可以把多个命令放入到同一个 Redis连接中 去执行,如代码清单178所示,它主要是实现了代码清单17-7中的功能。 代码清单17-8:使用 Session callback接口 ApplicationContext applicationContext new ClassPathXmlApplicationContext("applicationContext. xml)i RedisTemplate redisTemplate pplicationContext. getBean(RedisTemplate class)i Role role new Role()i role. setId (l)i role. setRoleName("role name 1 )i role. setNote("role note 1")i SessionCallback callBack new SessionCallback<Role>()i @Override public Role execute(RedisOperations ops) throws DataAccessException i ops. boundvalueOps("role 1).set(role)i return (Role) ops. boundvalueOps("role 1").get()i }; Role savedrole =(Role)redisTemplate execute(callBack)i System. out. println(savedRole getId())i 这样set和get命令就能够保证在同一个连接池的同一个 Redis连接进行操作,这里向 读者展示的是使用匿名类的形式,而事实上如果采用Java8的JDK版本,也可以使用 Lambda表达式进行编写 Session callback的业务逻辑,这样逻辑会更为清晰明了。由于前后 使用的都是同一个连接,因此对于资源损耗就比较小,在使用 Redis操作多个命令或者使 用事务时也会常常用到它 493 Java ee互联网轻量级框架整合开发—sM框架( Spring MVc+ Spring+ My Batis)和 Redis实现 更多关于 spring data redis项目的信息,请参阅附录D,在后面使用到 Spring操作Redi 的时候,需要对 spring data redis项目有进一步了解。 174简介 Redis的6种数据类型 Redis是一种基于内存的数据库,并且提供一定的持久化功能,它是一种键值 (key- value)数据库,使用key作为索引找到当前缓存的数据,并且返回给程序调用者。当 前的 Redis支持6种数据类型,它们分别是字符串( String)、列表(List)、集合(set)、哈 希结构(hash)、有序集合(zset)和基数( HyperLogLog)。使用 Redis编程要熟悉这6种 数据类型,并且了解它们常用的命令。 Redis定义的这6种数据类型是十分有用的,它除了 提供简单的存储功能,还能对存储的数据进行一些计算,比如字符串可以支持浮点数的自 增、自减、字符求子串,集合求交集、并集,有序集合进行排序等,所以使用它们有利于 对一些不太大的数据集合进行快速计算,简化编程,同时它也比数据库要快得多,所以它 们对系统性能的提升十分有意义。 表17-1列出了关于 Redis的6种数据类型的基本描述。 表17-1 Redis的6种数据类型说明 数据类型 数据类型存储的值 说明 可以对字符串进行操作,比如增加字符或者求子串; STRING(字符串) 可以是保存字符串、整数和浮点数 如果是整数或者浮点数,可以实现计算,比如自增等 Redis支持从链表的两端插入或者弹出节点,或者通 LIST(列表) 它是一个链表,它的每一个节点都包 过偏移对它进行裁剪;还可以读取一个或者多个节点, 含一个字符串 根据条件删除或者查找节点等 它是一个收集器,但是是无序的,在可以新增、读取、删除单个元素:检测一个元素是否 SET(集合) 它里面每一个元素都是一个字符串,而在集合中;计算它和其他集合的交集、并集和差集等; 且是独一无二,各不相同的 随机从集合中读取元素 它类似于Java语言中的Mp,是一个可以增、删、查、改单个键值对,也可以获取所有的 HASH(哈希散列表) 键值对应的无序列表 键值对 它是一个有序的集合,可以包含字符 zSET(有序集合)串、整数、浮点数、分值(sore,元素 可以增、删、查、改元素,根据分值的范围或者成员 来获取对应的元素 的排序是依据分值的大小来决定的 它的作用是计算重复的值,以确定存 HyperLogLog(基数) 只提供基数的运算,不提供返回的功能 储的数量 这个表格粗略描述了 Redis的6种数据类型,并简要说明了它们的作用,未来我们还 会详细介绍它们的数据结构和常用 Redis命令。此外, Redis还支持一些事务、发布订阅消 息模式、主从复制、持久化等作为Java开发人员需要知道的功能。 494

...展开详情
试读 100P SSM框架详解6
上传资源赚积分,得勋章
    最新推荐
    SSM框架详解6 1积分/C币 立即下载
    1/100
    SSM框架详解6第1页
    SSM框架详解6第2页
    SSM框架详解6第3页
    SSM框架详解6第4页
    SSM框架详解6第5页
    SSM框架详解6第6页
    SSM框架详解6第7页
    SSM框架详解6第8页
    SSM框架详解6第9页
    SSM框架详解6第10页
    SSM框架详解6第11页
    SSM框架详解6第12页
    SSM框架详解6第13页
    SSM框架详解6第14页
    SSM框架详解6第15页
    SSM框架详解6第16页
    SSM框架详解6第17页
    SSM框架详解6第18页
    SSM框架详解6第19页
    SSM框架详解6第20页

    试读已结束,剩余80页未读...

    1积分/C币 立即下载 >