首頁 > 資料庫 > Redis > 主體

怎麼設定使用redis

王林
發布: 2023-05-31 23:31:17
轉載
1693 人瀏覽過

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中配置如下:

  1.   

  2.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  

  3.     xmlns:context="http://www.springframework.org/schema/context"      

  4. #########################################################################。     xmlns:mongo="http://www.springframework.org/schema/data/mongo"     #####################################################################################################################     xmlns:aop="http://www.springframework.org/schema/aop"   ##############################################################################     xsi:schemaLocation="http://www.springframework.org/schema/beans      ############################################################################################################################################################################################################################################################'             http://www.springframework.org/schema/beans/spring-beans-3.0.xsd     #################################################################################1             http://www.springframework.org/schema/data/mongo     ###############################################################             http://www.springframework.org/schema/data/mongo/spring-mongo.xsd   #############             http://www.springframework.org/schema/context     #############################################################         http://www.springframework.org/schema/context/spring-context-3.0.xsd   ##############         http://www.springframework.org/schema/aop   #############         http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">     #####################    #############        #############            #############        ##############                ######################1                #############1                ###

  5. #

  6. ;

  7. ;

  8. ;

  9. >

  10. >

  11. >

database.properties檔案如下:

  1. # redis.maxIdle=10  

  2. # redis.maxActive=20  

  3. # redis.maxWait=10000  

  4. redis.testOnBorrow=true  

  5. # redis.host=192.168.1.76  

  6. # redis.port=6379  

  7. # redis.pass=password1  

##spring-data-redis提供了多種序列化器策略,這對於使用jedis的開發者而言,實際上非常便捷。sdr提供了 4種內建的序列化器:

  • # JdkSerializationRedisSerializer:利用JDK的序列化手段(serializing接口,ObjectInputStrean,ObjectOutputStream),資料以字節流存儲,POJO物件的存取場景,利用JDK本身序列化機制,將pojo類別透過ObjectInputStream/ObjectOutputStream進行序列化操作,最終redis-server中將儲存位元組序列,是目前最常用的序列化策略。

  • # StringRedisSerializer:字串編碼,資料以字串存儲,Key或value為字串的場景,根據指定的字元集對資料的位元組序列編碼成字串,是“new String(bytes, charset)”和“string .getBytes( charset)”的直接封裝。是最輕量級和高效的策略。

  • # 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。
核心程式碼:

  1. package com.npf.dao.impl;  

  2. #   

  3. # import java.util.ArrayList;  

  4. # import java.util.List;  

  5. # import java.util.Map;  

  6. import java.util.Map.Entry;  

  7. #   

  8. # import javax.annotation.Resource;  

  9. #   

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

  11. import org.springframework.data.redis.core.HashOperations;  

  12. # import org.springframework.data.redis.core.RedisTemplate;  

  13. import org.springframework.stereotype.Repository;  

  14. # 導入 com.npf.dao.StudentDao;

  15. 導入 com.npf.model.Student;

  16. @儲存庫

  17. # 公共類別 StudentDaoImpl 實作 StudentDao{  

  18. # @Autowired

  19. # 私有 RedisTemplate redis模板;

  20. @Resource(name="redisTemplate")  

  21. 私有 HashOperations opsForHash;

  22. 公共靜態最終字符串學生=“學生”;

  23. @覆蓋

  24. 公無效保存(學生學生){  

  25. # opsForHash.put(學生,學生.getId(),學生);

  26. }  

  27. # @覆蓋

  28. 公共學生查找(字串id){  

  29. # 學生學生 = opsForHash.get(STUDENT, id);

  30. 回國學生;

  31. }  

  32. # @覆蓋

  33. 公無效刪除(字串id){  

  34. # opsForHash.delete(學生, id);

  35. }  

  36. # @覆蓋

  37. 公開無效更新(學生學生){  

  38. # opsForHash.put(學生,學生.getId(),學生);

  39. }  

  40. # @覆蓋

  41. 公開列表找到所有() { ########### 地圖條目 = opsForHash.entries(學生);

  42. 列表 StuList = new ArrayList();

  43. for(Entryentry:entries.entrySet()){  

  44. # StuList.add(entry.getValue());

  45. }  

  46. # 返回stuList;

  47. }  

  48. # }  

  49. # 控制層程式碼如下:

包 com.npf.controller;

  1. 導入 java.util.List;

  2. 導入 java.util.UUID;

  3. 導入 org.springframework.beans.factory.annotation.Autowired;

  4. 導入org.springframework.stereotype.Controller;

  5. 導入org.springframework.ui.Model;

  6. 導入 org.springframework.web.bind.annotation.RequestMapping;

  7. 導入 org.springframework.web.bind.annotation.RequestParam;

  8. 導入 com.npf.model.Student;

  9. 導入 com.npf.service.StudentService;

  10. # @控制器 ########### 公共類別 StudentController {  

  11. # @Autowired

  12. # 私人學生服務學生服務;

  13. @RequestMapping("/student/save")  

  14. # 公有字串 saveStudent(學生學生){  

  15. # String id = UUID.randomUUID().toString();

  16. System.out.println(id);

  17. 學生.setId(id);

  18. StudentService.save(學生);

  19. return「重定向:/student/find/all」;

  20. }  

  21. # @RequestMapping("/student/update")  

  22. # 公共字串 updateStudent(學生學生){  

  23. # StudentService.update(學生);

  24. return「重定向:/student/find/all」;

  25. }  

  26. # @RequestMapping("/student/to/save/form")  

  27. # 公有字串toSaveStudentForm(){  

  28. 返回「保存」;

  29. }  

  30. # @RequestMapping("/student/delete")  

  31. # 公共字串deleteStudent(@RequestParam(“id”)字串id){  

  32. # StudentService.delete(id);

  33. return「重定向:/student/find/all」;

  34. }  

  35. # @RequestMapping("/student/to/update/form")  

  36. public String toUpdateStudentForm(@RequestParam("id") String id,Model model){  

  37. 學生stu=studentService.find(id);

  38. model.addAttribute("stu", stu);

  39. 返回“更新”;

  40. }  

  41. # @RequestMapping("/student/find/all")  

  42. # 公共字串findStudents(模型模型){  

  43. 列表 StuList=studentService.findAll();

  44. model.addAttribute("stuList", stuList);

  45. 返回“列表”;

  46. }  

  47. #  

  48. ##

以上是怎麼設定使用redis的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:yisu.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!