idea整合springboot+redis


1. 前言

上一篇文章整合了springboot+spring mvc+mybatis,基於三層架構搭建了一個接口平台。這篇文章主要整合一下springboot和redis的框架,redis也是目前使用較多的nosql數據庫。

這篇文章的整個項目框架都是基於上一篇文章的,所以很多配置或者代碼不會寫完。

2. redis簡介與環境搭建

2.1 redis簡介

redis是一個key-value。和Memcached類似,它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(哈希類型)。這些數據類型都支持push/pop、add/remove及取交集並集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,redis支持各種不同方式的排序。與memcached一樣,為了保證效率,數據都是緩存在內存中。區別的是redis會周期性的把更新的數據寫入磁盤或者把修改操作寫入追加的記錄文件,並且在此基礎上實現了master-slave(主從)同步。(來自百度百科)

Redis 是一個開源(BSD許可)的,內存中的數據結構存儲系統,它可以用作數據庫、緩存和消息中間件。 它支持多種類型的數據結構,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets)與范圍查詢, bitmaps, hyperloglogs和 地理空間(geospatial)索引半徑查詢。 Redis 內置了 復制(replication),LUA腳本(Lua scripting), LRU驅動事件(LRU eviction),事務(transactions)和不同級別的 磁盤持久化(persistence), 並通過 Redis哨兵(Sentinel)和自動 分區(Cluster)提供高可用性(high availability)。(來自redis中文官方網站)

這里貼上redis中文網地址,很好的一個redis學習網站。redis中文官方網站

2.2. redis特點

  • Redis將其數據庫完全保存在內存中,僅使用磁盤進行持久化。
  • 與其它鍵值數據存儲相比,Redis有一組相對豐富的數據類型。
  • Redis可以將數據復制到任意數量的從機中。

2.3. redis優點

  • 異常快 - Redis非常快,每秒可執行大約110000次的設置(SET)操作,每秒大約可執行81000次的讀取/獲取(GET)操作。
  • 支持豐富的數據類型 - Redis支持開發人員常用的大多數數據類型,例如列表,集合,排序集和散列等等。這使得Redis很容易被用來解決各種問題,因為我們知道哪些問題可以更好使用地哪些數據類型來處理解決。
  • 操作具有原子性 - 所有Redis操作都是原子操作,這確保如果兩個客戶端並發訪問,Redis服務器能接收更新的值。
  • 多實用工具 - Redis是一個多實用工具,可用於多種用例,如:緩存,消息隊列(Redis本地支持發布/訂閱),應用程序中的任何短期數據,例如,web應用程序中的會話,網頁命中計數等。

2.4 redis安裝

因為電腦是Windows系統,這里就介紹一下Windows系統下的安裝。linux系統下的安裝請另行百度。redis在Windows下的安裝十分簡單。

  1. 下載redis:Redis 沒有官方的Windows版本,但是微軟開源技術團隊(Microsoft Open Tech group)開發和維護着這個 Win64 的版本。所以可以在這里下載releases版本的。https://github.com/MicrosoftArchive/redis/releases
 

 

 

redis1.png

解壓出來的目錄:

 

 

 

redis2.png
  1. 啟動redis:在這個目錄下cmd,然后直接redis-server.exe redis.windows.conf,即可啟動redis。
 

 

 

redis3.png
  1. 修改密碼:在使用之前,先修改一下redis的密碼。在先前那個解壓目錄下,打開redis-cli.exe。
  • 輸入config get requirepass可查看當前密碼,這里是我已經改過密碼之后的。
  • 然后輸入 config set requirepass "yourpassword" 可修改redis的密碼。
 

 

 

redis4.png
  1. 連接redis:這里我是使用的RedisDesktopManager進行連接,這個是一個可視化管理redis的界面工具,下載windows版本的就行。https://redisdesktop.com/download
 

 

 

redis5.png

然后在這個工具里可使用redis基本操作,這里有一些我已經添加進去的數據:

 

 

 

