Our-task介紹
本篇博客是我github上our-task:一個完整的清單管理系統的配套教程文檔,這是SpringBoot+Vue開發的前后端分離清單管理工具,仿滴答清單。目前已部署在阿里云ECS上,可進行在線預覽,隨意使用(附詳細教程),大家感興趣的話,歡迎給個star!
阿里云預覽地址
Redis的安裝與配置
Windows下redis的安裝與配置
SpringBoot整合Redis
添加項目依賴
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
?<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!--redis依賴配置--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>
</dependencies>
yml文件配置
yml文件中主要是關于Redis的配置,其中鍵的設置格式為:數據庫名:表名:id,更多Redis了解,請大家參考這篇文章。
Redis各種鍵的典型使用場景,不清楚的都來看一下
# DataSource Config
spring:redis:# Redis服務器地址host: localhost# Redis數據庫索引(默認為0)database: 0# Redis服務器連接端口port: 6379# Redis服務器連接密碼(默認為空)password:jedis:pool:# 連接池最大連接數(使用負值表示沒有限制)max-active: 8# 連接池最大阻塞等待時間(使用負值表示沒有限制)max-wait: -1ms# 連接池中的最大空閑連接max-idle: 8# 連接池中的最小空閑連接min-idle: 0# 連接超時時間(毫秒)timeout: 3000ms
?
# 自定義redis key
redis:database: "study"key:user: "user"expire:common: 86400 # 24小時
實體類
新建entity包,在該包下新建User類,用作該Demo的操作實體。考慮到一些小白可能還不了解Lombok,我就直接使用Setter/Getter。
package com.example.demo.entity;
?
/*** @program: SpringBoot-Redis-Demo* @description: 用戶類* @author: water76016* @create: 2020-12-29 09:22**/
public class User {Integer id;String username;String password;
?public User(Integer id, String username, String password) {this.id = id;this.username = username;this.password = password;}
?@Overridepublic String toString() {return "User{" +"username='" + username + ''' +", password='" + password + ''' +'}';}
?public Integer getId() {return id;}
?public void setId(Integer id) {this.id = id;}
?public String getUsername() {return username;}
?public void setUsername(String username) {this.username = username;}
?public String getPassword() {return password;}
?public void setPassword(String password) {this.password = password;}
}
Service服務接口
服務接口一共有兩個:一個是UserService,一個是RedisService。UserService提供了針對User實體的服務,RedisService提供操作Reids的服務接口。
package com.example.demo.service;
?
import com.example.demo.entity.User;
?
public interface UserService {/*** 對用戶打招呼,返回user的toString()方法* @param user* @return*/public String helloUser(User user);
}
package com.example.demo.service;
?
import java.util.List;
import java.util.Map;
import java.util.Set;
?
?
/*** @program: our-task* @description: redis操作服務類* @author: water76016* @create: 2020-09-24 16:45**/
public interface RedisService {
?/*** 保存屬性** @param key the key* @param value the value* @param time the time*/void set(String key, Object value, long time);
?/*** 保存屬性** @param key 鍵* @param value 值*/void set(String key, Object value);
?/*** 獲取屬性** @param key the key* @return the object*/Object get(String key);
?/*** 刪除屬性** @param key the key* @return the boolean*/Boolean del(String key);
?/*** 批量刪除屬性** @param keys the keys* @return the long*/Long del(List<String> keys);
?/*** 設置過期時間** @param key the key* @param time the time* @return the boolean*/Boolean expire(String key, long time);
?/*** 獲取過期時間** @param key the key* @return the expire*/Long getExpire(String key);
?/*** 判斷是否有該屬性** @param key the key* @return the boolean*/Boolean hasKey(String key);
?/*** 按delta遞增** @param key the key* @param delta the delta* @return the long*/Long incr(String key, long delta);
?/*** 按delta遞減** @param key the key* @param delta the delta* @return the long*/Long decr(String key, long delta);
?/*** 獲取Hash結構中的屬性** @param key the key* @param hashKey the hash key* @return the object*/Object hGet(String key, String hashKey);
?/*** 向Hash結構中放入一個屬性** @param key the key* @param hashKey the hash key* @param value the value* @param time the time* @return the boolean*/Boolean hSet(String key, String hashKey, Object value, long time);
?/*** 向Hash結構中放入一個屬性** @param key the key* @param hashKey the hash key* @param value the value*/void hSet(String key, String hashKey, Object value);
?/*** 直接獲取整個Hash結構** @param key the key* @return the map*/Map<Object, Object> hGetAll(String key);
?/*** 直接設置整個Hash結構** @param key the key* @param map the map* @param time the time* @return the boolean*/Boolean hSetAll(String key, Map<String, Object> map, long time);
?/*** 直接設置整個Hash結構** @param key the key* @param map the map*/void hSetAll(String key, Map<String, Object> map);
?/*** 刪除Hash結構中的屬性** @param key the key* @param hashKey the hash key*/void hDel(String key, Object... hashKey);
?/*** 判斷Hash結構中是否有該屬性** @param key the key* @param hashKey the hash key* @return the boolean*/Boolean hHasKey(String key, String hashKey);
?/*** Hash結構中屬性遞增** @param key the key* @param hashKey the hash key* @param delta the delta* @return the long*/Long hIncr(String key, String hashKey, Long delta);
?/*** Hash結構中屬性遞減** @param key the key* @param hashKey the hash key* @param delta the delta* @return the long*/Long hDecr(String key, String hashKey, Long delta);
?/*** 獲取Set結構** @param key the key* @return the set*/Set<Object> sMembers(String key);
?/*** 向Set結構中添加屬性** @param key the key* @param values the values* @return the long*/Long sAdd(String key, Object... values);
?/*** 向Set結構中添加屬性** @param key the key* @param time the time* @param values the values* @return the long*/Long sAdd(String key, long time, Object... values);
?/*** 是否為Set中的屬性** @param key the key* @param value the value* @return the boolean*/Boolean sIsMember(String key, Object value);
?/*** 獲取Set結構的長度** @param key the key* @return the long*/Long sSize(String key);
?/*** 刪除Set結構中的屬性** @param key the key* @param values the values* @return the long*/Long sRemove(String key, Object... values);
?/*** 獲取List結構中的屬性** @param key the key* @param start the start* @param end the end* @return the list*/List<Object> lRange(String key, long start, long end);
?/*** 獲取List結構的長度** @param key the key* @return the long*/Long lSize(String key);
?/*** 根據索引獲取List中的屬性** @param key the key* @param index the index* @return the object*/Object lIndex(String key, long index);
?/*** 向List結構中添加屬性** @param key the key* @param value the value* @return the long*/Long lPush(String key, Object value);
?/*** 向List結構中添加屬性** @param key the key* @param value the value* @param time the time* @return the long*/Long lPush(String key, Object value, long time);
?/*** 向List結構中批量添加屬性** @param key the key* @param values the values* @return the long*/Long lPushAll(String key, Object... values);
?/*** 向List結構中批量添加屬性** @param key the key* @param time the time* @param values the values* @return the long*/Long lPushAll(String key, Long time, Object... values);
?/*** 從List結構中移除屬性** @param key the key* @param count the count* @param value the value* @return the long*/Long lRemove(String key, long count, Object value);
}
Service實現類
在UserService中,我們把用戶的信息存儲在Redis中。調用了RedisService的方法,同時給該鍵設置過期時間。大家在操作的時候,直接使用RedisService中的方法就可以了,這些方法還是挺全的。
package com.example.demo.service.impl;
?
import com.example.demo.entity.User;
import com.example.demo.service.RedisService;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
?
/*** @program: SpringBoot-Redis-Demo* @description: 用戶服務實現類* @author: water76016* @create: 2020-12-29 09:24**/
@Service
public class UserServiceImpl implements UserService {@AutowiredRedisService redisService;
?@Value("${redis.database}")private String redisDatabase;@Value("${redis.key.user}")private String redisUserKey;@Value("${redis.expire.common}")private long expire;/*** 對用戶打招呼,返回user的toString()方法** @param user* @return*/@Overridepublic String helloUser(User user) {//設置鍵,鍵的格式為:數據庫名:user:用戶idString key = redisDatabase + ":" + redisUserKey + ":" + user.getId();//把用戶的toString,存在這個鍵里面redisService.set(key, user.toString());//設置鍵的過期時間redisService.expire(key, expire);return user.toString();}
}
package com.example.demo.service.impl;
?
import com.example.demo.service.RedisService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.stereotype.Service;
?
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;
?
/*** @program: our-task* @description: redis操作服務接口實現類* @author: water76016* @create: 2020-09-24 16:45**/
@Service
public class RedisServiceImpl implements RedisService {/*** 由于沒有指定具體類型<String, Object>,用Resource注入才有效* */@Resourceprivate RedisTemplate redisTemplate;
?@Autowired(required = false)public void setRedisTemplate(RedisTemplate redisTemplate) {RedisSerializer stringSerializer = new StringRedisSerializer();redisTemplate.setKeySerializer(stringSerializer);redisTemplate.setValueSerializer(stringSerializer);redisTemplate.setHashKeySerializer(stringSerializer);redisTemplate.setHashValueSerializer(stringSerializer);this.redisTemplate = redisTemplate;}@Overridepublic void set(String key, Object value, long time) {redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);}
?@Overridepublic void set(String key, Object value) {
?redisTemplate.opsForValue().set(key, value);}
?@Overridepublic Object get(String key) {return redisTemplate.opsForValue().get(key);}
?@Overridepublic Boolean del(String key) {return redisTemplate.delete(key);}
?@Overridepublic Long del(List<String> keys) {return redisTemplate.delete(keys);}
?@Overridepublic Boolean expire(String key, long time) {return redisTemplate.expire(key, time, TimeUnit.SECONDS);}
?@Overridepublic Long getExpire(String key) {return redisTemplate.getExpire(key, TimeUnit.SECONDS);}
?@Overridepublic Boolean hasKey(String key) {return redisTemplate.hasKey(key);}
?@Overridepublic Long incr(String key, long delta) {return redisTemplate.opsForValue().increment(key, delta);}
?@Overridepublic Long decr(String key, long delta) {return redisTemplate.opsForValue().increment(key, -delta);}
?@Overridepublic Object hGet(String key, String hashKey) {return redisTemplate.opsForHash().get(key, hashKey);}
?@Overridepublic Boolean hSet(String key, String hashKey, Object value, long time) {redisTemplate.opsForHash().put(key, hashKey, value);return expire(key, time);}
?@Overridepublic void hSet(String key, String hashKey, Object value) {redisTemplate.opsForHash().put(key, hashKey, value);}
?@Overridepublic Map<Object, Object> hGetAll(String key) {return redisTemplate.opsForHash().entries(key);}
?@Overridepublic Boolean hSetAll(String key, Map<String, Object> map, long time) {redisTemplate.opsForHash().putAll(key, map);return expire(key, time);}
?@Overridepublic void hSetAll(String key, Map<String, Object> map) {redisTemplate.opsForHash().putAll(key, map);}
?@Overridepublic void hDel(String key, Object... hashKey) {redisTemplate.opsForHash().delete(key, hashKey);}
?@Overridepublic Boolean hHasKey(String key, String hashKey) {return redisTemplate.opsForHash().hasKey(key, hashKey);}
?@Overridepublic Long hIncr(String key, String hashKey, Long delta) {return redisTemplate.opsForHash().increment(key, hashKey, delta);}
?@Overridepublic Long hDecr(String key, String hashKey, Long delta) {return redisTemplate.opsForHash().increment(key, hashKey, -delta);}
?@Overridepublic Set<Object> sMembers(String key) {return redisTemplate.opsForSet().members(key);}
?@Overridepublic Long sAdd(String key, Object... values) {return redisTemplate.opsForSet().add(key, values);}
?@Overridepublic Long sAdd(String key, long time, Object... values) {Long count = redisTemplate.opsForSet().add(key, values);expire(key, time);return count;}
?@Overridepublic Boolean sIsMember(String key, Object value) {return redisTemplate.opsForSet().isMember(key, value);}
?@Overridepublic Long sSize(String key) {return redisTemplate.opsForSet().size(key);}
?@Overridepublic Long sRemove(String key, Object... values) {return redisTemplate.opsForSet().remove(key, values);}
?@Overridepublic List<Object> lRange(String key, long start, long end) {return redisTemplate.opsForList().range(key, start, end);}
?@Overridepublic Long lSize(String key) {return redisTemplate.opsForList().size(key);}
?@Overridepublic Object lIndex(String key, long index) {return redisTemplate.opsForList().index(key, index);}
?@Overridepublic Long lPush(String key, Object value) {return redisTemplate.opsForList().rightPush(key, value);}
?@Overridepublic Long lPush(String key, Object value, long time) {Long index = redisTemplate.opsForList().rightPush(key, value);expire(key, time);return index;}
?@Overridepublic Long lPushAll(String key, Object... values) {return redisTemplate.opsForList().rightPushAll(key, values);}
?@Overridepublic Long lPushAll(String key, Long time, Object... values) {Long count = redisTemplate.opsForList().rightPushAll(key, values);expire(key, time);return count;}
?@Overridepublic Long lRemove(String key, long count, Object value) {return redisTemplate.opsForList().remove(key, count, value);}
}
UserController控制器
接下來,我們新建一個controller包,在該包下新建UserController控制類。
package com.example.demo.controller;
?
import com.example.demo.entity.User;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
?
/*** @program: SpringBoot-Redis-Demo* @description:* @author: water76016* @create: 2020-12-29 09:27**/
@RestController
@RequestMapping("/user")
public class UserController {@AutowiredUserService userService;
?@PostMapping("/helloUser")public String helloUser(@RequestBody User user){return userService.helloUser(user);}
?
}
結果測試
最后,我們啟動SpringBoot程序,程序運行在8080端口,在postman中進行測試。大家按照我在postman中的輸入,就會有相應的輸出了。

另外,也來看看Redis中是否有相應的緩存結果。

Demo地址
寫了這么多,還是擔心大家使用的時候有問題,所以我把該Demo放在了Github上,大家自行下載就可以了。
SpringBoot-Redis-Demo地址