学习笔记------SSM框架项目从Redis数据库中拿取数据

**

1、导包

**
1-SSM(spring+mybatis+SpringMVC)的jar包
2-Redis连接的jar包
Redis要导入的jar包
3-然后json和其他相关jar包,(这里用的json jar包不是阿里巴巴的)
在这里插入图片描述

2、添加工具类redisUtil

package util;

import java.util.List;

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

import org.springframework.stereotype.Component;

import net.sf.json.JSONArray;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
@Component
public class RedisUtil {
	
	@Autowired
	JedisPool pool;
	
	// 判断Redis中是否存在键
		public boolean existsKey(String key) {
			Jedis jedis = pool.getResource();
			boolean bool;
			try {
				bool = jedis.exists(key);
			} finally {
				jedis.close();
			}
			return bool;
		}


		// 把List集合对象转换成json格式保存到指定的键中
		public void saveJsonArray(Object object, String key) {
			Jedis jedis = pool.getResource();
			try {
				// 格式化成Json字符串
				JSONArray array = JSONArray.fromObject(object);
				jedis.set(key, array.toString()); // 存入缓存
			} finally {
				jedis.close();
			}
		}
	 
		// 通过键取出Json字符串并转换成 Class<T>这个T所指定的类型
		@SuppressWarnings({ "static-access", "unchecked" })
		public <T> List<T> getJsonArray(String key, Class<T> classz) {
			Jedis jedis = pool.getResource();
			try {
				String str = jedis.get(key);
				JSONArray array = JSONArray.fromObject(str);
				// 把字符串转换回集合对象 clazz是指定的类型
				return (List<T>) array.toCollection(array, classz);
			} finally {
				jedis.close();
			}
		}
		
		
		
		//第二种方法
		// 取缓存中的二进制数据,反序列化成List集合对象
		/*
		public <T> List<T> getObject(String key, Class<T> clazz) {
			Jedis jedis = pool.getResource();
			// 二进制 IO 输入流
			ByteArrayInputStream is = null;
			ObjectInputStream ois = null;
			try {
				// 从缓存中取二进制数据
				byte[] b = jedis.get(key.getBytes());
				is = new ByteArrayInputStream(b);
				ois = new ObjectInputStream(is);
				// 把二进制转换成T指定类型的集合
				return (List<T>) ois.readObject();
	 
			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				try {
					is.close();
					ois.close();
				} catch (Exception e2) {
					e2.printStackTrace();
				}
				jedis.close();
			}
			return null;
		}
	 
		// 把对象序列化二进制格式并保证到Redis缓存中
		public  void saveObject(Object object, String key) {
			Jedis jedis = pool.getResource();
			// 二进制 IO 输出流
			ByteArrayOutputStream os = null;
			ObjectOutputStream oos = null;
			try {
				os = new ByteArrayOutputStream();
				oos = new ObjectOutputStream(os);
				oos.writeObject(object); // 二进制数据
				byte[] b = os.toByteArray();
				// 存入二进制数据到Redis缓存中
				jedis.set(key.getBytes(), b);
			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				try {
					os.close();
					oos.close();
				} catch (Exception e2) {
					e2.printStackTrace();
				}
				jedis.close();
			}
		}*/		
}

这里有两种方式,二进制和json的

3、添加配置

在一个applicationContext.xml文件中添加(要注意添加扫描util包)

<context:component-scan base-package="util" />

<!-- Redis 连接池配置 -->
<bean id="jedisPool" class="redis.clients.jedis.JedisPool"
	destroy-method="close">		
	<constructor-arg name="host" value="127.0.0.1" />
	<constructor-arg name="port" value="6379" />
</bean>

4、在contorller类里面运用

package controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import entity.Grade;
import redis.clients.jedis.JedisPool;
import service.GradeService;
import util.RedisUtil;
/**
 * 年级的控制类
 * @author yjl
 *
 */
@Controller
@RequestMapping("/grade")
public class GradeController {
	@Autowired // 从IOC容器注入业务层对象
	GradeService service;
	@Autowired
	JedisPool pool;
	@Autowired
	RedisUtil redisUtil;
	
	
	@RequestMapping("/list")
	public ModelAndView list() {
		List<Grade> grades = null;
		if (redisUtil.existsKey("gr")) {
			System.out.println("从Redis 缓存中取数据..");
			//调用反序列化方法取缓存的数据  --二进制  
            //grades = redisUtil.getObject("gr",Grade.class);			
			
            //调用Json格式转换的方法取缓存数据
            grades = redisUtil.getJsonArray("gr", Grade.class);				
		} else {
			System.out.println("从数据库中取数据,并存入缓存..");			
			//调用底层方法从数据库中取数据
            grades = service.find();
 
            //调用序列化方法把数据缓存到Redis中 --二进制
			//redisUtil.saveObject(grades, "gr");
 
            //调用Json格式化方法把数据缓存到Redis中
			redisUtil.saveJsonArray(grades, "gr");		 
		}	 
		return new ModelAndView("gradeList", "grades", grades);
	}
}

如果redis数据库里面没有这个gr的值,他会从数据库里面拿,然后缓存到redis数据库中,有gr值的话,就直接在redis中拿取数据。

主意事项:(有的是我自己写这个是犯的一些错误,还有同学犯的一些错误)

  1. web文件里面的项目名字(因为一般web.xml文件都是直接复制的,所以开头的项目名字记得要改)
  2. 写util类时,例如:redisUtil类,要加@Component注解
  3. 页面的<%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c” %>指令不要忘记加,一般要用jstl方式的多多少少这个忘记加过
  4. 应用jar包时,要注意不要导入其他的jar包的方法(因为有很多其他jar包也有这个方法)
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值