搜档网
当前位置:搜档网 › springMVC整合jedis-redis-以注解形式使用

springMVC整合jedis-redis-以注解形式使用

springMVC整合jedis-redis-以注解形式使用
springMVC整合jedis-redis-以注解形式使用

springMVC整合jedis+redis,以注解形式使用

前两天写过springMVC+memcached的整合,我从这个基础上改造一下,把redis 和springmvc整合到一起。

和memcached一样,redis也有java专用的客户端,官网推荐使用的是:jedis。

看了一部分资料,大家推荐使用 spring-data-redis (spring在jedis的基础上又包装了一层),但是实际中感觉写起来有点麻烦,不如原生态的jedis好用。

所以我利用spring的构造注入做了一个springmvc整合jedis的例子。

先了解下redis吧,这些资料袋都是从网上看到的:

Redis使用c语言编写,面向“键/值”对类型数据的分布式NoSql数据库系统。目前提供五中数据类型

string(字符串)

list(链表)

Hash(哈希)

set(集合)

zset(sorted set 有序集合),有2中编码类型:ziplist,skiplist,当zset 中数据较多时,将会被重构为skiplist。

默认端口6379

redis-server.exe:服务端

redis-check-dump.exe:本地数据库检查

redis-check-aof.exe:更新日志检查

redis-benchmark.exe:性能测试,用以模拟同时由N个客户端发送M个

SETs/GETs 查询.

redis-cli.exe:这个是客户端,服务端开启后,客户端就可以输入各种命令测试了

先写一个Test类,测一下redis的基本数据类型和jedis的一些常用方法。以下的测试方法也都是从网上看到的,只不过为了验证是否准确以及jar包版本的问题,我自己亲自敲了一遍。

注意jedis是redis的一个客户端,是个jar包,不要搞混了……

