SSM-Spring+SpringMVC+Mybatis框架相信大家都很熟悉了,但是有的时候需要频繁访问数据库中不变或者不经常改变的数据,就会加重数据库的负担,这时我们就会想起Redis

Redis是由C语言编写,高性能的key-value存储系统,常用于缓存不经常变动或者根本不变的数据,Redis高级:https://blog.csdn.net/hjm4702192/article/details/80518856

废话不多说,先练练手再说

安装Redis

这里介绍的window下的安装

1、下载

下载地址:https://github.com/MSOpenTech/redis/releases

下载适合自己系统的zip包,然后解压到想放的地方,我这里直接放在E盘下

Win+R输入cmd 进入E盘,Redis下,哎呀废话不多说了,直接传送http://www.runoob.com/redis/redis-install.html

2、安装+配置

如果每次启动都像上面那样未免太麻烦了,所以我们接下来把它做成服务,这样启动就方便多了。

cmd到redis.windows-service.conf所在目录,执行

 redis-server --service-install redis-windows-conf

就可以了,接下来我们就可以在Windows任务管理器服务里面找到Redis了,可以右键启动,也可以

cmd 下输入redis-server --service-start启动

接下来配置redis.windows-service.conf,为什么不修改redis.windows.conf呢?

因为Redis服务默认加载的redis.windows-service.conf配置文件

配置文件里面对于初级者需要修改的不多,

、Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程

    daemonize no

、当Redis以守护进程方式运行时,Redis默认会把pid写入/var/run/redis.pid文件,可以通过pidfile指定

    pidfile /var/run/redis.pid
、设置Redis连接密码,如果配置了连接密码,客户端在连接Redis时需要通过AUTH <password>命令提供密码,默认关闭 requirepass foobared

更多配置详见http://www.runoob.com/redis/redis-conf.html

SSM集成Redis

终于到这一步了,废话不多说

首先当然是添加依赖

  <spring.redis.version>1.6..RELEASE</spring.redis.version>
