SpringBoot集成Redis—使用RedisRepositories詳解
更新時間:2022年03月15日 11:50:08 作者:Sky丶jarvan
這篇文章主要介紹了SpringBoot集成Redis—使用RedisRepositories詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
SpringBoot集成Redis
1.添加redis依賴
<dependency> ? <groupId>org.springframework.boot</groupId> ? <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> ? <groupId>org.apache.commons</groupId> ? <artifactId>commons-pool2</artifactId> </dependency>
2.在application.properties中添加redis配置信息
spring.redis.host=127.0.0.1 # Redis服務器連接端口 spring.redis.port=6379 # Redis服務器連接密碼(默認為空) spring.redis.password= # 連接池最大連接數(shù)(使用負值表示沒有限制) spring.redis.lettuce.pool.max-active=8 # 連接池最大阻塞等待時間(使用負值表示沒有限制) spring.redis.lettuce.pool.max-wait=-1 # 連接池中的最大空閑連接 spring.redis.lettuce.pool.max-idle=8 # 連接池中的最小空閑連接 spring.redis.lettuce.pool.min-idle=0 # 連接超時時間(毫秒) spring.redis.timeout=30000
3.SpringBoot啟動類中添加注解配置
@EnableCaching
@EnableRedisRepositories
//注解開啟使用RedisRepositories
//CRUD操作將會操作redis中的數(shù)據(jù)
@SpringBootApplication
public class RedisApplication {
?
? ? public static void main(String[] args) {
? ? ? ? SpringApplication.run(RedisApplication.class, args);
? ? }?
}4.創(chuàng)建實體類Entity
@Data
@RedisHash("user")
//RedisHash非常重要
//user表示在redis中新建user集合
//之后所有的UserEntity的保存操作全部會保存在user這個集合中
//保存時Key的格式為——user:id
public class UserEntity{
? ? @Id
? ? private Long id;?
? ? private String name;?
? ? private Integer age;?
? ? private Date createTime = new Date();
}5.創(chuàng)建Dao層——數(shù)據(jù)操作層
@Repository
public interface UserDao extends CrudRepository<UserEntity,Long> {
}6.創(chuàng)建Service層——服務層
@Service
public class UserService {
?
? ? @Autowired
? ? private UserDao userDao;
?
//因為使用了RedisRepositories,所以簡單的crud將不用使用RedisTemplate
// ? ?@Autowired
// ? ?private RedisTemplate redisTemplate;?
?
? ? /**
? ? ?* 按user:id的方式存入redis
? ? ?* @param user
? ? ?*/
? ? public void save(UserEntity user){
? ? ? ? //redisTemplate.opsForValue().set(new Random().nextDouble() + "",user);?
? ? ? ? userDao.save(user);?
? ? }
?
? ? /**
? ? ?* 根據(jù)key從redis中查找對應value
? ? ?* @param id
? ? ?* @return
? ? ?*/
? ? public UserEntity findOne(Long id){?
? ? ? ? //UserEntity user = (UserEntity) redisTemplate.opsForValue().get(key);?
? ? ? ? UserEntity user = userDao.findById(id).get();?
? ? ? ? return user;
? ? }
}7.創(chuàng)建Controller層——控制層
@RestController
@RequestMapping("user")
public class UserController {
?
? ? @Autowired
? ? private UserService userService;
?
? ? /**
? ? ?* 保存到redis中
? ? ?* @return
? ? ?*/
? ? @GetMapping("save")
? ? public String save(){
?
? ? ? ? UserEntity user = new UserEntity();?
? ? ? ? user.setName(String.valueOf(new Random().nextInt(100000)));?
? ? ? ? user.setAge(new Random().nextInt(100000));?
? ? ? ? userService.save(user);?
? ? ? ? System.out.println(user.toString());?
? ? ? ? return "success";
? ? }
?
? ? /**
? ? ?* 根據(jù)key從redis中查找value
? ? ?* @param id
? ? ?* @return
? ? ?*/
? ? @GetMapping("find/{id}")
? ? public String find(@PathVariable Long id){
? ? ? ?UserEntity user = userService.findOne(id);
?
? ? ? ? System.out.println(user);
? ? ? ? return "success";
? ? }
}8.redis配置類
@Configuration
public class RedisConfig {
?
?? ?@Bean
?? ?public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
?? ??? ?RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
?? ??? ?template.setConnectionFactory(factory);
?? ??? ?Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
?? ??? ?ObjectMapper om = new ObjectMapper();
?? ??? ?om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
?? ??? ?om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
?? ??? ?jackson2JsonRedisSerializer.setObjectMapper(om);
?? ??? ?StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
?? ??? ?// key采用String的序列化方式
?? ??? ?template.setKeySerializer(stringRedisSerializer);
?? ??? ?// hash的key也采用String的序列化方式
?? ??? ?template.setHashKeySerializer(stringRedisSerializer);
?? ??? ?// value序列化方式采用jackson
?? ??? ?template.setValueSerializer(jackson2JsonRedisSerializer);
?? ??? ?// hash的value序列化方式采用jackson
?? ??? ?template.setHashValueSerializer(jackson2JsonRedisSerializer);
?? ??? ?template.afterPropertiesSet();
?? ??? ?return template;
?? ?}
}Redis中的結構為