public class Test {

public static void main(String[] args) {

// Jedis js = new Jedis("127.0.0.1", 6379);

// js.set("key001", "redis001");

// String val = js.get("key001");

// System.out.println(val);

// js.del("key001");

/**************************测试Redis的数据类型

**************************/

/**

* list

*/

// js.rpush("list1", "aaaaaaaaaaaaaaaaaaaaaa"); // js.rpush("list1", "bbbbbbbbbbbbbbbbbbbbbb"); // js.rpush("list1", "ccccccccccccccccccccc");

// js.rpush("list1", "dddddddddddddd");

// List vals = js.lrange("list1", 0, -1); // for (int i = 0; i < vals.size(); i++) {

// System.out.println(vals.get(i));

// }

/**

* set 无须唯一

*/

// js.sadd("s1", "顺序3");

// js.sadd("s1", "a");

// js.sadd("s1", "b");

// js.sadd("s1", "1");

// js.sadd("s1", "蛤蛤蛤");

// js.sadd("s1", "2");

// js.sadd("s1", "so waht?");

// js.sadd("s1", "%^");

// js.sadd("s1", "顺序1");

// js.sadd("s1", "乱码吗?");

// js.sadd("s1", "顺序2");

// Set s = js.smembers("s1");

// for (String string : s) {

// System.out.println(s);

// }

// js.srem("s1", "蛤蛤蛤");

/**

* zset(sorted set 有序集合)

* 有2中编码类型:ziplist,skiplist,当zset中数据较多时,将会被重构为skiplist

*/

// js.zadd("zs", 92, "张三1");

// js.zadd("zs", 93, "张三7");

// js.zadd("zs", 94, "张三5");

// js.zadd("zs", 87, "张三9");

// js.zadd("zs", 66, "张三");

// js.zadd("zs", 19, "张三0");

// Set sets = js.zrange("zs", 0, -1);

// for (String string : sets) {

// System.out.println(sets);

// }

/**

* Hash

*/

// Map m = new HashMap();

// m.put("1", "t");

// m.put("2", "ttt");

// m.put("username", "老王");

// m.put("password", "123456");

// m.put("age", "79");

// m.put("sex", "man");

// js.hmset("m", m);

// List v = js.hmget("m", new

String[]{"username","age"});

// List v1 = js.hmget("m", "sex");

// System.out.println(v);

// System.out.println(v1);

// js.hdel("m", "username");//删除map中的某一个键的键值对

/**************************事务控制**************************/ /**

* 事务方式(Transactions)

* 他主要目的是保障,一个client发起的事务中的命令可以连续的执行,而中间不会插入其他client的命令。

*

* 我们调用jedis.watch(…)方法来监控key,如果调用后key值发生变化,则整个事务会执行失败。

* 另外,事务中某个操作失败,并不会回滚其他操作。这一点需要注意。

* 还有,我们可以使用discard()方法来取消事务。

*/

// Jedis js1 = new Jedis("127.0.0.1", 6379);

// long s = System.currentTimeMillis();

// Transaction tx = js1.multi();

// for (int i = 0; i < 99999; i++) {

// tx.set("keyttt"+i, "valttt"+i);

// }

// List res= tx.exec();

// long e = System.currentTimeMillis();

// System.out.println((e-s)/1000.0+"秒");

//System.out.println(res);

// js1.disconnect();

/**************************管道**************************/

/**

* 管道(Pipelining)

* 有时,我们需要采用异步方式,一次发送多个指令,不同步等待其返回结果。

* 这样可以取得非常好的执行效率。这就是管道

*/

// Jedis js2 = new Jedis("127.0.0.1", 6379);

// long s = System.currentTimeMillis();

// Pipeline pe = js2.pipelined();

// for (int i = 0; i < 9999; i++) {

// pe.set("keya"+i, "valuea"+i);

// }

// List l = pe.syncAndReturnAll();

// long e = System.currentTimeMillis();

// System.out.println((e-s)/1000.0+"秒");

// js2.disconnect();

/**************************管道中调用事务**************************/ /**

* 管道中调用事务

* 在用法上看,管道中包含了事务

*/

// Jedis js3 = new Jedis("127.0.0.1", 6379);

// long s = System.currentTimeMillis();

// Pipeline pe = js3.pipelined();

// pe.multi();

// for (int i = 0; i < 9999; i++) {

// pe.set("keybb"+i, "valuebb"+i);

// }

// pe.exec();

// List l = pe.syncAndReturnAll();

// long e = System.currentTimeMillis();

// System.out.println((e-s)/1000.0+"秒");

// js3.disconnect();

/**************************分布式直连同步调用

**************************/

/**

* 分布式直连同步调用

* 线程不安全的,不建议在线程池中使用直连

*/

// List shards = Arrays.asList(

// new JedisShardInfo("localhost",6379),

// new JedisShardInfo("localhost",6380));

// ShardedJedis sharding = new ShardedJedis(shards);

// long start = System.currentTimeMillis();

// for (int i = 0; i < 100000; i++) {

// String result = sharding.set("sn" + i, "n" + i); // }

// long end = System.currentTimeMillis();

// System.out.println("Simple@Sharing SET: " + ((end - start)/1000.0) + " seconds");

// sharding.disconnect();

/**************************分布式直连同步调用

**************************/

/**

* 分布式直连异步调用

* 线程不安全的,不建议在线程池中使用直连

*/

// List shards = Arrays.asList(

// new JedisShardInfo("localhost",6379),

// new JedisShardInfo("localhost",6380));

// ShardedJedis sharding = new ShardedJedis(shards);

// ShardedJedisPipeline pipeline = sharding.pipelined(); // long start = System.currentTimeMillis();

// for (int i = 0; i < 100000; i++) {

// pipeline.set("sp" + i, "p" + i);

// }

// List results = pipeline.syncAndReturnAll();

// long end = System.currentTimeMillis();

// System.out.println("Pipelined@Sharing SET: " + ((end - start)/1000.0) + " seconds");

// sharding.disconnect();

/**************************分布式连接池同步调用

**************************/

/**

* 同步方式

*/

// List shards = Arrays.asList(

// new JedisShardInfo("localhost",6379),

// new JedisShardInfo("localhost",6380));

//

// ShardedJedisPool pool = new ShardedJedisPool(new JedisPoolConfig(), shards);

//

// ShardedJedis one = pool.getResource();

//

// long start = System.currentTimeMillis();

// for (int i = 0; i < 100000; i++) {

// String result = one.set("spn" + i, "n" + i);

// }

// long end = System.currentTimeMillis();

// pool.returnResource(one);

// System.out.println("Simple@Pool SET: " + ((end - start)/1000.0) + " seconds");

//

// pool.destroy();

//

/**************************分布式连接池异步调用

**************************/

/**

* 异步方式

*/

// List shards = Arrays.asList(

// new JedisShardInfo("localhost",6379), // new JedisShardInfo("localhost",6380)); //

// ShardedJedisPool pool = new ShardedJedisPool(new JedisPoolConfig(), shards);

//

// ShardedJedis one = pool.getResource();

//

// ShardedJedisPipeline pipeline = one.pipelined();

//

// long start = System.currentTimeMillis();

// for (int i = 0; i < 100000; i++) {

// pipeline.set("sppn" + i, "n" + i);

// }

// List results = pipeline.syncAndReturnAll(); // long end = System.currentTimeMillis();

// pool.returnResource(one);

// System.out.println("Pipelined@Pool SET: " + ((end - start)/1000.0) + " seconds");

// pool.destroy();

/**************************其他**************************/

/**

* 清空所有

*/

// js.flushAll();

/**

* 销毁链接

*/

// js.disconnect();

}

