Redis實現緩存功能總結

學而時習之,不亦說乎。今天總結一下Springboot集成Redis實現緩存功能。Redis這個NoSQL數據庫應用最廣泛的場景就是做緩存,分佈式系統有很多位置需要緩存,比如共享session,讀取業務數據緩存,分佈式鎖等。由於springboot已經對redis的操作深度封裝,今天主要總結一下共享session和業務數據的緩存。

先說共享session,分佈式系統共享session主要有三種方式,一種是session複製,一種是IP hash,一種是存儲共享,session複製需要配置tomcat,很簡單,網上教程大把的;IP hash只需設置nginx,也不講了,只講存儲共享,原因是相比於前兩種方法,它實時共享,可靠性高,擴展性好。實現起來需要三步:

1.導包

<dependency>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-data-redis</artifactId>

</dependency>

<dependency>

    <groupId>org.springframework.session</groupId>

    <artifactId>spring-session-data-redis</artifactId>

</dependency>

2.配置

# Redis服務器地址

spring.redis.host=localhost

# Redis服務器連接端口

spring.redis.port=6379

# Redis服務器連接密碼(默認爲空)

spring.redis.password=

3.引用

springboot實現session共享非常的方便,只需要一個@EnableRedisHttpSession註解即可。把該註解加在springboot啓動類的上面。

session共享就實現了,你可以隨便寫個請求,從httprequest中操作session,此處就略了。

再說說業務數據緩存,用Redis緩存業務數據也有兩種方法,一種是用RedisTemplate直接操作需要緩存的業務數據,用@Autowired注入RedisTemplate來操作redis,好處是可控,自由度大,缺點是囉嗦,代碼量大;另一種是用註解操作,一般要先寫個配置類

/**
 * @author hulonghai
 * redis配置類
 */
@Configuration
@EnableCaching
public class CacheConfig extends CachingConfigurerSupport{
 
    @SuppressWarnings("rawtypes")
    @Bean
    public CacheManager cacheManager(RedisTemplate redisTemplate) {
        RedisCacheManager rcm = new RedisCacheManager(redisTemplate);
        //設置緩存過期時間(秒)
        rcm.setDefaultExpiration(600);
        return rcm;
    }
 
    @Bean
    public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {
        StringRedisTemplate template = new StringRedisTemplate(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);
        template.setValueSerializer(jackson2JsonRedisSerializer);
        template.afterPropertiesSet();
        return template;
    }
 
}

對於配置類,一定要加上@EnableCaching,如果你只想使用默認配置,可以把它打在啓動類上,不寫配置類,但是這樣一般無法滿足實際業務需求,因爲有些設置是必要的,比如緩存的過期時間,cacheManager方法配置了緩存過期時間,還有很多其他配置可以根據你的實際業務進行增加。

接下來就要在操作業務上通過增加註解來實現緩存了,註解常用的有三種:

@Cacheable:用於查詢和新增

可選屬性:
cacheNames/value:指定緩存組件的名字;
key:緩存數據使用的key,可以用來指定。默認即使用方法參數的值

@Cacheable(value="user", key="'users_'+#id")
public User findUser(Integer id) {
    User user = new User();
    user.setUsername("hlhdidi");
    user.setPassword("123");
    user.setUid(id.longValue());
    System.out.println("log4j2壞啦?");
    logger.info("輸入user,用戶名:{},密碼:{}",user.getUsername(),user.getPassword());
    return user;
}

@CachePut:用於更新

既調用方法,又更新緩存數據,可達到同步更新緩存;
修改了數據庫的某個數據,同時更新緩存
運行時機:
1、先調用運行方法;
2、將目標方法的結果緩存起來
value:緩存名 key:緩存的key其中#result表示方法返回的結果(確保更新的key和查詢一致即可做到同時更新數據庫數據和緩存中的數據)

@CachePut(value="user",key = "#result.id")
    public User updateUser(User user){
        System.out.println("updateUser:"+user);
        userMapper.updateUser(user);
        return user;
}

@CacheEvict:用於刪除

緩存清除:目的是爲了刪除一個數據並刪掉緩存
key:指定要清除的數據(對應上key可實現目的即同時做到刪除數據庫和緩存中的數據)
allEntries =true:指定清楚這個緩存中所有的數據
beforeInvocation = false:緩存的清楚是否在方法之前執行,默認代表是在方法之後執行

@CacheEvict(value = "user",key = "#id")
public void deleteUser(Integer id){
    System.out.println("deleteUser:"+id);
    userMapper.deleteUserById(id);
}

這樣就可以實現在增刪改查數據時對業務數據的緩存功能了,代碼非常簡潔。

Redis的用途還有很多,比如可以發佈訂閱消息、做隊列、set還可以做一些去重工作比如冪等訪問、zset做排行榜等等,以後會繼續總結Redis的各種玩法。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章