Redisson客户端配置与缓存管理器

 配置文件中的配置信息

# redis 配置
spring:
  redis:
      host: x.x.x.x
      port: 6379
      password: 123456
      database: 0
      # 连接超时时间
      timeout: 10s
      # 是否开启ssl
      ssl: false
      
# redisson 配置
redisson:
  # 线程池数量
  threads: 16
  # Netty线程池数量
  nettyThreads: 32
  # 单节点配置
  singleServerConfig:
    # 客户端名称
    clientName: ${spring.application.name}
    # 最小空闲连接数
    connectionMinimumIdleSize: 8
    # 连接池大小
    connectionPoolSize: 32
    # 连接空闲超时,单位:毫秒
    idleConnectionTimeout: 10000
    # 命令等待超时,单位:毫秒
    timeout: 60000
    # 发布和订阅连接池大小
    subscriptionConnectionPoolSize: 50
  # redisson 缓存配置
  cacheGroup:
    # 用例: @Cacheable(cacheNames="groupId", key="#XXX") 方可使用缓存组配置
    - groupId: redissonCacheMap
      # 组过期时间(脚本监控)
      ttl: 60000
      # 组最大空闲时间(脚本监控)
      maxIdleTime: 60000
      # 组最大长度
      maxSize: 0

 配置信息

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

import org.redisson.config.ReadMode;
import org.redisson.config.SubscriptionMode;
import org.springframework.boot.context.properties.ConfigurationProperties;

import java.util.List;

@ConfigurationProperties(
        prefix = "redisson"
)
@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class RedissonProperties {
    private int threads;
    private int nettyThreads;
    private SingleServerConfig singleServerConfig;
    private ClusterServersConfig clusterServersConfig;
    private List<CacheGroup> cacheGroup;


    @Data
    @ToString
    @AllArgsConstructor
    @NoArgsConstructor
    public static class CacheGroup {
        private String groupId;
        private long ttl;
        private long maxIdleTime;
        private int maxSize;
    }

    /**
     * 集群服务器配置
     *
     * @author cong.zhen
     * @date 2023/01/18
     */
    @Data
    @ToString
    @AllArgsConstructor
    @NoArgsConstructor
    public static class ClusterServersConfig {
        private String clientName;
        private int masterConnectionMinimumIdleSize;
        private int masterConnectionPoolSize;
        private int slaveConnectionMinimumIdleSize;
        private int slaveConnectionPoolSize;
        private int idleConnectionTimeout;
        private int timeout;
        private int subscriptionConnectionPoolSize;
        private ReadMode readMode;
        private SubscriptionMode subscriptionMode;
    }

    /**
     * 单机模式配置
     *
     * @author cong.zhen
     * @date 2023/01/18
     */
    @Data
    @ToString
    @AllArgsConstructor
    @NoArgsConstructor
    public static class SingleServerConfig {
        private String clientName;
        private int connectionMinimumIdleSize;
        private int connectionPoolSize;
        private int idleConnectionTimeout;
        private int timeout;
        private int subscriptionConnectionPoolSize;
    }
}

Redission客户端和缓存组配置

@AutoConfigureBefore({RedissonAutoConfiguration.class})
@EnableConfigurationProperties({RedissonProperties.class})
@Configuration
@EnableCaching
@Slf4j
public class RedisConfiguration extends CachingConfigurerSupport {
    private static final String REDIS_PROTOCOL_PREFIX = "redis://";
    private static final String REDISS_PROTOCOL_PREFIX = "rediss://";
    @Resource
    private RedisProperties redisProperties;
    @Resource
    private RedissonProperties redissonProperties;

    public RedisConfiguration() {
    }

