中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

詳解在Java程序中運用Redis緩存對象的方法

發布時間:2020-09-07 07:19:57 來源:腳本之家 閱讀:289 作者:dange_h 欄目:編程語言

這段時間一直有人問如何在Redis中緩存Java中的List 集合數據,其實很簡單,常用的方式有兩種:

1. 利用序列化,把對象序列化成二進制格式,Redis 提供了 相關API方法存儲二進制,取數據時再反序列化回來,轉換成對象。

2. 利用 Json與java對象之間可以相互轉換的方式進行存值和取值。

正面針對這兩種方法,特意寫了一個工具類,來實現數據的存取功能。

1. 首頁在Spring框架中配置 JedisPool 連接池對象,此對象可以創建 Redis的連接 Jedis對象。當然,必須導入Redis的相關Jar包。

Jedis 的Jar包如下:

commons-pool2-2.3.jar
jedis-2.9.0.jar

要用到 Json,所以還需要導入Json的Jar包:

commons-beanutils-1.8.0.jar
commons-collections-3.1.jar
commons-lang-2.5.jar
commons-logging-1.1.3.jar
ezmorph-1.0.6.jar
json-lib-2.3-jdk15.jar

在配置文件中配置JedisPool 連接池對象

<!-- 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>

2. 創建一個Redis的工具類RedisUtil,這個類中實現了上面所說的兩種方法的存取操作

package com.sgxy.util;
 
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
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; // Jedis連接池
	
  // 判斷Redis中是否存在鍵
	public boolean existsKey(String key) {
		Jedis jedis = pool.getResource();
		boolean bool;
		try {
			bool = jedis.exists(key);
		} finally {
			jedis.close();
		}
		return bool;
	}
 
	// 取緩存中的二進制數據,反序列化成List集合對象
	@SuppressWarnings("unchecked")
	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();
		}
	}
 
	// 把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> clazz) {
		Jedis jedis = pool.getResource();
		try {
			String str = jedis.get(key);
			JSONArray array = JSONArray.fromObject(str);
			// 把字符串轉換回集合對象 clazz是指定的類型
			return (List<T>) array.toCollection(array, clazz);
		} finally {
			jedis.close();
		}
	}
}

在Java程序其他地方操作這個工具類做數據的處理:

@Controller //注解這個類為控制器
@RequestMapping("grade") //注冊訪問此控制器的URL
public class GradeController {
	@Autowired // 從IOC容器注入業務層對象
	GradeService gradeService;
	@Autowired
	JedisPool pool;
	@Autowired
	RedisUtil redisUtil;
 
	@RequestMapping("list") //注冊URL
	public ModelAndView list() { 
		List<Grade> grades = null;
		if (redisUtil.existsKey("g")) {
			System.out.println("從Redis 緩存中取數據..");
			//調用反序列化方法取緩存的數據
      grades = redisUtil.getObject("g",Grade.class);			
			
      //調用Json格式轉換的方法取緩存數據
      //grades = redisUtil.getJsonArray("gradeList", Grade.class);				
		} else {
			System.out.println("從數據庫中取數據,并存入緩存..");			
			//調用底層方法從數據庫中取數據
      grades = gradeService.find();
 
      //調用序列化方法把數據緩存到Redis中
			redisUtil.saveObject(grades, "g");
 
      //調用Json格式化方法把數據緩存到Redis中
			//redisUtil.saveJsonArray(grades, "gradeList");		 
		}	 
		return new ModelAndView("gradeList", "grades", grades);
	}
}

寫到此,希望對大家有所幫助。

以上所述是小編給大家介紹的在Java程序中運用Redis緩存對象的方法詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對億速云網站的支持!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

阿鲁科尔沁旗| 泸水县| 会东县| 莱阳市| 黄陵县| 平潭县| 三门县| 沈阳市| 周至县| 昆明市| 冷水江市| 镇原县| 揭东县| 武夷山市| 丹寨县| 磴口县| 广州市| 延川县| 玉龙| 舞阳县| 虞城县| 宜城市| 麻城市| 墨竹工卡县| 临沂市| 分宜县| 陆河县| 若羌县| 纳雍县| 江油市| 梧州市| 安义县| 白沙| 旺苍县| 扎兰屯市| 交口县| 革吉县| 新邵县| 绥德县| 龙泉市| 巴塘县|