开始贴代码了,springMVC整合jedis

xmlns="https://www.sodocs.net/doc/3f1430869.html,/xml/ns/javaee"

xsi:schemaLocation="https://www.sodocs.net/doc/3f1430869.html,/xml/ns/javaee

https://www.sodocs.net/doc/3f1430869.html,/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">

SpringMVC-Redis

org.springframework.web.context.ContextLoaderListener

contextConfigLocation

classpath*:/applicationContext*.xml

springMVC

org.springframework.web.servlet.DispatcherServlet

contextConfigLocation

classpath*:/spring-servlet-config.xml

springMVC

/

SpringMVC-Redis-Encoding

org.springframework.web.filter.CharacterEncodingFilter< /filter-class>

encoding

UTF-8

forceEncoding

true

SpringMVC-Redis-Encoding

/*

index.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"

pageEncoding="utf-8"%>

index 2

${returnMsg}

action="${pageContext.request.contextPath }/TestRequest/test" method="post" name="loginForm" id="loginForm">

用户名:

密码:

spring-servlet-config.xml

xmlns:mvc="https://www.sodocs.net/doc/3f1430869.html,/schema/mvc"

xmlns:context="https://www.sodocs.net/doc/3f1430869.html,/schema/context" xmlns:xsi="https://www.sodocs.net/doc/3f1430869.html,/2001/XMLSchema-instance"

xsi:schemaLocation="https://www.sodocs.net/doc/3f1430869.html,/schema/beans https://www.sodocs.net/doc/3f1430869.html,/schema/beans/spring-beans-3.1.xsd https://www.sodocs.net/doc/3f1430869.html,/schema/context

https://www.sodocs.net/doc/3f1430869.html,/schema/context/spring-context-3.1.xsd https://www.sodocs.net/doc/3f1430869.html,/schema/mvc

https://www.sodocs.net/doc/3f1430869.html,/schema/mvc/spring-mvc-3.1.xsd">

use-default-filters="false">

expression="org.springframework.stereotype.Controller" />

expression="org.springframework.stereotype.Service" />

expression="org.springframework.stereotype.Repository" />

expression="https://www.sodocs.net/doc/3f1430869.html,ponent" />

class="org.springframework.web.servlet.view.InternalResourceViewResol ver">

org.springframework.web.servlet.view.JstlView

class="org.springframework.web.servlet.handler.SimpleMappingException Resolver">

key="org.apache.shiro.authz.UnauthorizedException">error/403

先把这些贴上来是因为这些文件内容都和上篇博

文”springMVC+memcached“的一模一样

applicationContext.xml

利用spring的构造注入,把集群参数传入RedisInitBean中,并且在项目启动

的时候加载RedisInitBean的有参构造方法

xmlns:xsi="https://www.sodocs.net/doc/3f1430869.html,/2001/XMLSchema-instance"

xmlns:context="https://www.sodocs.net/doc/3f1430869.html,/schema/context"

xmlns:aop="https://www.sodocs.net/doc/3f1430869.html,/schema/aop"

xmlns:tx="https://www.sodocs.net/doc/3f1430869.html,/schema/tx"

xsi:schemaLocation="https://www.sodocs.net/doc/3f1430869.html,/schema/beans https://www.sodocs.net/doc/3f1430869.html,/schema/beans/spring-beans-3.1.xsd https://www.sodocs.net/doc/3f1430869.html,/schema/context

https://www.sodocs.net/doc/3f1430869.html,/schema/context/spring-context-3.1.xsd https://www.sodocs.net/doc/3f1430869.html,/schema/aop

https://www.sodocs.net/doc/3f1430869.html,/schema/aop/spring-aop-3.1.xsd

https://www.sodocs.net/doc/3f1430869.html,/schema/tx

https://www.sodocs.net/doc/3f1430869.html,/schema/tx/spring-tx-3.1.xsd">

127.0.0.1:6379

192.168.3.27:6380

1000

200

true

RedisInitBean.java

这里面要说一下,使用的是分布式连接池异步调用!

package com.test.test;

import java.util.Arrays;

import java.util.List;

import redis.clients.jedis.JedisPoolConfig;

import redis.clients.jedis.JedisShardInfo;

import redis.clients.jedis.ShardedJedis;

import redis.clients.jedis.ShardedJedisPool;

public class RedisInitBean {

private List Host;

private long maxWaitMillis;

private int MaxIdle;

private Boolean testOnBorrow;

private static List shards ;

private static ShardedJedisPool pool;

private static ShardedJedis jedis;

public RedisInitBean(List host, long maxWaitMillis, int maxIdle, Boolean testOnBorrow) {

super();

Host = host;

this.maxWaitMillis = maxWaitMillis;

MaxIdle = maxIdle;

this.testOnBorrow = testOnBorrow;

if(host.size()!=0){

for (int i = 0; i < host.size(); i++) {

String h[] = ((String) host.get(i)).split(":"); shards = Arrays.asList(new

JedisShardInfo(h[0].trim(),Integer.parseInt(h[1].trim())));

System.out.println(shards);

}

}else{

System.out.println("请检查Redis配置,host项为必填项!格式[IP:PORT]");

}

pool = new ShardedJedisPool(new JedisPoolConfig(), shards); jedis = pool.getResource();

}

public synchronized ShardedJedis getSingletonInstance(){ return jedis;

}

public synchronized static void returnResource(){

pool.returnResource(jedis);

}

public synchronized static void destroy(){

pool.destroy();

}

}

TestRequest.java

刚才我们写的index.jsp中,提交了表单后浏览器会发起请求,spring拦截请求后会找到注解匹配的类中的方法,TestRequest就是了。

package com.test.web;

import java.util.List;

import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam;

import org.springframework.web.servlet.ModelAndView;

import redis.clients.jedis.ShardedJedis;

import redis.clients.jedis.ShardedJedisPipeline;

import com.test.test.RedisInitBean;

@Controller

@RequestMapping("/TestRequest")

public class TestRequest {

@Autowired

private RedisInitBean rib;

@RequestMapping("/test")

public ModelAndView test(@RequestParam(value = "username") final String userid,

@RequestParam(value = "password") final String passwd, HttpSession session){

ModelAndView m = new ModelAndView();

m.setViewName("../index");

ShardedJedis jedis = rib.getSingletonInstance();

ShardedJedisPipeline pipeline = jedis.pipelined();

long start = System.currentTimeMillis();

for (int i = 0; i < 99999; i++) {

pipeline.set("zhenbn" + i, "n" + i);

}

List results = pipeline.syncAndReturnAll();

long end = System.currentTimeMillis();

rib.returnResource();

rib.destroy();

System.out.println("分布式连接池异步调用耗时: " + ((end - start)/1000.0) + " 秒");

try {

Thread.sleep(5000);//睡5秒,然后打印jedis返回的结果 } catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println("返回结果:"+results);

m.addObject("returnMsg","么么哒!");

return m;

}

}

存完之后,我们可以取一下试试,看看到底有没有存进去。

看,取到了吧~

使用jedis的时候要注意配合commons-pool2.jar使用,否则会报错的。原因是 JedisPoolConfig extends GenericObjectPoolConfig,

而GenericObjectPoolConfig则是:

BaseObjectPoolConfig则是:

jar包下载:https://www.sodocs.net/doc/3f1430869.html,/s/1jGBVJds

SpringMVC配置的基本步骤

Springmvc框架配置步骤 小弟是个新手,有不对的地方请tell me,一起研究探讨。谢谢。 1062140832@https://www.sodocs.net/doc/3f1430869.html, 配置springmvc框架其实不是很难,要现有一个总体的认识,确定要分几步,每一步主要是干什么,不要太盲目。 以为web.xml是项目的入口,所以所有的配置文件,都必须引入到wem.xml中,不然,配置了等于没用。所以,要先从入口入手。 配置web.xml 1、首先引入springmvc-servlet.xml文件 springMVC org.springframework.web.servlet.DispatcherServlet contextConfigLocation /WEB-INF/spring/mvc/springmvc-servlet.xml 1 2、将spring加载到web.xml中 org.springframework.web.context.ContextLoaderListener 3、配置上下文路径 contextConfigLocation /WEB-INF/spring/spring.xml,/WEB-INF/spring/spring-*.xml 说明:如果有很多的关于spring的配置文件,建议分开写,比如事务一个文件(spring-transaction.xml),springmvc-hibernate.xml一个配置文件,这样方便读写。

SpringMVC深入总结

一、前言: 大家好,Spring3 MVC是非常优秀的MVC框架,由其是在3.0版本发布后,现在有越来越多的团队选择了Spring3 MVC了。Spring3 MVC结构简单,应了那句话简单就是美,而且他强大不失灵活,性能也很优秀。 官方的下载网址是:https://www.sodocs.net/doc/3f1430869.html,/download(本文使用是的Spring 3.0.5版本) Struts2也是比较优秀的MVC构架,优点非常多比如良好的结构。但这里想说的是缺点,Struts2由于采用了值栈、OGNL表达式、struts2标签库等,会导致应用的性能下降。Struts2的多层拦截器、多实例action性能都很好。可以参考我写的一篇关于Spring MVC与Struts2与Servlet比较的文章https://www.sodocs.net/doc/3f1430869.html,/admin/blogs/698217 Spring3 MVC的优点: 1、Spring3 MVC的学习难度小于Struts2,Struts2用不上的多余功能太多。呵呵,当然这不是决定因素。 2、Spring3 MVC很容易就可以写出性能优秀的程序,Struts2要处处小心才可以写出性能优秀的程序(指MVC部分) 3、Spring3 MVC的灵活是你无法想像的,Spring的扩展性有口皆碑,Spring3 MVC当然也不会落后,不会因使用了MVC框架而感到有任何的限制。 Struts2的众多优点:略... (呵呵,是不是不公平?) 众多文章开篇时总要吹些牛,吸引一下读者的眼球,把读者的胃口调起来,这样大家才有兴趣接着往后看。本文也没能例外。不过保证你看了之后不会后悔定有收获。

2.Spring-mvc框架结构及执行流程

Spring mvc架构及执行流程一、请求处理流程图 二、执行流程说明 三、组件说明

说明:在springmvc的各个组件中,处理器映射器、处理器适配器、视图解析器称为springmvc 的三大组件。 需要用户编写的组件有handler、view 四、Spring MVC配置 1、组件扫描器:使用组件扫描器省去在spring容器配置每个controller类,使用 自动扫描标记@controller的配置如下:

2、RequestMappingHandlerMapping:注解处理器映射器,对类中标记@RequestMapping 的方法进行映射,根据RequestMapping定义的url匹配RequestMapping标记的方 法,匹配成功返回HandlerMethod对象给前端控制器,HandlerMethod对象中封装 注解描述: @RequestMapping:定义请求url到处理器功能方法的映射 3、RequestMappingHandlerAdapter:注解式处理器适配器,对标记@RequestMapping 的方法进行适配。 从spring3.1版本开始,废除了AnnotationMethodHandlerAdapter的使用,推荐使用 4、:spring mvc 使用自动加载RequestMappingHandlerMapping和RequestMappingHandlerAdapter,可用在spring-mvc.xml 配置文件总使用替代注解处理器和适配器的配置。 5、视图解析器 InternalResourceViewResolver:支持JSP视图解析 viewClass:JstlView表示JSP模板页面需要使用JSTL标签库,所以classpath中必须包含jstl 的相关jar 包。此属性可以不设置,默认为JstlView。 prefix 和suffix:查找视图页面的前缀和后缀,最终视图的址为:

spring MVC配置详解

牧涛 --<-<-<@态度决定一切→_→。。。 ?博客园 ?首页 ?新闻 ?新随笔 ?联系 ?管理 ?订阅 随笔- 171 文章- 3 评论- 79 spring MVC配置详解 现在主流的Web MVC框架除了Struts这个主力外,其次就是Spring MVC了,因此这也是作为一名程序员需要掌握的主流框架,框架选择多了,应对多变的需求和业务时,可实行的方案自然就多了。不过要想灵活运用Spring MVC来应对大多数的Web开发,就必须要掌握它的配置及原理。 一、Spring MVC环境搭建:(Spring 2.5.6 + Hibernate 3.2.0) 1. jar包引入 Spring 2.5.6:spring.jar、spring-webmvc.jar、commons-logging.jar、cglib -nodep-2.1_3.jar Hibernate 3.6.8:hibernate3.jar、hibernate-jpa-2.0-api-1.0.1.Final.jar、a ntlr-2.7.6.jar、commons-collections-3.1、dom4j-1.6.1.jar、javassist-3.12.0.G A.jar、jta-1.1.jar、slf4j-api-1.6.1.jar、slf4j-nop-1.6.4.jar、相应数据库的驱动jar 包 SpringMVC是一个基于DispatcherServlet(分发器)的MVC框架,每一个请求最先访问的都是DispatcherServlet,DispatcherServlet负责转发每一个Request请求给相应的Handler,Handler处理以后再返回相应的视图(View)和模型(Model),返回的视图和模型都可以不指定,即可以只返回Model或只返回View或都不返回。 DispatcherServlet是继承自HttpServlet的,既然SpringMVC是基于DispatcherSe rvlet的,那么我们先来配置一下DispatcherServlet,好让它能够管理我们希望它管理的内容。HttpServlet是在web.xml文件中声明的。 spring org.springframework.web.servlet.DispatcherServlet< /servlet-class> contextConfigLocation classpath:springMvc.xml 1 dispatcher / CharacterEncodingFilter org.springframework.web.filter.CharacterEncodingFilter encoding utf-8 CharacterEncodingFilter /* 3.配置SpringMvc主配置文件