最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

redis之@Cacheable注解

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

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

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

在 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
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 對象進行緩存操作。

例如,對于分頁查詢操作,可以將查詢結果緩存到 Redis 中,下次查詢時先從 Redis 中獲取數(shù)據(jù),如果緩存中不存在,則進行數(shù)據(jù)庫查詢,并將查詢結果緩存到 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 插件進行分頁查詢,并將查詢結果緩存到 Redis 中,緩存時間為 1 分鐘。下次查詢時,如果緩存中存在數(shù)據(jù),則直接從緩存中獲取,避免了頻繁查詢數(shù)據(jù)庫的操作。

以上就是 Spring Boot 結合 Redis 進行緩存分頁數(shù)據(jù)的實現(xiàn)方法。需要注意的是,緩存的數(shù)據(jù)需要根據(jù)實際情況進行設置過期時間,避免緩存數(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表達式來表示。

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

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

當使用@Cacheable注解后,如果需要更新緩存,可以通過調用@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ù)時,先調用更新方法updateUser,然后再調用查詢方法getUserById,此時會更新緩存中的數(shù)據(jù)。

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

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

如果需要刪除緩存中的數(shù)據(jù),可以通過調用@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ù)時,先調用刪除方法deleteUserById,然后再調用查詢方法getUserById,此時會重新從數(shù)據(jù)庫中獲取數(shù)據(jù)。

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

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

總結

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

相關文章

  • Redis哨兵模式與主從架構對比分析

    Redis哨兵模式與主從架構對比分析

    Redis哨兵模式在主從架構基礎上增強高可用性,通過自動故障切換和監(jiān)控實現(xiàn)無人值守恢復,但部署復雜且無法突破單機內存限制,適用于讀多寫少、高可用需求的場景
    2025-08-08
  • redis擊穿 雪崩 穿透超詳細解決方案梳理

    redis擊穿 雪崩 穿透超詳細解決方案梳理

    這篇文章主要為大家介紹了Redis擊穿穿透雪崩產(chǎn)生原因及解決思路的解決方案參考,有需要的朋友可以借鑒參考下,希望能夠有所幫助祝大家多多進步
    2022-03-03
  • 小白也能看懂的Redis遍歷鍵和數(shù)據(jù)庫管理詳解

    小白也能看懂的Redis遍歷鍵和數(shù)據(jù)庫管理詳解

    這篇文章主要為大家介紹了小白也能看懂的Redis遍歷鍵和數(shù)據(jù)庫管理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • 淺談Redis的異步機制

    淺談Redis的異步機制

    命令操作、系統(tǒng)配置、關鍵機制、硬件配置等會影響 Redis 的性能,還要提前準備好應對異常的方案,本文主要介紹了Redis的異步機制,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-05-05
  • redis.clients.jedis.exceptions.JedisDataException異常的錯誤解決

    redis.clients.jedis.exceptions.JedisDataException異常的錯誤解決

    本文主要介紹了redis.clients.jedis.exceptions.JedisDataException異常的錯誤解決,這個異常通常發(fā)生在嘗試連接到一個?Redis?服務器時,客戶端發(fā)送了一個?AUTH?命令來驗證密碼,但是沒有配置密碼驗證,下來就來解決一下
    2024-05-05
  • Redis和Memcached的區(qū)別詳解

    Redis和Memcached的區(qū)別詳解

    這篇文章主要介紹了Redis和Memcached的區(qū)別詳解,本文從各方面總結了兩個數(shù)據(jù)庫的不同之處,需要的朋友可以參考下
    2015-03-03
  • redis設置密碼并修改查看的幾種實現(xiàn)過程

    redis設置密碼并修改查看的幾種實現(xiàn)過程

    這篇文章主要介紹了redis設置密碼并修改查看的幾種實現(xiàn)過程,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2026-06-06
  • Linux服務器快速安裝Redis6.0步驟示例詳解

    Linux服務器快速安裝Redis6.0步驟示例詳解

    這篇文章主要為大家介紹了Linux服務器快速安裝Redis6.0步驟示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • Redis cluster集群模式的原理解析

    Redis cluster集群模式的原理解析

    這篇文章主要介紹了Redis cluster集群模式的原理解析,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • 虛擬機linux安裝redis實現(xiàn)過程解析

    虛擬機linux安裝redis實現(xiàn)過程解析

    這篇文章主要介紹了虛擬機linux安裝redis實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-08-08

最新評論

长丰县| 洛川县| 天长市| 太湖县| 昌宁县| 九寨沟县| 喜德县| 临洮县| 弥勒县| 塔河县| 井陉县| 梓潼县| 漠河县| 木里| 崇仁县| 闸北区| 防城港市| 青阳县| 漳州市| 西乌| 桐梓县| 合江县| 五家渠市| 鹤壁市| 颍上县| 绩溪县| 丹阳市| 白沙| 商河县| 新津县| 嘉黎县| 景东| 勃利县| 黄浦区| 会东县| 嘉禾县| 湖北省| 浙江省| 仲巴县| 梁山县| 昌图县|