Spring+Redis集成+關係型資料庫持久化

来源:http://www.cnblogs.com/shsxt/archive/2017/11/09/7810553.html
-Advertisement-
Play Games

本篇文章主要介紹了"Spring+Redis集成+關係型資料庫持久化",主要涉及到Spring+Redis集成+關係型資料庫持久化方面的內容,對於Spring+Redis集成+關係型資料庫持久化感興趣的同學可以參考一下。上海尚學堂大數據培訓組原作spring文章,陸續大數據相關技術文章奉上,請多關註 ...


本篇文章主要介紹了"Spring+Redis集成+關係型資料庫持久化",主要涉及到Spring+Redis集成+關係型資料庫持久化方面的內容,對於Spring+Redis集成+關係型資料庫持久化感興趣的同學可以參考一下。上海尚學堂大數據培訓組原作spring文章,陸續大數據相關技術文章奉上,請多關註!


最近研究Spring-Redis集成的問題,在網上搜了很多,但是都是沒有營養的資料,最後根據Spring和Redis官方文檔加上不斷實踐,琢磨出的一點心得。 Redis是一個分散式的記憶體對象緩存系統,在我們的Web應用上集成中,有的用作持久化框架的二級緩存,有的用作一個單獨的緩存系統,兩者最終目的都是為了減小資料庫伺服器的壓力,如果將Redis用作持久化框架的二級緩存,則顯得有點大才小用,所以,我們將它獨立出來,也方便以後的Redis集群。 在Spring-Redis集成中,在Spring的官方網站上有個Project是Spring-data-redis,其中就有我們需要的東西! 我們需要的jar包有兩個:         
1)spring-data-redis-1.1.1.RELEASE.jar        
2)需要redis的java客戶端,比較流行的java客服端有Jedis、JRedis,這裡我們用最popular的Jedis客戶端,jedis-2.1.0.jar 


一、Spring的配置文件 官方的Jedis的Spring的配置文件如下: 如果採用模板的話,配置文件如下: 
在這裡我們需要進行修改,自定義自己的Spring配置文件,而且我們採用連接池的方式,從連接池中獲取連接,Spring配置文件如下: 


<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig" >         <!-- 最大活躍連接數 -->           
<property name="maxActive" value="20" />           <!-- 最大閑置數量 -->         
<property name="maxIdle" value="20" />           <!-- 最大等待時間 -->         
<property name="maxWait" value="1000" />          <!-- 調用borrow 一個對象方法時,是否檢查其有效性 -->          
<property name="testOnBorrow" value="true"/>          <!-- 調用return 一個對象方法時,是否檢查其有效性 -->        
<property name="testOnReturn" value="ture"/>    
</bean>
     
<bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">         
<!-- redis所在的ip -->         
<property name="hostName" value="192.168.1.200"/>         
<!-- redis的埠 -->         
<property name="port" value="6379"/>         
<!-- 是否啟用連接池 -->         
<property name="usePool" value="true"/>         
<!-- 連接池的配置參考 -->         
<property name="poolConfig" ref="jedisPoolConfig" />     
</bean> 這樣,在我們需要用到jedisConnectionFactory的類中,將jedisConnectionFactory註入進去,並從這個工廠獲取JedisConnection對象。 


二、測試
1)實體類:     


public class Student implements Serializable {          /**      *       */     
private static final long serialVersionUID = 3951779424645593223L;     private int id;         
private String name;          
private int age;     
public int getId()     {         
return id;     
}     
public void setId(int id)     {         
this.id = id;     
}     
public String getName()     {         
return name;     
}     
public void setName(String name)     {         
this.name = name;     
}     
public int getAge()     {         
return age;     
}     
public void setAge(int age)     {         
this.age = age;     
}     
@Override     
public String toString()     {         return "Student [id=" + id + ", name=" + name + ", age=" + age + "]";     } 



2)用Mybatis作為持久化框架,我們的Mapper是用註解形式寫的:     
public interface StudentMapper{          
@Insert("insert into user(name,age) values(#{name},#{age})")     
@Options(useGeneratedKeys=true,keyProperty="id")     
int insert(Student student);     
@Select("select * from user where id = #{id}")     
Student queryById(@Param("id")int id); 



3)service的實現類     
public class StudentServiceImpl extends BaseService implements IStudentService{          
private StudentMapper studentMapper;          
private JedisConnectionFactory jedisConnectionFactory;     
@Override     
public void add(Student student){         
studentMapper = writableSQLSession.getMapper(StudentMapper.class);         
int id = studentMapper.insert(student);         
System.out.println(id);         
JedisConnection connection = jedisConnectionFactory.getConnection();         
Map<byte[],byte[]> map = new HashMap<byte[],byte[]>();         
map.put(SerializableUtil.serialize("name"), SerializableUtil.serialize(student.getName()));         
map.put(SerializableUtil.serialize("age"), SerializableUtil.serialize(student.getAge()));         
connection.hMSet(SerializableUtil.serialize(id), map);     
}
     
@Override     
public Student queryById(int id){         
JedisConnection connection = jedisConnectionFactory.getConnection();         
Map<byte[],byte[]> map = connection.hGetAll(SerializableUtil.serialize(id));         
if(map.size() > 0){             
System.out.println("----進緩存----");             
byte[] byteName = map.get(SerializableUtil.serialize("name"));             
byte[] byteAge = map.get(SerializableUtil.serialize("age"));             
String name = SerializableUtil.unserialize(byteName).toString();             
int age = Integer.valueOf(SerializableUtil.unserialize(byteAge).toString());             
System.out.println(name);             
System.out.println(age);             
Student student = new Student();             
student.setAge(age);             
student.setName(name);                          
return student;         
}else{             
System.out.println("----進資料庫----");             
studentMapper = readonlySQLSession.getMapper(StudentMapper.class);             
return studentMapper.queryById(id);         
}     
}     
public void setJedisConnectionFactory(JedisConnectionFactory jedisConnectionFactory)     {         
this.jedisConnectionFactory = jedisConnectionFactory;     




註意:         
1)這裡我用的資料庫session是做了讀寫分離,並封裝進BaseService中,在你做的時候,把它換成你自己的資料庫Session就可以了!         


2)存數據:                     
這裡我用的向緩存中存對象的方法是用HashMap存的,這個和普通的鍵值對存放的方式有不同。                     


