欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

redis緩存神器之@Cacheable注解詳解

 更新時間:2025年11月07日 17:16:29   作者:剽悍一小兔  
文章介紹了如何在SpringBoot中使用Redis和@Cacheable注解進行緩存分頁數(shù)據(jù),以及在數(shù)據(jù)更新時如何更新緩存,通過使用@EnableCaching、@Cacheable、@CachePut和@CacheEvict注解,可以簡化緩存操作并提高系統(tǒng)性能

redis之@Cacheable注解

在之前的文章中,我們寫了redis結(jié)合springboot做緩存分頁的方法:

在Spring Boot中結(jié)合Redis進行緩存分頁數(shù)據(jù)

可以通過以下步驟實現(xiàn):

在 pom.xml 文件中添加 Redis 相關(guān)依賴:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

在 application.properties 文件中配置 Redis 連接信息:

spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=

創(chuàng)建一個 RedisTemplate 對象,用于操作 Redis 緩存:

@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        return redisTemplate;
    }
}

在 Service 層中,使用 RedisTemplate 對象進行緩存操作。

例如,對于分頁查詢操作,可以將查詢結(jié)果緩存到 Redis 中,下次查詢時先從 Redis 中獲取數(shù)據(jù),如果緩存中不存在,則進行數(shù)據(jù)庫查詢,并將查詢結(jié)果緩存到 Redis 中:

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    @Autowired
    private UserDao userDao;

    @Override
    public List<User> getUsersByPage(int pageNum, int pageSize) {
        String key = "user:page:" + pageNum + ":" + pageSize;
        List<User> users = (List<User>) redisTemplate.opsForValue().get(key);
        if (users == null) {
            PageHelper.startPage(pageNum, pageSize);
            users = userDao.getUsers();
            PageInfo<User> pageInfo = new PageInfo<>(users);
            redisTemplate.opsForValue().set(key, pageInfo, 1, TimeUnit.MINUTES);
        }
        return users;
    }
}

在上述代碼中,使用了 PageHelper 插件進行分頁查詢,并將查詢結(jié)果緩存到 Redis 中,緩存時間為 1 分鐘。下次查詢時,如果緩存中存在數(shù)據(jù),則直接從緩存中獲取,避免了頻繁查詢數(shù)據(jù)庫的操作。

以上就是 Spring Boot 結(jié)合 Redis 進行緩存分頁數(shù)據(jù)的實現(xiàn)方法。需要注意的是,緩存的數(shù)據(jù)需要根據(jù)實際情況進行設(shè)置過期時間,避免緩存數(shù)據(jù)過期后仍然被使用。

但是,以上代碼還是存在問題的,如果page數(shù)據(jù)發(fā)生了變化怎么辦,redis獲取的還是老數(shù)據(jù)??!

所以,我們需要在數(shù)據(jù)更新的時候,也要更新緩存里面的數(shù)據(jù)。

來嘮嘮怎么更新緩存和簡化這些操作

Spring Boot提供了一個注解@EnableCaching來啟用緩存功能。在啟用緩存功能后,可以使用注解來對某個方法進行緩存。

首先,在pom.xml文件中添加redis依賴:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

在application.properties文件中配置redis連接信息:

spring.redis.host=127.0.0.1
spring.redis.port=6379

在啟動類上添加@EnableCaching注解,開啟緩存功能:

@SpringBootApplication
@EnableCaching
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

在需要進行緩存的方法上添加@Cacheable注解:

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserDao userDao;

    @Override
    @Cacheable(value = "userCache", key = "#id") // 添加緩存注解
    public User getUserById(Long id) {
        return userDao.getUserById(id);
    }
}

其中,@Cacheable注解有兩個重要的參數(shù):value和key。value表示緩存的名稱,如果沒有指定則使用默認緩存;key表示緩存的key值,可以使用SpEL表達式來表示。

這樣,當(dāng)?shù)谝淮握{(diào)用getUserById方法時,會將返回結(jié)果緩存起來,下次再調(diào)用該方法時,直接從緩存中獲取結(jié)果,而不是執(zhí)行方法體。如果需要更新緩存,可以調(diào)用@CachePut注解或@CacheEvict注解來實現(xiàn)。

需要注意的是,在使用@Cacheable注解時,被緩存的方法不能拋出異常,否則會導(dǎo)致緩存失效。

當(dāng)使用@Cacheable注解后,如果需要更新緩存,可以通過調(diào)用@CachePut注解來更新緩存。

@CachePut注解的使用方法和@Cacheable注解類似。在需要更新緩存的方法上添加@CachePut注解,并指定value和key值。

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserDao userDao;

    @Override
    @Cacheable(value = "userCache", key = "#id")
    public User getUserById(Long id) {
        return userDao.getUserById(id);
    }

    @Override
    @CachePut(value = "userCache", key = "#user.id")
    public User updateUser(User user) {
        userDao.updateUser(user);
        return user;
    }
}

