Spring Boot 集成 Redis
3.1 依賴導入
Spring Boot 集成 redis 很方便,只需要導入一個 redis 的 starter 依賴即可。如下:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <!--阿里巴巴fastjson --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.35</version> </dependency>
這里也導入阿里巴巴的 fastjson 是為了在后面我們要存一個實體,為了方便把實體轉換成 json 字符串存進去。
3.2 Redis 配置
導入了依賴之后,我們在 application.yml 文件里配置 redis:
spring: #redis相關配置 redis: database: 5 # 配置redis的主機地址,需要修改成自己的 host: 127.0.0.1 port: 6379 password: 123456 timeout: 5000 jedis: pool: # 連接池中的最大空閑連接,默認值也是8。 max-idle: 500 # 連接池中的最小空閑連接,默認值也是0。 min-idle: 50 # 如果賦值為-1,則表示不限制;如果pool已經(jīng)分配了maxActive個jedis實例,則此時pool的狀態(tài)為exhausted(耗盡) max-active: 1000 # 等待可用連接的最大時間,單位毫秒,默認值為-1,表示永不超時。如果超過等待時間,則直接拋出JedisConnectionException max-wait: 2000
3.3 常用 api 介紹
Spring Boot 對 redis 的支持已經(jīng)非常完善了,豐富的 api 已經(jīng)足夠我們?nèi)粘5拈_發(fā),這里我介紹幾個最常用的供大家學習,其他 api 希望大家自己多學習,多研究。用到會去查即可。
有兩個 redis 模板:RedisTemplate 和 StringRedisTemplate。
我們不使用 RedisTemplate,RedisTemplate 提供給我們操作對象,操作對象的時候,我們通常是以 json 格式存儲,但在存儲的時候,會使用 Redis 默認的內(nèi)部序列化器;導致我們存進里面的是亂碼之類的東西。當然了,我們可以自己定義序列化,但是比較麻煩,所以使用 StringRedisTemplate 模板。
StringRedisTemplate 主要給我們提供字符串操作,我們可以將實體類等轉成 json 字符串即可,在取出來后,也可以轉成相應的對象,這就是上面我導入了阿里 fastjson 的原因。
3.3.1 redis:string 類型
新建一個 RedisService,注入 StringRedisTemplate,使用 stringRedisTemplate.opsForValue()
可以獲取 ValueOperations<String, String> 對象,通過該對象即可讀寫 redis 數(shù)據(jù)庫了。如下:
public class RedisService { @Resource private StringRedisTemplate stringRedisTemplate; /** * set redis: string類型 * @param key key * @param value value */ public void setString(String key, String value){ ValueOperations<String, String> valueOperations = stringRedisTemplate.opsForValue(); valueOperations.set(key, value); } /** * get redis: string類型 * @param key key * @return */ public String getString(String key){ return stringRedisTemplate.opsForValue().get(key); } }
該對象操作的是 string,我們也可以存實體類,只需要將實體類轉換成 json 字符串即可。下面來測試一下:
@RestController @RequestMapping("/redis") public class RedisController { private static final Logger logger = LoggerFactory.getLogger(RedisController.class); @Resource private RedisService redisService; @RequestMapping("/setString") public String setString(){ //測試redis的string類型 redisService.setString("qq","88888888"); logger.info("我的qq號為:{}", redisService.getString("qq")); // 如果是個實體,我們可以使用json工具轉成json字符串, User user = new User(1l,"?子", "123456"); redisService.setString("userInfo", JSON.toJSONString(user)); return "success"; } }
3.3.2 redis:hash 類型
hash 類型其實原理和 string 一樣的,但是有兩個 key,使用 stringRedisTemplate.opsForHash()可以獲取HashOperations<String, Object, Object> 對象。比如我們要存儲訂單信息,所有訂單信息都放在 order 下,針對不同用戶的訂單實體,可以通過用戶的 id 來區(qū)分,這就相當于兩個 key了。
@Service public class RedisService { @Resource private StringRedisTemplate stringRedisTemplate; /** * set redis: hash類型 * @param key key * @param filedKey filedkey * @param value value */ public void setHash(String key, String filedKey, String value){ HashOperations<String, Object, Object> hashOperations = stringRedisTemplate.opsForHash(); hashOperations.put(key,filedKey, value); } /** * get redis: hash類型 * @param key key * @param filedkey filedkey * @return */ public String getHash(String key, String filedkey){ return (String) stringRedisTemplate.opsForHash().get(key, filedkey); } }
測試一下:
User user = new User(1l,"莊子", "123456"); //測試redis的hash類型 redisService.setHash("user", "name", JSON.toJSONString(user)); logger.info("用戶姓名:{}", redisService.getHash("user","name"));
3.3.3 redis:list 類型
使用 stringRedisTemplate.opsForList() 可以獲取 ListOperations<String, String>
listOperations redis 列表對象,該列表是個簡單的字符串列表,可以支持從左側添加,也可以支持
從右側添加,一個列表最多包含 2 ^ 32 -1 個元素
public class RedisService { @Resource private StringRedisTemplate stringRedisTemplate; /** * set redis:list類型 * @param key key * @param value value * @return */ public long setList(String key, String value){ ListOperations<String, String> listOperations = stringRedisTemplate.opsForList(); return listOperations.leftPush(key, value); } /** * get redis:list類型 * @param key key * @param start start * @param end end * @return */ public List<String> getList(String key, long start, long end){ return stringRedisTemplate.opsForList().range(key, start, end); } }
可以看出,這些 api 都是一樣的形式,方便記憶也方便使用。具體的 api 細節(jié)我就不展開了,大家可以
自己看 api 文檔。其實,這些 api 根據(jù)參數(shù)和返回值也能知道它們是做什么用的。來測試一下:
//測試redis的list類型 redisService.setList("list", "football"); redisService.setList("list", "basketball"); List<String> valList = redisService.getList("list",0,-1); for(String value :valList){ logger.info("list中有:{}", value); }