(1)普通鍵值對存放方式:                         
*************************************                         
*        key              *       value       *                         
* ***********************************                         
*        key1            *       value1     *                         
*        key2            *       value2     *                         
*        key3            *       value3     *                         
* ***********************************                     
(2)hashmap存放方式                         
例如我們存放Student對象,id:1,name:student1,age:18,其存放方式為:                         
***********************************************************                         
*        key               *                          value                    *                         
***********************************************************                         
*          1                 *            key           *         value       *                         *                             
***************************************                         
*                             *            name        *        student   *                         
*                             *            age           *        18            *                         
***********************************************************                         
這樣存的好處是鍵值對中的值也是採用鍵值對的方式進行存儲,方便我們取值。         
3)取數據:                   
我們首先根據序列化之後的id,去緩存中取,也是採用hashmap這種方式去取值,同時判斷這個map的大小,如果有值,則取value中的值進行反序列化,然後返回對象,如果沒有,則進資料庫中去取值,然後在放入緩存中! 
測試類: 
public class TestRedis{     
static IStudentService service;          
@BeforeClass     
public static void setUpBefor(){         
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext/applicationContext.xml");         
service = (IStudentService) context.getBean("studentService");     }          
@Test     
public void testAdd(){         
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext/applicationContext.xml");         
IStudentService service = (IStudentService) context.getBean("studentService");                  
Student student = new Student();         
student.setName("student1");         
student.setAge(29);                  
service.add(student);     
}          
@Test     
public void testQuery(){         
int id = 10;         
Student student = service.queryById(id);         
System.out.println(student);     




存的時候緩存中是這樣的: 基本上集成並且帶持久化就是這樣的,這僅是我個人的一點學習心得!  
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1, tnsnames.ora on two nodes:RACTEST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = racscan.test.com)(PORT = 1521)) (CONNECT_DATA = (SERVER = DED ...
  • [20171110]_allow_read_only_corruption參數.txt--//昨天在修改查詢隱含參數腳本時發現一個參數_allow_read_only_corruption,感覺應該可以在異常關閉的情況下以read only打開.--//自己測試看看.1.環境:SYS@book> @ ...
  • 步驟如下: 檢查預設network的network number,紅色字體1,一會兒添加監聽會用到: 查看srvctl添加監聽的語法: 添加監聽:名稱: LISTENER4 埠號:1524 創建完後會在配置文件endpoints_listener.ora和listener.ora中添加記錄信息: ...
  • 寫了下db2巡檢的一個小腳本,只能做常規檢查,減少日常工作量,腳本內容如下:#!/bash/binecho "物理CPU個數為:"cat /proc/cpuinfo| grep "cpu cores"| uniqecho "邏輯CPU個數為:"cat /proc/cpuinfo| grep "pro ...
  • 看到sort_buffer_size這個參數(connect級別的參數,MySQL5.7,預設值是1048576位元組,也就是1MB)的預設值這麼小,想著是不是可以調大一點,反正記憶體動不動幾十個GB的,也不在乎這個幾MB的。註:筆者嘗試修改這個參數的值,在典型的排序(較大的表,排序欄位無所索引的條件下 ...
  • MySQL的存儲過程蠻啰嗦的,與MSSQL或者Oracle的存儲過程相比,如果沒有顯式指定,他會隱含地指定一系列特性(characteristic)的預設值來創建存儲過程 通常在使用圖形界面工具進行存儲過程編寫的時候,圖形界面工具會自動加上這部分內容比,如用HeidiSQL創建存儲過程的時候,會自動 ...
  • 最近每天都在空閑時間努力編寫Apworks框架的案例代碼WeText。在文本發佈和處理微服務中,我打算使用微軟的SQL Server for Linux來做演示,於是也就在自己的docker-compose中加入了MS SQL Server的服務。其實在Docker中運行SQL Server是非常容 ...
  • 1.首先下載IBM的IBM Data Server Client,百度雲鏈接:http://pan.baidu.com/s/1kVBVjan 密碼:2gtz 2.安裝好客戶端之後,打開cmd,運行db2cmd。然後在db2cmd中執行以下步驟。 第一步,創建節點 語法:db2 catalog tcp ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...