1. 简单使用


1. 实体类 User

  1. public class User implements Serializable {
  2. private String userName;
  3. private String userId;
  4. public User(String userName, String userId) {
  5. this.userName = userName;
  6. this.userId = userId;
  7. }
  8. public String getUserId() {
  9. return userId;
  10. }
  11. public void setUserId(String userId) {
  12. this.userId = userId;
  13. }
  14. public String getUserName() {
  15. return userName;
  16. }
  17. @Override
  18. public String toString() {
  19. return userId + " --- " + userName;
  20. }
  21. }

2. 配置 SingleRedisAppConfig

  1. @Configuration
  2. @Profile("single")
  3. public class SingleRedisAppConfig {
  4. @Bean
  5. public LettuceConnectionFactory redisConnectionFactory() {
  6. System.out.println("使用单机版本");
  7. return new LettuceConnectionFactory(new RedisStandaloneConfiguration("127.0.0.1", 6379));
  8. }
  9. @Bean
  10. public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {
  11. RedisTemplate redisTemplate = new RedisTemplate();
  12. redisTemplate.setConnectionFactory(redisConnectionFactory);
  13. // 可以配置对象的转换规则,比如使用json格式对object进行存储。
  14. // Object --> 序列化 --> 二进制流 --> redis-server存储
  15. redisTemplate.setKeySerializer(new StringRedisSerializer());
  16. redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer());
  17. return redisTemplate;
  18. }
  19. }

3. 简单示例 SingleExampleService

@Service
@Profile("single")
public class SingleExampleService {

    // 直接注入StringRedisTemplate,则代表每一个操作参数都是字符串
    @Resource
    private StringRedisTemplate stringRedisTemplate;

    // 参数可以是任何对象,默认由JDK序列化
    @Resource
    private RedisTemplate redisTemplate;

    /**
     * 简单的缓存插入功能
     */
    public void setByCache(String userId, String userInfo) {
        stringRedisTemplate.opsForValue().set(userId, userInfo);
    }

    /**
     * 对象缓存功能
     */
    public User findUser(String userId) throws Exception {
        User user = null;
        // 1、 判定缓存中是否存在
        user = (User) redisTemplate.opsForValue().get(userId);
        if (user != null) {
            System.out.println("从缓存中读取到值:" + user);
            return user;
        }

        // TODO 2、不存在则读取数据库或者其他地方的值
        user = new User(userId, "张三");
        System.out.println("从数据库中读取到值:" + user);
        // 3、 同步存储value到缓存。
        redisTemplate.opsForValue().set(userId, user);
        return user;
    }

}

4. 测试 SingleTests

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
@ActiveProfiles("single") // 设置profile
public class SingleTests {

    @Resource
    private SingleExampleService exampleService;

    @Test
    public void setTest() {
        exampleService.setByCache("tony", "hahahhaha");
        exampleService.setByCache("a", "1");
        exampleService.setByCache("foo", "bar");
    }

    @Test
    public void getTest() throws Exception {
        User user = exampleService.findUser("tony");
        System.out.println(user);
    }

}

2. SpringCache 的使用


1. 配置文件修改,添加 @EnableCaching 注解

@Configuration
@Profile("single")
@EnableCaching
// 开启spring cache注解功能
public class SingleRedisAppConfig { }

2. 配置文件修改,添加 Bean cacheManager

// 配置Spring Cache注解功能
@Bean
public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
    RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory);
    RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig();
    RedisCacheManager cacheManager = new RedisCacheManager(redisCacheWriter, redisCacheConfiguration);
    return cacheManager;
}

3. 简单实现 SpringCacheService

@Service
@Profile("single")
public class SpringCacheService {

    /**
     * springcache注解版本(官方大部分资料开始往springboot方向引导,实际上不用springboot,也是差不多的方式)
     * value~单独的缓存前缀
     *  key缓存key 可以用springEL表达式
     */
    @Cacheable(cacheManager = "cacheManager", value = "cache-1", key = "#userId")
    public User findUserById(String userId) throws Exception {
        // 读取数据库
        User user = new User(userId, "张三");
        System.out.println("从数据库中读取到数据:" + user);
        return user;
    }

    @CacheEvict(cacheManager = "cacheManager", value = "cache-1", key = "#userId")
    public void deleteUserById(String userId) throws Exception {
        System.out.println("用户从数据库删除成功,请检查缓存是否清除~~" + userId);
    }

    // 如果数据库更新成功,更新redis缓存
    @CachePut(cacheManager = "cacheManager", value = "cache-1", key = "#user.userId", condition = "#result ne null")
    public User updateUser(User user) throws Exception {
        // 读取数据库
        System.out.println("数据库进行了更新,检查缓存是否一致");
        return user; // 返回最新内容,代表更新成功
    }

}

4. 测试 SpringCacheTests

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
@ActiveProfiles("single") // 设置profile
public class SpringCacheTests {

    @Resource
    SpringCacheService springCacheService;

    // ---------------spring cache注解演示
    // get
    @Test
    public void springCacheTest() throws Exception {
        User user = springCacheService.findUserById("tony");
        System.out.println(user);
    }

    // update
    @Test
    public void springCacheTest2() throws Exception {
        springCacheService.updateUser(new User("hhhhhhh-2", "tony"));
        User user = springCacheService.findUserById("tony");
        System.out.println(user);
    }

    // delete
    @Test
    public void springCacheTest3() throws Exception {
        springCacheService.deleteUserById("tony");
    }

}