    @Primary
    @Bean(destroyMethod = "shutdown")
    public RedissonClient redisson() {
        String prefix = REDIS_PROTOCOL_PREFIX;
        if (this.redisProperties.isSsl()) {
            prefix = REDISS_PROTOCOL_PREFIX;
        }
        Config config = new Config();
        config.setThreads(this.redissonProperties.getThreads()).
                setNettyThreads(this.redissonProperties.getNettyThreads()).
                setCodec(new JsonJacksonCodec(JacksonUtil.getObjectMapper()));
        RedissonProperties.SingleServerConfig singleServerConfig = this.redissonProperties.getSingleServerConfig();
        if (ObjectUtil.isNotNull(singleServerConfig)) {
            config.useSingleServer().setAddress(prefix + this.redisProperties.getHost() + ":" + this.redisProperties.getPort())
                    .setConnectTimeout((int)this.redisProperties.getTimeout().toMillis())
                    .setDatabase(this.redisProperties.getDatabase())
                    .setPassword(StrUtil.isNotBlank(this.redisProperties.getPassword()) ? this.redisProperties.getPassword() : null)
                    .setTimeout(singleServerConfig.getTimeout())
                    .setClientName(singleServerConfig.getClientName())
                    .setIdleConnectionTimeout(singleServerConfig.getIdleConnectionTimeout())
                    .setSubscriptionConnectionPoolSize(singleServerConfig.getSubscriptionConnectionPoolSize())
                    .setConnectionMinimumIdleSize(singleServerConfig.getConnectionMinimumIdleSize())
                    .setConnectionPoolSize(singleServerConfig.getConnectionPoolSize());
        }

        RedissonProperties.ClusterServersConfig clusterServersConfig = this.redissonProperties.getClusterServersConfig();
        if (ObjectUtil.isNotNull(clusterServersConfig)) {
            String finalPrefix = prefix;
            List<String> nodes = this.redisProperties.getCluster().getNodes().stream().map((node) -> finalPrefix + node).collect(Collectors.toList());
            config.useClusterServers().setConnectTimeout((int)this.redisProperties.getTimeout().toMillis())
                    .setPassword(StrUtil.isNotBlank(this.redisProperties.getPassword()) ? this.redisProperties.getPassword() : null)
                    .setTimeout(clusterServersConfig.getTimeout())
                    .setClientName(clusterServersConfig.getClientName())
                    .setIdleConnectionTimeout(clusterServersConfig.getIdleConnectionTimeout())
                    .setSubscriptionConnectionPoolSize(clusterServersConfig.getSubscriptionConnectionPoolSize())
                    .setMasterConnectionMinimumIdleSize(clusterServersConfig.getMasterConnectionMinimumIdleSize())
                    .setMasterConnectionPoolSize(clusterServersConfig.getMasterConnectionPoolSize())
                    .setSlaveConnectionMinimumIdleSize(clusterServersConfig.getSlaveConnectionMinimumIdleSize())
                    .setSlaveConnectionPoolSize(clusterServersConfig.getSlaveConnectionPoolSize())
                    .setReadMode(clusterServersConfig.getReadMode())
                    .setSubscriptionMode(clusterServersConfig.getSubscriptionMode())
                    .setNodeAddresses(nodes);
        }

        RedissonClient redissonClient = Redisson.create(config);
        log.info("初始化 redis 配置");
        return redissonClient;
    }

    @Bean
    public CacheManager cacheManager(RedissonClient redissonClient) {
//我们从RedissonProperties中获取缓存组的配置信息
        List<RedissonProperties.CacheGroup> cacheGroup = this.redissonProperties.getCacheGroup();
//我们创建一个名为config的Map对象来保存缓存的配置信息。
        Map<String, CacheConfig> config = new HashMap(8);
        Iterator var4 = cacheGroup.iterator();
//遍历cacheGroup,并创建CacheConfig对象,将每个缓存组的配置信息
//设置到CacheConfig对象中,然后将CacheConfig对象保存到config中,
//以便我们可以使用它来创建RedissonSpringCacheManager实例。
        while (var4.hasNext()) {
            RedissonProperties.CacheGroup group = (RedissonProperties.CacheGroup) var4.next();
            CacheConfig cacheConfig = new CacheConfig(group.getTtl(), group.getMaxIdleTime());
            cacheConfig.setMaxSize(group.getMaxSize());
            config.put(group.getGroupId(), cacheConfig);
        }
//使用redissonClient、config和JsonJacksonCodec.INSTANCE创建
//RedissonSpringCacheManager实例,并将其返回作为cacheManager bean。

        return new RedissonSpringCacheManager(redissonClient, config, JsonJacksonCodec.INSTANCE);
    }


}