redis6.png

3. springboot中redis相關配置

  1. 在pom中配置redis的相關依賴包:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-redis</artifactId> <version>1.3.8.RELEASE</version> </dependency> 
  1. 上一篇文章中已經寫道,springboot的習慣優於配置。也在項目中使用了application.yml文件配置mysql的基本配置項。這里也在application.yml里面配置redis的配置項。
spring: datasource: # 驅動配置信息 url: jdbc:mysql://localhost:3306/spring_boot?useUnicode=true&characterEncoding=utf8 username: root password: root type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.jdbc.Driver # 連接池的配置信息 filters: stat maxActive: 20 initialSize: 1 maxWait: 60000 minIdle: 1 timeBetweenEvictionRunsMillis: 60000 minEvictableIdleTimeMillis: 300000 validationQuery: select 'x' testWhileIdle: true testOnBorrow: false testOnReturn: false poolPreparedStatements: true maxOpenPreparedStatements: 20 redis: host: 127.0.0.1 port: 6379 password: pass1234 pool: max-active: 100 max-idle: 10 max-wait: 100000 timeout: 0 

比上一篇文章中多的就是redis下面的幾個,分別是主機,端口和密碼,其他還有很多配置項,具體可另在網上搜索了解。

4. springboot中redis相關類

  1. 項目操作redis是使用的RedisTemplate方式,另外還可以完全使用JedisPool和Jedis來操作redis。整合的內容也是從網上收集整合而來,網上整合的方式和方法非常的多,有使用注解形式的,有使用Jackson2JsonRedisSerializer來序列化和反序列化key value的值等等,很多很多。這里使用的是我認為比較容易理解和掌握的,基於JedisPool配置,使用RedisTemplate來操作redis的方式。
  • redis單獨放在一個包redis里,在包里先創建RedisConfig.java文件。

RedisConfig.java

以上三個方法分別為獲取JedisPoolConfig配置、獲取JedisConnectionFactory工廠和獲取RedisTemplate模板。
@Configuration 注解是用於定義配置類,可替換xml配置文件,被注解的類內部包含有一個或多個被@Bean注解的方法,這些方法將會被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext類進行掃描,並用於構建bean定義,初始化Spring容器。
@EnableAutoConfiguration 注解是啟用Spring應用程序上下文的自動配置,嘗試猜測和配置您可能需要的bean。自動配置類通常基於類路徑和定義的bean應用。
@ConfigurationProperties 注解是用於讀取配置文件的信息,在這里是讀取配置在yml里的redis的相關配置項。
@Bean 注解用在方法上,告訴Spring容器,你可以從下面這個方法中拿到一個Bean

  • 在包里創建RedisService接口,在這個接口定義了一些redis的基本操作。在這里我把所有存取操作都封裝成了基於json字符串完成,就沒有對於list或者對於object等單獨定義方法。所有的數據類型的存儲都由代碼轉換成json字符串方式進行。所以這里就只有四個方法。

RedisService.java

public interface RedisService { /** * set存數據 * @param key * @param value * @return */ boolean set(String key, String value); /** * get獲取數據 * @param key * @return */ String get(String key); /** * 設置有效天數 * @param key * @param expire * @return */ boolean expire(String key, long expire); /** * 移除數據 * @param key * @return */ boolean remove(String key); } 
  • 在包里創建RedisService接口的實現類RedisServiceImpl,這個類實現了接口的所有方法。

RedisServiceImpl.java

