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
// 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
// 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
// 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
String[]{"username","age"});
// List
// 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
// 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
// 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
// long e = System.currentTimeMillis();
// System.out.println((e-s)/1000.0+"秒");
// js3.disconnect();
/**************************分布式直连同步调用
**************************/
/**
* 分布式直连同步调用
* 线程不安全的,不建议在线程池中使用直连
*/
// List
// 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
// 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
// long end = System.currentTimeMillis();
// System.out.println("Pipelined@Sharing SET: " + ((end - start)/1000.0) + " seconds");
// sharding.disconnect();
/**************************分布式连接池同步调用
**************************/
/**
* 同步方式
*/
// List
// 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
// 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
// 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.doczj.com/doc/351430869.html,/xml/ns/javaee" xsi:schemaLocation="https://www.doczj.com/doc/351430869.html,/xml/ns/javaee https://www.doczj.com/doc/351430869.html,/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
index.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
function login(){
var username = $("#username").val();
var password = $("#password").val();
$("#loginForm").submit();
}
document.onkeydown=function(event){
e = event ? event :(window.event ? window.event : null);
if(e.keyCode==13){
login();
}
}
spring-servlet-config.xml
xmlns:mvc="https://www.doczj.com/doc/351430869.html,/schema/mvc" xmlns:context="https://www.doczj.com/doc/351430869.html,/schema/context" xmlns:xsi="https://www.doczj.com/doc/351430869.html,/2001/XMLSchema-instance" xsi:schemaLocation="https://www.doczj.com/doc/351430869.html,/schema/beans https://www.doczj.com/doc/351430869.html,/schema/beans/spring-beans-3.1.xsd https://www.doczj.com/doc/351430869.html,/schema/context https://www.doczj.com/doc/351430869.html,/schema/context/spring-context-3.1.xsd https://www.doczj.com/doc/351430869.html,/schema/mvc https://www.doczj.com/doc/351430869.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.doczj.com/doc/351430869.html,ponent" /> class="org.springframework.web.servlet.view.InternalResourceViewResol ver"> 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.doczj.com/doc/351430869.html,/2001/XMLSchema-instance" xmlns:context="https://www.doczj.com/doc/351430869.html,/schema/context" xmlns:aop="https://www.doczj.com/doc/351430869.html,/schema/aop" xmlns:tx="https://www.doczj.com/doc/351430869.html,/schema/tx" xsi:schemaLocation="https://www.doczj.com/doc/351430869.html,/schema/beans https://www.doczj.com/doc/351430869.html,/schema/beans/spring-beans-3.1.xsd https://www.doczj.com/doc/351430869.html,/schema/context https://www.doczj.com/doc/351430869.html,/schema/context/spring-context-3.1.xsd https://www.doczj.com/doc/351430869.html,/schema/aop https://www.doczj.com/doc/351430869.html,/schema/aop/spring-aop-3.1.xsd https://www.doczj.com/doc/351430869.html,/schema/tx https://www.doczj.com/doc/351430869.html,/schema/tx/spring-tx-3.1.xsd">
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
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
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.doczj.com/doc/351430869.html,/s/1jGBVJds
Springmvc框架配置步骤 小弟是个新手,有不对的地方请tell me,一起研究探讨。谢谢。 1062140832@https://www.doczj.com/doc/351430869.html, 配置springmvc框架其实不是很难,要现有一个总体的认识,确定要分几步,每一步主要是干什么,不要太盲目。 以为web.xml是项目的入口,所以所有的配置文件,都必须引入到wem.xml中,不然,配置了等于没用。所以,要先从入口入手。 配置web.xml 1、首先引入springmvc-servlet.xml文件
一、前言: 大家好,Spring3 MVC是非常优秀的MVC框架,由其是在3.0版本发布后,现在有越来越多的团队选择了Spring3 MVC了。Spring3 MVC结构简单,应了那句话简单就是美,而且他强大不失灵活,性能也很优秀。 官方的下载网址是:https://www.doczj.com/doc/351430869.html,/download(本文使用是的Spring 3.0.5版本) Struts2也是比较优秀的MVC构架,优点非常多比如良好的结构。但这里想说的是缺点,Struts2由于采用了值栈、OGNL表达式、struts2标签库等,会导致应用的性能下降。Struts2的多层拦截器、多实例action性能都很好。可以参考我写的一篇关于Spring MVC与Struts2与Servlet比较的文章https://www.doczj.com/doc/351430869.html,/admin/blogs/698217 Spring3 MVC的优点: 1、Spring3 MVC的学习难度小于Struts2,Struts2用不上的多余功能太多。呵呵,当然这不是决定因素。 2、Spring3 MVC很容易就可以写出性能优秀的程序,Struts2要处处小心才可以写出性能优秀的程序(指MVC部分) 3、Spring3 MVC的灵活是你无法想像的,Spring的扩展性有口皆碑,Spring3 MVC当然也不会落后,不会因使用了MVC框架而感到有任何的限制。 Struts2的众多优点:略... (呵呵,是不是不公平?) 众多文章开篇时总要吹些牛,吸引一下读者的眼球,把读者的胃口调起来,这样大家才有兴趣接着往后看。本文也没能例外。不过保证你看了之后不会后悔定有收获。
Spring mvc架构及执行流程一、请求处理流程图 二、执行流程说明 三、组件说明
说明:在springmvc的各个组件中,处理器映射器、处理器适配器、视图解析器称为springmvc 的三大组件。 需要用户编写的组件有handler、view 四、Spring MVC配置 1、组件扫描器:使用组件扫描器省去在spring容器配置每个controller类,使用
2、RequestMappingHandlerMapping:注解处理器映射器,对类中标记@RequestMapping 的方法进行映射,根据RequestMapping定义的url匹配RequestMapping标记的方 法,匹配成功返回HandlerMethod对象给前端控制器,HandlerMethod对象中封装 注解描述: @RequestMapping:定义请求url到处理器功能方法的映射 3、RequestMappingHandlerAdapter:注解式处理器适配器,对标记@RequestMapping 的方法进行适配。 从spring3.1版本开始,废除了AnnotationMethodHandlerAdapter的使用,推荐使用 4、
牧涛 --<-<-<@态度决定一切→_→。。。 ?博客园 ?首页 ?新闻 ?新随笔 ?联系 ?管理 ?订阅 随笔- 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文件中声明的。