使用方法

 1.设值 拿值

@Resource
private RedissonClient redissonClient;

//过期时间为一天  设置值
redissonClient.getBucket("key").set("value",1,TimeUnit.DAYS);


//得到值
RBucket<String> bucket = redissonClient.getBucket("key");
//得到"value" 
String a  = bucket.get();

2.缓存

   可以直接使用注解的方式

@Cacheable(cacheNames="redissonCacheMap", key="#userId")
public User getUser(String userId) {
    // ...
}

        当调用getUser方法时,如果缓存中存在以userId作为key值的缓存,则直接从缓存中获取数据并返回;否则会执行方法体中的代码,将返回值存储到缓存中,并返回方法的返回值。

        需要注意的是,如果groupId对应的缓存组在cacheManager()方法中未被定义,则会抛出CacheNotFoundException异常。因此,使用@Cacheable注解时需要确保对应的缓存组已经被定义。(所以这里的cacheNames 就是groupId 要和上面Yml文件中的对应)

不使用注解(一般不采用)

@Repository
public class UserRepository {

    @Autowired
    private CacheManager cacheManager;

    public User findById(Long id) {
        String cacheName = "users";
        Cache cache = cacheManager.getCache(cacheName);
        if (cache != null && cache.get(id) != null) {
            // 缓存命中,直接返回缓存中的值
            return (User) cache.get(id).get();
        }
        // 缓存未命中,从数据库中查询用户信息
        User user = new User(id, "user" + id, "user" + id + "@example.com");
        // 将查询结果缓存起来
        cache.put(id, user);
        return user;
    }
}

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 添加 Ehcache 依赖 在 Maven 中添加 Ehcache 的依赖: ```xml <dependency> <groupId>org.ehcache</groupId> <artifactId>ehcache</artifactId> <version>3.8.1</version> </dependency> ``` 2. 创建 Ehcache 配置文件 在项目的 classpath 下创建 Ehcache 的配置文件 ehcache.xml,配置缓存策略和缓存区域。 示例: ```xml <config xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns='http://www.ehcache.org/v3' xsi:schemaLocation="http://www.ehcache.org/v3 http://www.ehcache.org/schema/ehcache-core-3.0.xsd"> <cache alias="userCache"> <key-type>java.lang.String</key-type> <value-type>com.example.User</value-type> <expiry> <ttl unit="seconds">60</ttl> <tti unit="seconds">30</tti> </expiry> <resources> <heap unit="entries">100</heap> <offheap unit="MB">10</offheap> </resources> </cache> </config> ``` 3. 配置 Ehcache 缓存管理器Spring Boot 中,可以通过注解 @EnableCaching 和 @Configuration 注解来配置 Ehcache 缓存管理器。 示例: ```java @Configuration @EnableCaching public class CacheConfig { @Bean public CacheManager cacheManager() { Resource resource = new ClassPathResource("ehcache.xml"); Configuration configuration = ConfigurationFactory.parseConfiguration(resource.getInputStream()); return CacheManagerBuilder.newCacheManagerBuilder() .withCache("userCache", UserCacheConfigurationBuilder.newUserCacheConfigurationBuilder().buildConfig(String.class, User.class)) .withCache("bookCache", BookCacheConfigurationBuilder.newBookCacheConfigurationBuilder().buildConfig(Long.class, Book.class)) .withConfiguration(configuration) .build(true); } } ``` 4. 使用 Ehcache 缓存管理器 在需要使用缓存的方法上添加 @Cacheable、@CachePut 或 @CacheEvict 注解来实现缓存的读取、写入和删除。 示例: ```java @Service public class UserServiceImpl implements UserService { @Autowired private UserRepository userRepository; @Cacheable(value = "userCache", key = "#id") public User getUserById(String id) { return userRepository.findById(id).orElse(null); } @CachePut(value = "userCache", key = "#user.id") public User saveOrUpdateUser(User user) { return userRepository.save(user); } @CacheEvict(value = "userCache", key = "#id") public void deleteUserById(String id) { userRepository.deleteById(id); } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值