@Service("redisService") public class RedisServiceImpl implements RedisService { @Resource private RedisTemplate<String, ?> redisTemplate; @Override public boolean set(final String key, final String value) { boolean result = redisTemplate.execute(new RedisCallback<Boolean>() { @Override public Boolean doInRedis(RedisConnection connection) throws DataAccessException { RedisSerializer<String> serializer = redisTemplate.getStringSerializer(); connection.set(serializer.serialize(key), serializer.serialize(value)); return true; } }); return result; } @Override public String get(final String key) { String result = redisTemplate.execute(new RedisCallback<String>() { @Override public String doInRedis(RedisConnection connection) throws DataAccessException { RedisSerializer<String> serializer = redisTemplate.getStringSerializer(); byte[] value = connection.get(serializer.serialize(key)); return serializer.deserialize(value); } }); return result; } @Override public boolean expire(final String key, long expire) { return redisTemplate.expire(key, expire, TimeUnit.SECONDS); } @Override public boolean remove(final String key) { boolean result = redisTemplate.execute(new RedisCallback<Boolean>() { @Override public Boolean doInRedis(RedisConnection connection) throws DataAccessException { RedisSerializer<String> serializer = redisTemplate.getStringSerializer(); connection.del(key.getBytes()); return true; } }); return result; } } 

在這里execute()方法具體的底層沒有去研究,只知道這樣能實現對於redis數據的操作。
redis保存的數據會在內存和硬盤上存儲,所以需要做序列化;這個里面使用的StringRedisSerializer來做序列化,不過這個方式的泛型指定的是String,只能傳String進來。所以項目中采用json字符串做redis的交互。

到此,redis在springboot中的整合已經完畢,下面就來測試使用一下。

5. springboot項目中使用redis

在這里就直接使用springboot項目中自帶的單元測試類SpringbootApplicationTests進行測試。

SpringbootApplicationTests.java

@RunWith(SpringRunner.class) @SpringBootTest public class SpringbootApplicationTests { private JSONObject json = new JSONObject(); @Autowired private RedisService redisService; @Test public void contextLoads() throws Exception { } /** * 插入字符串 */ @Test public void setString() { redisService.set("redis_string_test", "springboot redis test"); } /** * 獲取字符串 */ @Test public void getString() { String result = redisService.get("redis_string_test"); System.out.println(result); } /** * 插入對象 */ @Test public void setObject() { Person person = new Person("person", "male"); redisService.set("redis_obj_test", json.toJSONString(person)); } /** * 獲取對象 */ @Test public void getObject() { String result = redisService.get("redis_obj_test"); Person person = json.parseObject(result, Person.class); System.out.println(json.toJSONString(person)); } /** * 插入對象List */ @Test public void setList() { Person person1 = new Person("person1", "male"); Person person2 = new Person("person2", "female"); Person person3 = new Person("person3", "male"); List<Person> list = new ArrayList<>(); list.add(person1); list.add(person2); list.add(person3); redisService.set("redis_list_test", json.toJSONString(list)); } /** * 獲取list */ @Test public void getList() { String result = redisService.get("redis_list_test"); List<String> list = json.parseArray(result, String.class); System.out.println(list); } @Test public void remove() { redisService.remove("redis_test"); } } class Person { private String name; private String sex; public Person() { } public Person(String name, String sex) { this.name = name; this.sex = sex; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } } 

在這里先是用@Autowired注解把redisService注入進來,然后由於是使用json字符串進行交互,所以引入fastjson的JSONObject類。然后為了方便,直接在這個測試類里面加了一個Person的內部類。

一共測試了:對於string類型的存取,對於object類型的存取,對於list類型的存取,其實本質都是轉成了json字符串。還有就是根據key來執行remove操作。

獲取字符串:


 

 

 

redis7.png

獲取對象:


 

 

 

redis8.png

獲取list:


 

 

 

redis9.png

redis管理客戶端數據:


 

 

 

redis10.png

到此,測試完成,對於常用的一些數據類型的轉換存取操作也基本調試通過。所以本文對於springboot整合redis到此結束。

小生水平有限,不喜勿噴。這是我在學習、工作過程中,經歷和使用后整合的基礎教程,非常簡單和基礎,只適合新手學習。

有很多不足之處,另外也還有很多其他方式方法,希望各位大大不吝賜教。



作者:你想要怎樣的未來
鏈接:https://www.jianshu.com/p/19628db2e7ef
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM