Spring-data-redis為spring-data模組中對redis的支援部分,簡稱為“SDR”,提供了基於jedis客戶端API的高度封裝以及與spring容器的整合,事實上jedis客戶端已經足夠簡單和輕量級,而spring-data-redis反而有「過度設計」的嫌疑。
jedis用戶端在程式實作方面存在以下不足:
1) connection管理缺乏自動化,connection-pool的設計缺乏必要的容器支援。
2) 資料操作需要關注“序列化”/“反序列化”,因為jedis的客戶端API接受的資料類型為string和byte,對結構化資料(json,xml,pojo)操作需要額外的支持。
3) 事務操作純粹為硬編碼
4) pub/sub功能,缺乏必要的設計模式支持,對於開發者而言需要關注的太多。
1. Redis使用場景
Redis是一個開源的使用ANSI C語言編寫、支援網路、可基於記憶體亦可持久化的日誌型、Key-Value資料庫,並提供多種語言的API。
我們都知道,在日常的應用中,資料庫瓶頸是最容易出現的。資料量太大且頻繁的查詢,由於磁碟IO效能的局限性,導致專案的效能越來越低。
這時候,基於記憶體的快取框架,就能解決我們很多問題。例如Memcache,Redis等。將一些頻繁使用的資料放入快取讀取,大大降低了資料庫的負擔。提升了系統的性能。其實,對於hibernate以及Mybatis的二級緩存,是同樣的道理。利用記憶體高速的讀寫速度,來解決硬碟的瓶頸。
2. 配置使用redis
在applicationContext-dao.xml中配置如下:
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
#
豆>
豆>
豆>
豆>
database.properties檔案如下:
# redis.maxIdle=10
# redis.maxActive=20
# redis.maxWait=10000
redis.testOnBorrow=true
# redis.host=192.168.1.76
# redis.port=6379
# redis.pass=password1
##spring-data-redis提供了多種序列化器策略,這對於使用jedis的開發者而言,實際上非常便捷。sdr提供了 4種內建的序列化器:
# JacksonJsonRedisSerializer:json格式存儲,jackson-json工具提供了javabean與json之間的轉換能力,可以將pojo實例序列化成json格式儲存在redis中,也可以將json格式的資料轉換成pojo實例。因為jackson工具在序列化和反序列化時,需要明確指定Class類型,因此此策略封裝起來稍微複雜。 【需要jackson-mapper-asl工具支援】
OxmSerializer:xml格式存儲,提供了將javabean與xml之間的轉換能力,目前可用的三方支援包括jaxb,apache-xmlbeans;redis儲存的資料將是xml工具。不過使用此策略,程式設計將會有些難度,而且效率最低;不建議使用。 【需要spring-oxm模組的支援】
# 其中JdkSerializationRedisSerializer和StringRedisSerializer是最基礎的序列化策略,其中「JacksonJsonRedisSerializer」與「OxmSerializer」都是基於stirng存儲,因此它們是較為「高級」的序列化(最終還是使用string解析以及構建java)。針對「序列化和發序列化」中JdkSerializationRedisSerializer和StringRedisSerializer是最基礎的策略,原則上,我們可以將資料儲存為任何格式以便應用程式存取和解析(其中應用程式包括app,hadoop等其他工具),不過在設計時仍然不建議直接使用“JacksonJsonRedisSerializer”和“OxmSerializer”,因為無論是json還是xml,他們本身仍然是String。如果你的資料需要被第三方工具解析,那麼資料應該使用StringRedisSerializer而不是JdkSerializationRedisSerializer。
RedisTemplate中需要宣告4種serializer,預設為「JdkSerializationRedisSerializer」:
1) keySerializer :對於普通K-V操作時,key採取的序列化策略
2) valueSerializer:value採取的序列化策略
3) hashKeySerializer: 在hash資料結構中,hash-key的序列化策略
# 4) hashValueSerializer:hash-value的序列化策略
# 無論如何,建議key/hashKey採用StringRedisSerializer。
spring-data-redis針對jedis提供以下功能:
#1. 連結池自動管理,提供了一個高度封裝的「RedisTemplate」類別
# 2. 針對jedis客戶端中大量api進行了歸類封裝,將相同類型作業封裝為operation介面
# ValueOperations:簡單K-V操作
# SetOperations:set類型資料操作
# ZSetOperations:zset類型資料操作
# HashOperations:針對map類型的資料操作
# ListOperations:針對list類型的資料操作
# 3. 提供了對key的「bound」(綁定)便捷化操作API,可以透過bound封裝指定的key,然後進行一系列的操作而無須「顯式」的再次指定Key,即BoundKeyOperations:
# BoundValueOperations
BoundSetOperations
BoundListOperations
BoundSetOperations
BoundHashOperations
3. RedisTemplate的使用
這個類別作為一個模版類,提供了很多快速使用redis的api,而不需要自己來維護連接,事務。最初的時候,我創建的BaseRedisDao是繼承自這個類別的。繼承的好處是我的每個Dao中,都可以自由的控制序列化器,自由的控制自己是否需要事務,這個先不需要了解,跟著我目前的這種配置方法來即可。 template提供了一系列的operation,例如valueOperation,HashOperation,ListOperation,SetOperation等,用來操作不同資料類型的Redis。並且,RedisTemplate也提供了對應的*OperationsEditor,用來透過RedisTemplate直接注入對應的Operation。
核心程式碼:
package com.npf.dao.impl;
#
# import java.util.ArrayList;
# import java.util.List;
# import java.util.Map;
import java.util.Map.Entry;
#
# import javax.annotation.Resource;
#
# import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.HashOperations;
# import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Repository;
# 導入 com.npf.dao.StudentDao;
導入 com.npf.model.Student;
@儲存庫
# 公共類別 StudentDaoImpl 實作 StudentDao{
# @Autowired
#
私有 RedisTemplate
@Resource(name="redisTemplate")
私有 HashOperations
公共靜態最終字符串學生=“學生”;
@覆蓋
公無效保存(學生學生){
# opsForHash.put(學生,學生.getId(),學生);
}
# @覆蓋
公共學生查找(字串id){
# 學生學生 = opsForHash.get(STUDENT, id);
回國學生;
}
# @覆蓋
公無效刪除(字串id){
# opsForHash.delete(學生, id);
}
# @覆蓋
公開無效更新(學生學生){
# opsForHash.put(學生,學生.getId(),學生);
}
# @覆蓋
公開列表找到所有() { ########### 地圖條目 = opsForHash.entries(學生);
列表 StuList = new ArrayList
for(Entry
# StuList.add(entry.getValue());
}
# 返回stuList;
}
# }
# 控制層程式碼如下:
包 com.npf.controller;
導入 java.util.List;
導入 java.util.UUID;
導入 org.springframework.beans.factory.annotation.Autowired;
導入org.springframework.stereotype.Controller;
導入org.springframework.ui.Model;
導入 org.springframework.web.bind.annotation.RequestMapping;
導入 org.springframework.web.bind.annotation.RequestParam;
導入 com.npf.model.Student;
導入 com.npf.service.StudentService;
# @控制器 ########### 公共類別 StudentController {
# @Autowired
# 私人學生服務學生服務;
@RequestMapping("/student/save")
# 公有字串 saveStudent(學生學生){
# String id = UUID.randomUUID().toString();
System.out.println(id);
學生.setId(id);
StudentService.save(學生);
return「重定向:/student/find/all」;
}
# @RequestMapping("/student/update")
# 公共字串 updateStudent(學生學生){
# StudentService.update(學生);
return「重定向:/student/find/all」;
}
# @RequestMapping("/student/to/save/form")
# 公有字串toSaveStudentForm(){
返回「保存」;
}
# @RequestMapping("/student/delete")
# 公共字串deleteStudent(@RequestParam(“id”)字串id){
# StudentService.delete(id);
return「重定向:/student/find/all」;
}
# @RequestMapping("/student/to/update/form")
public String toUpdateStudentForm(@RequestParam("id") String id,Model model){
學生stu=studentService.find(id);
model.addAttribute("stu", stu);
返回“更新”;
}
# @RequestMapping("/student/find/all")
# 公共字串findStudents(模型模型){
列表 StuList=studentService.findAll();
model.addAttribute("stuList", stuList);
返回“列表”;
}
#
以上是怎麼設定使用redis的詳細內容。更多資訊請關注PHP中文網其他相關文章!