redis封裝工具類
@Component
public class RedisUtils {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
// =============================common============================
/**
* 指定緩存失效時間
*
* @param key 鍵
* @param time 時間(秒)
* @return
*/
public boolean expire(String key, long time) {
try {
if (time > 0) {
redisTemplate.expire(key, time, TimeUnit.SECONDS);
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 根據(jù)key 獲取過期時間
*
* @param key 鍵 不能為null
* @return 時間(秒) 返回0代表為永久有效
*/
public long getExpire(String key) {
return redisTemplate.getExpire(key, TimeUnit.SECONDS);
}
/**
* 判斷key是否存在
*
* @param key 鍵
* @return true 存在 false不存在
*/
public boolean hasKey(String key) {
try {
return redisTemplate.hasKey(key);
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 刪除緩存
*
* @param key 可以傳一個值 或多個
*/
@SuppressWarnings("unchecked")
public void del(String... key) {
if (key != null && key.length > 0) {
if (key.length == 1) {
redisTemplate.delete(key[0]);
} else {
redisTemplate.delete(CollectionUtils.arrayToList(key));
}
}
}
// ============================String=============================
/**
* 普通緩存獲取
*
* @param key 鍵
* @return 值
*/
public Object get(String key) {
return key == null ? null : redisTemplate.opsForValue().get(key);
}
/**
* 普通緩存放入
*
* @param key 鍵
* @param value 值
* @return true成功 false失敗
*/
public boolean set(String key, Object value) {
try {
redisTemplate.opsForValue().set(key, value);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 普通緩存放入并設置時間
*
* @param key 鍵
* @param value 值
* @param time 時間(秒) time要大于0 如果time小于等于0 將設置無限期
* @return true成功 false 失敗
*/
public boolean set(String key, Object value, long time) {
try {
if (time > 0) {
redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
} else {
set(key, value);
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 遞增
*
* @param key 鍵
* @param delta 要增加幾(大于0)
* @return
*/
public long incr(String key, long delta) {
if (delta < 0) {
throw new RuntimeException("遞增因子必須大于0");
}
return redisTemplate.opsForValue().increment(key, delta);
}
/**
* 遞減
*
* @param key 鍵
* @param delta 要減少幾(小于0)
* @return
*/
public long decr(String key, long delta) {
if (delta < 0) {
throw new RuntimeException("遞減因子必須大于0");
}
return redisTemplate.opsForValue().increment(key, -delta);
}
// ================================Map=================================
/**
* HashGet
*
* @param key 鍵 不能為null
* @param item 項 不能為null
* @return 值
*/
public Object hget(String key, String item) {
return redisTemplate.opsForHash().get(key, item);
}
/**
* 獲取hashKey對應的所有鍵值
*
* @param key 鍵
* @return 對應的多個鍵值
*/
public Map<Object, Object> hmget(String key) {
return redisTemplate.opsForHash().entries(key);
}
/**
* HashSet
*
* @param key 鍵
* @param map 對應多個鍵值
* @return true 成功 false 失敗
*/
public boolean hmset(String key, Map<String, Object> map) {
try {
redisTemplate.opsForHash().putAll(key, map);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* HashSet 并設置時間
*
* @param key 鍵
* @param map 對應多個鍵值
* @param time 時間(秒)
* @return true成功 false失敗
*/
public boolean hmset(String key, Map<String, Object> map, long time) {
try {
redisTemplate.opsForHash().putAll(key, map);
if (time > 0) {
expire(key, time);
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 向一張hash表中放入數(shù)據(jù),如果不存在將創(chuàng)建
*
* @param key 鍵
* @param item 項
* @param value 值
* @return true 成功 false失敗
*/
public boolean hset(String key, String item, Object value) {
try {
redisTemplate.opsForHash().put(key, item, value);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 向一張hash表中放入數(shù)據(jù),如果不存在將創(chuàng)建
*
* @param key 鍵
* @param item 項
* @param value 值
* @param time 時間(秒) 注意:如果已存在的hash表有時間,這里將會替換原有的時間
* @return true 成功 false失敗
*/
public boolean hset(String key, String item, Object value, long time) {
try {
redisTemplate.opsForHash().put(key, item, value);
if (time > 0) {
expire(key, time);
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 刪除hash表中的值
*
* @param key 鍵 不能為null
* @param item 項 可以使多個 不能為null
*/
public void hdel(String key, Object... item) {
redisTemplate.opsForHash().delete(key, item);
}
/**
* 判斷hash表中是否有該項的值
*
* @param key 鍵 不能為null
* @param item 項 不能為null
* @return true 存在 false不存在
*/
public boolean hHasKey(String key, String item) {
return redisTemplate.opsForHash().hasKey(key, item);
}
/**
* hash遞增 如果不存在,就會創(chuàng)建一個 并把新增后的值返回
*
* @param key 鍵
* @param item 項
* @param by 要增加幾(大于0)
* @return
*/
public double hincr(String key, String item, double by) {
return redisTemplate.opsForHash().increment(key, item, by);
}
/**
* hash遞減
*
* @param key 鍵
* @param item 項
* @param by 要減少記(小于0)
* @return
*/
public double hdecr(String key, String item, double by) {
return redisTemplate.opsForHash().increment(key, item, -by);
}
// ============================set=============================
/**
* 根據(jù)key獲取Set中的所有值
*
* @param key 鍵
* @return
*/
public Set<Object> sGet(String key) {
try {
return redisTemplate.opsForSet().members(key);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 根據(jù)value從一個set中查詢,是否存在
*
* @param key 鍵
* @param value 值
* @return true 存在 false不存在
*/
public boolean sHasKey(String key, Object value) {
try {
return redisTemplate.opsForSet().isMember(key, value);
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 將數(shù)據(jù)放入set緩存
*
* @param key 鍵
* @param values 值 可以是多個
* @return 成功個數(shù)
*/
public long sSet(String key, Object... values) {
try {
return redisTemplate.opsForSet().add(key, values);
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
/**
* 將set數(shù)據(jù)放入緩存
*
* @param key 鍵
* @param time 時間(秒)
* @param values 值 可以是多個
* @return 成功個數(shù)
*/
public long sSetAndTime(String key, long time, Object... values) {
try {
Long count = redisTemplate.opsForSet().add(key, values);
if (time > 0)
expire(key, time);
return count;
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
/**
* 獲取set緩存的長度
*
* @param key 鍵
* @return
*/
public long sGetSetSize(String key) {
try {
return redisTemplate.opsForSet().size(key);
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
/**
* 移除值為value的
*
* @param key 鍵
* @param values 值 可以是多個
* @return 移除的個數(shù)
*/
public long setRemove(String key, Object... values) {
try {
Long count = redisTemplate.opsForSet().remove(key, values);
return count;
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
// ===============================list=================================
/**
* 獲取list緩存的內(nèi)容
*
* @param key 鍵
* @param start 開始
* @param end 結束 0 到 -1代表所有值
* @return
*/
public List<Object> lGet(String key, long start, long end) {
try {
return redisTemplate.opsForList().range(key, start, end);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 獲取list緩存的長度
*
* @param key 鍵
* @return
*/
public long lGetListSize(String key) {
try {
return redisTemplate.opsForList().size(key);
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
/**
* 通過索引 獲取list中的值
*
* @param key 鍵
* @param index 索引 index>=0時, 0 表頭,1 第二個元素,依次類推;index<0時,-1,表尾,-2倒數(shù)第二個元素,依次類推
* @return
*/
public Object lGetIndex(String key, long index) {
try {
return redisTemplate.opsForList().index(key, index);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 將list放入緩存
*
* @param key 鍵
* @param value 值
* @return
*/
public boolean lSet(String key, Object value) {
try {
redisTemplate.opsForList().rightPush(key, value);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 將list放入緩存
*
* @param key 鍵
* @param value 值
* @param time 時間(秒)
* @return
*/
public boolean lSet(String key, Object value, long time) {
try {
redisTemplate.opsForList().rightPush(key, value);
if (time > 0)
expire(key, time);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 將list放入緩存
*
* @param key 鍵
* @param value 值
* @return
*/
public boolean lSet(String key, List<Object> value) {
try {
redisTemplate.opsForList().rightPushAll(key, value);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 將list放入緩存
*
* @param key 鍵
* @param value 值
* @param time 時間(秒)
* @return
*/
public boolean lSet(String key, List<Object> value, long time) {
try {
redisTemplate.opsForList().rightPushAll(key, value);
if (time > 0)
expire(key, time);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 根據(jù)索引修改list中的某條數(shù)據(jù)
*
* @param key 鍵
* @param index 索引
* @param value 值
* @return
*/
public boolean lUpdateIndex(String key, long index, Object value) {
try {
redisTemplate.opsForList().set(key, index, value);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 移除N個值為value
*
* @param key 鍵
* @param count 移除多少個
* @param value 值
* @return 移除的個數(shù)
*/
public long lRemove(String key, long count, Object value) {
try {
Long remove = redisTemplate.opsForList().remove(key, count, value);
return remove;
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
}以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
您可能感興趣的文章:
- springboot集成redis存對象亂碼的問題及解決
- 一起來看看springboot集成redis的使用注解
- SpringBoot集成redis錯誤問題及解決方法
- 解決springboot服務啟動報錯:Unable?to?start?embedded?contain
- 解決springboot項目不配置數(shù)據(jù)源啟動報錯問題
- 解決springboot整合cxf啟動報錯,原因是版本問題
- springboot集成springCloud中gateway時啟動報錯的解決
- 解決SpringBoot webSocket 資源無法加載、tomcat啟動報錯的問題
- springboot集成redis啟動報錯問題的解決方式
相關文章
IntelliJ IDEA 2019.2 x64的安裝、應用與簡單配置(圖文)
這篇文章主要介紹了IntelliJ IDEA 2019.2 x64的安裝、應用與簡單配置,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-10-10
SpringBoot結合Redis哨兵模式的實現(xiàn)示例
這篇文章主要介紹了SpringBoot結合Redis哨兵模式的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-04-04
mybatis plus saveOrUpdate實現(xiàn)有重復數(shù)據(jù)就更新,否則新增方式
這篇文章主要介紹了mybatis plus saveOrUpdate實現(xiàn)有重復數(shù)據(jù)就更新,否則新增方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12
Springcloud實現(xiàn)服務多版本控制的示例代碼
這篇文章主要介紹了Springcloud實現(xiàn)服務多版本控制的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-05-05
java實現(xiàn)1M圖片壓縮優(yōu)化到100kb實現(xiàn)示例
這篇文章主要為大家介紹了java實現(xiàn)1M圖片壓縮優(yōu)化到100kb示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-07-07
關于@EnableGlobalMethodSecurity注解的用法解讀
這篇文章主要介紹了關于@EnableGlobalMethodSecurity注解的用法解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03

