资讯专栏INFORMATION COLUMN

redis 配置以及缓存(javaconfig)

terro / 3323人阅读

摘要:配置以及缓存是一种数据库,一种数据库,一种数据库如何缓存将想要缓存的数据添加到数据库中基于内存亦可持久化的数据库,所以速度快配置启动缓存是默认生成主键的方式是缓存管理器是的一种模板,还有一种模板是手动使用做缓存思路

redis 配置以及缓存(javaconfig) redis

是一种数据库,一种数据库,一种数据库

如何缓存:将想要缓存的数据添加到 redis 数据库中

redis:基于内存亦可持久化的 Key-Value 数据库,所以速度快

maven

    com.fasterxml.jackson.core
    jackson-databind
    2.4.1.3


    redis.clients
    jedis
    ${redis.version}


    org.springframework.data
    spring-data-redis
    ${spring.data.redis.version}


    org.springframework
    spring-context
    ${spring.version}
gradle
dependencies {
    compile("org.springframework.boot:spring-boot-starter-data-redis")
    compile("com.fasterxml.jackson.core:jackson-databind:$jacksonVersion")
    compile("redis.clients:jedis:$redisVersion")
    ...
}
redis 配置
@EnableCaching
@Configuration
public class RedisConfig extends CachingConfigurerSupport {
    @Bean
    @Override
    public KeyGenerator keyGenerator() {
        return (target, method, params) -> {
            StringBuilder sb = new StringBuilder();
            sb.append(target.getClass().getName());
            sb.append(method.getName());
            for (Object obj : params) {
                sb.append(obj.toString());
            }
            return sb.toString();
        };
    }

    @Bean
    public CacheManager cacheManager(RedisTemplate redisTemplate) {
        return new RedisCacheManager(redisTemplate);
    }


    @Bean
    public RedisConnectionFactory redisCF() {
        JedisConnectionFactory cf = new JedisConnectionFactory();
        cf.setPassword("$2a$10$7e3cgzcCqwapf.TmEl1vi.b4ibSRxhqRjZKmRf9fV5b5u5L/CWaIa");
        return cf;
    }

    @Bean
    public StringRedisTemplate redisTemplate(RedisConnectionFactory cf) {
        StringRedisTemplate redis = new StringRedisTemplate(cf);
        Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        serializer.setObjectMapper(objectMapper);
        redis.setValueSerializer(serializer);
        redis.afterPropertiesSet();
        return redis;
    }

    ...
}

@EnableCaching 启动 spring 缓存

keyGenerator bean 是默认生成主键的方式

cacheManager bean 是缓存管理器

StringRedisTemplate 是 spring-data-redis 的一种模板,还有一种模板是 RedisTemplate

手动使用 redis 做缓存
public List findAll() {
    long provinces_redis_size = redis.opsForList().size("provinces").longValue();
    List redisProvinces = redis.opsForList().range("provinces", 0, provinces_redis_size);
    if(redisProvinces.size() != 0)
        return redisProvinces;

    List persistProvinces = repository.findAll();
    for(Provinces provinces : persistProvinces) {
        redis.opsForList().rightPush("provinces", provinces);
    }

    return persistProvinces;
}

思路就是查询的时候从 redis 中查询,若查到了,就将数据返回;若没查到,就从正在使用的数据库查(比如 MySql,H2等),然后将数据放入 redis 数据库中

使用 spring 注解缓存
@Cacheable(value = "provincesCache", key = ""provinces"")
public List findAllWithSpringCache() {
    return repository.findAll();
}
@Cacheable(value = "citiesCache", key = "#provinceId")
public List findByProvinceId(String provinceId) {
    return repository.findByProvinceId(provinceId);
}
测试

测试缓存省份 provinces

@SpringBootTest
@RunWith(SpringJUnit4ClassRunner.class)
public class ProvincesServiceTest {
    @Autowired
    private ProvincesService provincesService;

    @Autowired
    private RedisTemplate redis;

    @Autowired
    private StringRedisTemplate stringRedis;

    @After
    public void cleanUp() {
        redis.delete("provinces");
        stringRedis.delete("provinces");
        stringRedis.delete("provincesCache~keys");
    }

    @Test
    public void findAll() {
        List list = provincesService.findAll();
        Assert.assertEquals(list.size(), 34);
    }

    @Test
    public void findAllWithSpringCache() {
        List list = provincesService.findAllWithSpringCache();
        Assert.assertEquals(list.size(), 34);
    }
}

测试缓存市区 cities

@SpringBootTest
@RunWith(SpringJUnit4ClassRunner.class)
public class CitiesServiceTest {
    @Autowired
    private CitiesService citiesService;

    @Autowired
    private StringRedisTemplate stringRedis;

    @After
    public void cleanUp() {
        stringRedis.delete("440000");
    }

    @Test
    public void findByProvinceId() {
        List list = citiesService.findByProvinceId("440000");
        Assert.assertEquals(list.size(), 21);
    }
}
源码地址

springmvc: https://git.oschina.net/seald...

springboot: https://git.oschina.net/seald...

建议看 springboot 的,springmvc 的加了挺多测试,比较不清晰

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/76409.html

相关文章

  • Redis的Spring配置讲解

    摘要:否则,这个方法就会被调用,返回值会放到缓存之中表名应该将方法的返回值放到缓存中。 Redis是一种特殊类型的数据库,他被称之为key-value存储 本文覆盖缓存和存储两方面进行说明,使用的是Spring 4.0和Java配置方式 代码地址下载地址:https://github.com/zoeminghong/springmvc-javaconfig 存储 Redis的配置 packa...

    FullStackDeveloper 评论0 收藏0
  • JavaConfig方式以及处理自动装配歧义性-spring基础学习

    摘要:介绍在配置和直接注解式配置之外还有一种有趣的选择方式,是指基于配置的。传统的一般都是基本配置的,后来新增了许多的注解,特别是,基本都是清一色的。代码如下创建对象创建对象创建一个对象运行后的两种结果 1.javaconfig介绍 在XML配置和直接注解式配置之外还有一种有趣的选择方式-JavaConfig,java config是指基于java配置的spring。传统的Spring一般都...

    2shou 评论0 收藏0
  • Spring - 装配Bean

    摘要:装配任何一个成功的应用都是由多个为了实现某个业务目标而相互协作的组件构成的创建应用对象之间协作关系的行为通常称为装配,这也是依赖注入配置的可选方案在中进行显示配置在中进行显示配置隐式的发现机制和自动装配自动化装配组件扫描会自动发现应用上下文 装配Bean 任何一个成功的应用都是由多个为了实现某个业务目标而相互协作的组件构成的 创建应用对象之间协作关系的行为通常称为装配(wiring)...

    CNZPH 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<