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下的安裝十分簡單。
- 下載redis:Redis 沒有官方的Windows版本,但是微軟開源技術團隊(Microsoft Open Tech group)開發和維護着這個 Win64 的版本。所以可以在這里下載releases版本的。https://github.com/MicrosoftArchive/redis/releases。
![]()
redis1.png
解壓出來的目錄:
![]()
redis2.png
- 啟動redis:在這個目錄下cmd,然后直接redis-server.exe redis.windows.conf,即可啟動redis。
![]()
redis3.png
- 修改密碼:在使用之前,先修改一下redis的密碼。在先前那個解壓目錄下,打開redis-cli.exe。
- 輸入config get requirepass可查看當前密碼,這里是我已經改過密碼之后的。
- 然后輸入 config set requirepass "yourpassword" 可修改redis的密碼。
![]()
redis4.png
- 連接redis:這里我是使用的RedisDesktopManager進行連接,這個是一個可視化管理redis的界面工具,下載windows版本的就行。https://redisdesktop.com/download
![]()
redis5.png
然后在這個工具里可使用redis基本操作,這里有一些我已經添加進去的數據:
![]()
redis6.png
3. springboot中redis相關配置
- 在pom中配置redis的相關依賴包:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-redis</artifactId> <version>1.3.8.RELEASE</version> </dependency>
- 上一篇文章中已經寫道,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相關類
- 項目操作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; 