在更新數(shù)據(jù)時,先調(diào)用更新方法updateUser,然后再調(diào)用查詢方法getUserById,此時會更新緩存中的數(shù)據(jù)。

// 更新用戶信息
User user = new User();
user.setId(1L);
user.setName("new name");
userService.updateUser(user);

// 查詢用戶信息,會從緩存中獲取
User userFromCache = userService.getUserById(1L);

如果需要刪除緩存中的數(shù)據(jù),可以通過調(diào)用@CacheEvict注解來實現(xiàn)。

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserDao userDao;

    @Override
    @Cacheable(value = "userCache", key = "#id")
    public User getUserById(Long id) {
        return userDao.getUserById(id);
    }

    @Override
    @CachePut(value = "userCache", key = "#user.id")
    public User updateUser(User user) {
        userDao.updateUser(user);
        return user;
    }

    @Override
    @CacheEvict(value = "userCache", key = "#id")
    public void deleteUserById(Long id) {
        userDao.deleteUserById(id);
    }
}

在刪除數(shù)據(jù)時,先調(diào)用刪除方法deleteUserById,然后再調(diào)用查詢方法getUserById,此時會重新從數(shù)據(jù)庫中獲取數(shù)據(jù)。

// 刪除用戶信息
userService.deleteUserById(1L);

// 查詢用戶信息,會重新從數(shù)據(jù)庫中獲取
User userFromDB = userDao.getUserById(1L);

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Redis不使用 keys 命令獲取鍵值信息的方法

    Redis不使用 keys 命令獲取鍵值信息的方法

    這篇文章主要介紹了Redis 不使用 keys 命令獲取鍵值信息的相關(guān)知識,非常不錯,具有一定的參考借鑒價值,需要的朋友參考下吧
    2018-08-08
  • redis-sentinel基礎(chǔ)概念及部署流程

    redis-sentinel基礎(chǔ)概念及部署流程

    Redis Sentinel是Redis的高可用解決方案,通過監(jiān)控主從節(jié)點、自動故障轉(zhuǎn)移、通知機制及配置提供,實現(xiàn)集群故障恢復(fù)與服務(wù)持續(xù)可用,核心組件包括Sentinel節(jié)點、主節(jié)點和從節(jié)點,部署需配置參數(shù),驗證主節(jié)點變化即成功
    2025-08-08
  • Redis Sentinel服務(wù)配置流程(詳解)

    Redis Sentinel服務(wù)配置流程(詳解)

    下面小編就為大家?guī)硪黄猂edis Sentinel服務(wù)配置流程(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • Redis熱點Key問題的完整解決方案:

    Redis熱點Key問題的完整解決方案:

    熱點Key就像雙十一爆款商品,1%的Key承擔(dān)了90%的流量!本文將用電商案例,教你如何智能分流、化解壓力,并通過代碼示例講解的非常詳細,需要的朋友可以參考下
    2025-08-08
  • Redis內(nèi)存碎片原理深入分析

    Redis內(nèi)存碎片原理深入分析

    這篇文章主要為大家介紹了Redis內(nèi)存碎片原理深入分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02
  • Redis實現(xiàn)排名功能的示例代碼

    Redis實現(xiàn)排名功能的示例代碼

    本文主要介紹了Redis實現(xiàn)排名功能的示例代碼,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • 完美解決linux上啟動redis后配置文件未生效的問題

    完美解決linux上啟動redis后配置文件未生效的問題

    今天小編就為大家分享一篇完美解決linux上啟動redis后配置文件未生效的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • Redis實現(xiàn)分布式事務(wù)的示例

    Redis實現(xiàn)分布式事務(wù)的示例

    Redis雖不支持傳統(tǒng)SQL數(shù)據(jù)庫ACID特性的事務(wù),但提供了事務(wù)特性,允許多命令捆綁執(zhí)行,通過命令MULTI、EXEC、DISCARD、WATCH實現(xiàn),感興趣的可以了解一下
    2024-10-10
  • 使用redis獲取自增序列號實現(xiàn)方式

    使用redis獲取自增序列號實現(xiàn)方式

    這篇文章主要介紹了使用redis獲取自增序列號實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • redis 存儲對象的方法對比分析

    redis 存儲對象的方法對比分析

    這篇文章主要介紹了redis 存儲對象的方法對比分析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07

最新評論