<jedis.version>2.7.</jedis.version> <!-- config redis data and client jar-->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>${spring.redis.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-pool2 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>${commons.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>${jedis.version}</version>
</dependency>

resources目录下新建redis.properties

redis.host=127.0.0.1
redis.port=
redis.password= redis.maxIdle=
redis.maxWaitMillis=
redis.maxTotal=
redis.testOnBorrow=true
redis.testOnReturn=true
redis.testWhileIdle=true
redis.blockWhenExhausted=false
redis.numTestsPerEvictionRun=
redis.timeBetweenEvictionRunsMillis=
redis.minEvictableIdleTimeMillis=

然后Spring整合Redis,我配置在Spring-Mybatis.xml

<!--扫描redis配置文件-->
<context:property-placeholder ignore-unresolvable="true" location="classpath:redis.properties"/>
<!--Spring整合Redis-->
<!--设置连接池-->
<bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
<!-- 最大空闲连接数 -->
<property name="maxIdle" value="${redis.maxIdle}"/>
<!-- 最大连接数 -->
<property name="maxTotal" value="${redis.maxTotal}" />
<!-- 每次释放连接的最大数目 -->
<property name="numTestsPerEvictionRun" value="${redis.numTestsPerEvictionRun}" />
<!-- 释放连接的扫描间隔(毫秒) -->
<property name="timeBetweenEvictionRunsMillis" value="${redis.timeBetweenEvictionRunsMillis}" />
<!-- 连接最小空闲时间 -->
<property name="minEvictableIdleTimeMillis" value="${redis.minEvictableIdleTimeMillis}" />
<!-- 获取连接时的最大等待毫秒数,小于零:阻塞不确定的时间,默认- -->
<property name="maxWaitMillis" value="${redis.maxWaitMillis}" />
<!-- 在获取连接的时候检查有效性, 默认false -->
<property name="testOnBorrow" value="${redis.testOnBorrow}" />
<property name="testOnReturn" value="${redis.testOnReturn}" />
<!-- 在空闲时检查有效性, 默认false -->
<property name="testWhileIdle" value="${redis.testWhileIdle}" />
<!-- 连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true -->
<property name="blockWhenExhausted" value="${redis.blockWhenExhausted}" />
</bean> <!-- jedis客户端单机版 -->
<bean id="redisClient" class="redis.clients.jedis.JedisPool">
<constructor-arg name="host" value="${redis.host}"></constructor-arg>
<constructor-arg name="port" value="${redis.port}"></constructor-arg>
<constructor-arg name="password" value="${redis.password}"></constructor-arg>
<constructor-arg name="poolConfig" ref="poolConfig"></constructor-arg>
<constructor-arg name="timeout" value=""></constructor-arg>
</bean>
<bean id="JedisClient" class="com.smart.redis.JedisClientSingle"/>

首先创建一个接口,下面很多方法都用不到,标红的是我经常用的

import java.io.File;
import java.util.List; public interface JedisClient {
String get(String key);
String set(String key,String value);
public void setList(String key,List<?> value);
public List<?> getList(String key);
public void setObject(String key,Object o);
public Object getObject(String key);
public void clear();
public Object removeObject(String str);
public int getSize();
public void setFile(String key,String path);
public File getFile(String key); String hashGet(String key,String value);//获取存储结构为hashMap的类型数据
long hset(String hkey,String key, String value);
long incr(String key);
long expire(String key,int second);
long tt1(String key);
long del(String key);//删除数据
long hashDel(String hkey,String key);
}

然后实现类

import org.springframework.beans.factory.annotation.Autowired;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool; import java.io.File;
import java.util.List; public class JedisClientSingle implements JedisClient { @Autowired
private JedisPool jedisPool; @Override
public String get(String key) {
Jedis jedis = jedisPool.getResource();
String str = jedis.get(key);
jedis.close();
return str;
} @Override
public String set(String key, String value) {
Jedis jedis = jedisPool.getResource();
String str = jedis.set(key,value);
jedis.close();
return str;
} @Override
public long hset(String hkey, String key, String value) {
Jedis jedis = jedisPool.getResource();
Long result = jedis.hset(hkey,key,value);
jedis.close();
return result;
} @Override
public String hashGet(String key, String value) {
Jedis jedis = jedisPool.getResource();
String str = jedis.hget(key,value);
jedis.close();
return str;
} @Override
public long hashDel(String hkey, String key) {
return ;
} @Override
public long tt1(String key) {
return ;
} @Override
public long expire(String key, int second) {
Jedis jedis = jedisPool.getResource();
Long result = jedis.expire(key,second);
jedis.close();
return result;
} @Override
public long incr(String key) {
return ;
} @Override
public long del(String key) {
Jedis jedis = jedisPool.getResource();
Long result = jedis.del(key);
jedis.close();
return result;
} @Override
public void setList(String key, List<?> list) {
Jedis jedis = jedisPool.getResource();
try{
if(list != null && !list.isEmpty()){
jedis.set(key.getBytes(),SerializeUtil.serializeList(list));
}else{
jedis.set(key.getBytes(), "".getBytes());
}
}catch (Exception e){
e.printStackTrace();
}
} @Override
public List<?> getList(String key) {
Jedis jedis = jedisPool.getResource();
if(jedis==null || !jedis.exists(key)){
return null;
}
byte[] data = jedis.get(key.getBytes());
return SerializeUtil.unSerializeList(data);
} @Override
public void setObject(String key, Object o) {
Jedis jedis = jedisPool.getResource();
try{
o = o == null ? new Object():o;
jedis.set(key.getBytes(),SerializeUtil.serializeObject(o));
}catch (Exception e){
e.printStackTrace();
}
} @Override
public Object getObject(String key) {
Jedis jedis = jedisPool.getResource();
if(jedis == null || !jedis.exists(key)){
return null;
}
byte[] data = jedis.get(key.getBytes());
return (Object)SerializeUtil.unSerializeObject(data);
} @Override
public void clear() {
Jedis jedis = jedisPool.getResource();
jedis.flushDB();
} @Override
public Object removeObject(String key) {
return jedisPool.getResource().expire(SerializeUtil.serializeObject(key), );
} @Override
public int getSize() {
return Integer.valueOf(jedisPool.getResource().dbSize().toString());
} //保存文件方法
public void setFile(String key,String path){
Jedis jedis = jedisPool.getResource();
File fr = new File(path);
try{
jedis.set(key.getBytes(), SerializeUtil.serializeObject(fr));
}catch (Exception e){
e.printStackTrace();
}
} //读取文件对象方法
public File getFile(String key){
Jedis jedis = jedisPool.getResource();
File file = (File)SerializeUtil.unSerializeObject(jedis.get(key.getBytes()));
return file;
}
}

由于Redis只能存储5种类的数据,包括String、List、Set、zset和hash,其他的类型则需要序列化之后方可存储

下面这是序列化工具类

import java.io.*;
import java.util.ArrayList;
import java.util.List; public class SerializeUtil {
/**
*
* 序列化对象
*/
public static byte[] serializeObject(Object obj) {
if(obj == null){
return null;
}
ObjectOutputStream oos = null;
ByteArrayOutputStream baos = null;
byte[] bytes = null;
try {
// 序列化
baos = new ByteArrayOutputStream();
oos = new ObjectOutputStream(baos);
oos.writeObject(obj);
bytes = baos.toByteArray();
} catch (IOException e) {
e.printStackTrace();
}finally {
close(oos);
close(baos);
}
return bytes;
} /**
*
* 反序列化
*
* @param bytes
* @return
*/
public static Object unSerializeObject(byte[] bytes) {
if(bytes == null){
return null;
}
ByteArrayInputStream bais = null;
ObjectInputStream ois = null;
try {
// 反序列化为对象
bais = new ByteArrayInputStream(bytes);
ois = new ObjectInputStream(bais);
return ois.readObject();
} catch (Exception e) {
e.printStackTrace();
}finally {
close(bais);
close(ois);
}
return null;
} /**
*
* 序列化
*/
public static byte[] serializeList(List<?> list) {
if(list==null || list.isEmpty()){
return null;
}
ObjectOutputStream oos = null;
ByteArrayOutputStream baos = null;
byte[] bytes = null;
try {
// 序列化
baos = new ByteArrayOutputStream();
oos = new ObjectOutputStream(baos);
for(Object o : list){
oos.writeObject(o);
}
bytes = baos.toByteArray();
} catch (IOException e) {
e.printStackTrace();
}finally {
close(oos);
close(baos);
}
return bytes;
} /**
*
* 反序列化
*
* @param bytes
* @return
*/
public static List<?> unSerializeList(byte[] bytes) {
if(bytes == null){
return null;
}
List<Object> list = new ArrayList<Object>();
ByteArrayInputStream bais = null;
ObjectInputStream ois = null;
try {
// 反序列化为对象
bais = new ByteArrayInputStream(bytes);
ois = new ObjectInputStream(bais);
while (bais.available()>){
Object o = (Object)ois.readObject();
if(o == null){
break;
}
list.add(o);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
close(bais);
close(ois);
}
return list;
} //关闭IO流对象
public static void close(Closeable closeable){
if(closeable != null){
try{
closeable.close();
}catch (Exception e){
e.printStackTrace();
}
}
} }

至此我们就整合好了,下面测试一下

@Service("userService")
public class UserServiceImpl implements UserService { @Autowired
private UserDao userDao;
//注入
@Autowired
com.smart.redis.JedisClient JedisClient; //判断工号是否已存在
public boolean isNumberExist(String geNumber){
boolean isSuccess = false;
User user = null;
//先从Redis里取
user = (User)JedisClient.getObject(geNumber);
if(user==null){
//如果Redis没有则从数据库里取
user = userDao.getUserById(geNumber);
if(user!=null){
//从数据库中取了之后,再存入Redis,以便下次取
JedisClient.setObject(geNumber,(Object) user);
}
} if(StringUtils.isEmpty(user)){
isSuccess = true;
}
return isSuccess;
}
}

SSM框架集成Redis的更多相关文章

  1. SSM-1第一章 认识SSM框架和Redis

    第一章 认识SSM框架和Redis   1.1 Spring框架 Sring理念  Ioc  控制反转  IOC是一个容器,在Spring中,它会认为一切Java资源都是JavaBean,容器的目标是 ...

  2. Spring+SpringMVC+Mybatis(SSM)框架集成搭建

    Spring+SpringMVC+Mybatis框架集成搭建教程 一.背景 最近有很多同学由于没有过SSM(Spring+SpringMvc+Mybatis , 以下简称SSM)框架的搭建的经历,所以 ...

  3. SSM框架集成各配置文件

    SSM框架集成各配置文件 Spring Spring MVC Mybatis 的整合SpringMVC相当于Spring的一个组件 本来就是一个家族的不存在整合的问题,所以主要就是Spring于Myb ...

  4. Spring MVC 学习总结(十一)——IDEA+Maven+多模块实现SSM框架集成

    一.SSM概要 与SSH(Struts/Spring/Hibernate/)一样,Spring+SpringMVC+MyBatis也有一个简称SSM,Spring实现业务对象管理,Spring MVC ...

  5. SSM 框架集成

    1.SSM是什么? SSM是指目前最主流的项目架构的三大框架: SpringMVC : spring的 Web层框架,是spring的一个模块 Spring :容器框架 MyBatis :持久层框架 ...

  6. Java高并发秒杀系统API之SSM框架集成swagger与AdminLTE

    初衷与整理描述 Java高并发秒杀系统API是来源于网上教程的一个Java项目,也是我接触Java的第一个项目.本来是一枚c#码农,公司计划部分业务转java,于是我利用业务时间自学Java才有了本文 ...

  7. SSM框架集成及配置详解(Maven管理)

    一.pom.xml(依赖管理) <?xml version="1.0" encoding="UTF-8"?> <project xmlns=& ...

  8. ssm框架集成Quartz定时器

    第一步:添加依赖 <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>qu ...

  9. Spring+SpringMvc+Mybatis框架集成搭建教程

    一.背景 最近有很多同学由于没有过SSM(Spring+SpringMvc+Mybatis , 以下简称SSM)框架的搭建的经历,所以在自己搭建SSM框架集成的时候,出现了这样或者那样的问题,很是苦恼 ...

随机推荐

  1. DEDE 列表页调用如 标题,时间,简介等

    以下是直接从板子中复制出来的,CSS自已根据需要写下就行.在调时简介长度不知道怎么控制,现在说下方法1. infolen='30' 这个可以2. 系统设置 >其它设置 >内容简介长度填下就 ...

  2. 也谈设计模式Facade

    门面模式提供一个高层次的接口,使得子系统更容易使用. 子系统与外部系统的通信必须经过一个统一的facade进行处理. 内部系统的交互在facade中进行整合,这样,对于外部系统的使用者就不用关注内部系 ...

  3. 命令行 -- 命令"%cd%"

    1. @echo off echo 当前盘符:%~d0 echo 当前盘符和路径:%~dp0 echo 当前批处理全路径:%~f0 echo 当前盘符和路径的短文件名格式:%~sdp0 echo 当前 ...

  4. linux shell编程(二) 条件测试

    bash中常用的条件测试有三种 条件测试的表达式:[ expression ]  [[ expression]] 第一种:整数测试: -eq 测试两个整数是否相等,比如[ $A -eq $B ] -n ...

  5. django使用bootstrap前端框架

    一.下载bootstrap相关文件,放在项目目录中.在blog 应用中新建static目录,bootstrap文件放在此目录下. bootstrap下载网址:http://v3.bootcss.com ...

  6. QMainFrame类

    一.简介: 1.QMainFrame类提供了应用程序的主窗口,因为它可以添加菜单.工具条.状态栏和停靠窗口,同时也支持单文档窗口和多文档窗口,这是它和其他窗口不一样的地方. 2.QMainFrame窗 ...

  7. C++11特性 gcc源码包

    1.下载gcc最新的源码包  2.解压缩 tar -xf gcc-4.9.1.tar.gz 3. cd gcc-4.9.1 4.运行download_prerequisites脚本, ./contri ...

  8. bzoj 2460: 元素 线性基

    题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=2460 题解: RT 线性基裸题 #include <cstdio> #inc ...

  9. [转]Google开源Leak Finder—用于检测内存泄漏的JavaScript工具-----可惜,暂时打不开google的网站,下载不了

    近日,Google开源了Leak Finder,这款工具可以查看JavaScript应用的堆,进而发现内存泄漏. 作为一门垃圾收集语言,JavaScript并不会出现常见的内存泄露情况,特别是像C++ ...

  10. (转载)[机器学习] Coursera ML笔记 - 监督学习(Supervised Learning) - Representation

    [机器学习] Coursera ML笔记 - 监督学习(Supervised Learning) - Representation http://blog.csdn.net/walilk/articl ...