[实习记录]使用Redis构建二层缓存

达芬奇密码2018-08-13 10:32

使用Redis构建二层缓存

本示例描述了使用Redis构建二级缓存的基本流程,是Hello World级别工程,非生产级别代码。

1      安装Redis

Redis官方不建议在Windows下使用。本机Windows环境测试请到https://github.com/MSOpenTech/redis/releases下载。

解压,到解压目录运行Redis实例:

redis-server.exe redis.windows.conf

其中redis.windows.conf是配置文件。

在另一个cmd.exe运行:

redis-cli.exe -h localhost -p 6379

随便设置一个key,读取试一下。

2      新建springboot工程

参照[实习笔记]6.15第一个SpringBoot项目(http://ks.netease.com/blog?id=7828)的步骤新建工程。pom.xml中加入以下配置:

<!-- spring-redis -->

    <dependency>

      <groupId>org.springframework.data</groupId>

      <artifactId>spring->

      <version>1.8.4.RELEASE</version>

    </dependency>

    <!-- https://mvnrepository.com/artifact/redis.clients/jedis -->

    <dependency>

      <groupId>redis.clients</groupId>

      <artifactId>jedis</artifactId>

      <version>2.9.0</version>

</dependency>

application.properties文件中配置Redis数据源:

spring.redis.database=1

spring.redis.host=localhost

#spring.redis.password=

spring.redis.port=6379

spring.redis.pool.max-idle=8

spring.redis.pool.min-idle=0

spring.redis.pool.max-active=8

spring.redis.pool.max-wait=-1

3      编写RedisConfig配置类

@Configuration

@EnableCaching

public class RedisConfig extends CachingConfigurerSupport {

 

    /**

     * 自定义key生成器

     *

     * @return

     */

    @Override

    @Bean

    public KeyGenerator keyGenerator() {

        return new KeyGenerator() {

            @Override

            public Object generate(Object o, Method method, Object... objects) {

                StringBuilder sb = new StringBuilder();

                sb.append(o.getClass().getName());

                sb.append(method.getName());

                for (Object obj : objects) {

                    sb.append(obj.toString());

                }

                return sb.toString();

            }

        };

    }

 

    /**

     * 配置映射

     *

     * @param factory

     * @return

     */

    @Bean

    public RedisTemplate 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.setDefaultSerializer(jackson2JsonRedisSerializer);

        template.afterPropertiesSet();

        return template;

    }

   

}

4      使用注解配置缓存

如果缓存命中,则无需执行方法体。打印一句话用以标记。

@Service("userService")

public class UserService {

 

    @Autowired

    private JdbcTemplate jdbcTemplate;

 

    @Cacheable(value = "userCache")

    public String getUser(String id) {

        System.out.println("从数据库获取!!!!!!!!!!!!!!!!!!!!!!!!!!");

        String sql = "select id,username from user where id=?";

        RowMapper<User> rowMapper = new BeanPropertyRowMapper<>(User.class);

        User user = jdbcTemplate.queryForObject(sql, rowMapper, id);

        return user.toString();

    }

}

Controller配置:

@Controller

public class SampleController {

    @Resource

    private UserService userService;

 

    @RequestMapping("/")

    @ResponseBody

    public String home() {

        return "Hello World";

    }

 

    @RequestMapping("/getUser/{id}")

    @ResponseBody

    public String getUser(@PathVariable String id) {

        return userService.getUser(id);

    }

   

}

程序入口配置:

@EnableAutoConfiguration

@ComponentScan(basePackages = "per.gzc.test")

public class AppStarter {

    public static void main(String[] args) {

        SpringApplication.run(AppStarter.class);

    }

}

5      测试

启动工程,url中输入http://localhost:8080/getUser/1,获取到User信息:

此时查看输出标记语句,执行了数据库查询:

换一个浏览器访问http://localhost:8080/getUser/1

此时没有发现标记语句输出。

查看Redis数据库,发现对应键:



网易云新用户大礼包:https://www.163yun.com/gift

本文来自网易实践者社区,经作者葛志诚授权发布。