spring-boot-note6---redis

SpringBoot整合Redis,本文采用RedisTemplate操作redis和配置CacheMannager使用缓存注解的二个方式。

一、配置相关

  1、添加pom依赖

 
            org.springframework.boot
            spring-boot-starter-redis
        

2、application.properties

#redis配置
spring.redis.database=0
#Redis服务器地址
spring.redis.host=127.0.0.1
#Redis服务器连接端口
spring.redis.port=6379
#Redis服务器连接密码(默认为空)
spring.redis.password=123456
#连接超时时间
spring.redis.timeout=2000
#连接池最大连接数(使用负值表示没有限制)
spring.redis.pool.max-active=500
#连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.pool.max-wait=10000
#连接池中的最大空闲连接
spring.redis.pool.max-idle=50
#连接池中的最小空闲连接
spring.redis.pool.min-idle=0

 包结构: 

spring-boot-note6---redis_第1张图片

配置类详细:(1、配置redisTemplate可直接操作redis,2、配置CacheManager+@EnableCaching可以使用缓存注解)

@Configuration
@EnableCaching  // 开启注解的方式
public class RedisConfig {
	
	
    /**
     * 1、设置CacheManager实现为redisCacheMannager,并且开启EnableCaching,可以使用缓存注解。
     */
    @Bean
    public CacheManager cacheManager(RedisTemplate redisTemplate) {
        RedisCacheManager rcm = new RedisCacheManager(redisTemplate);
        rcm.setUsePrefix(true);
        rcm.setCacheNames(Arrays.asList("myCache"));
        rcm.setDefaultExpiration(600);
        return rcm;
    }
    
    /**
     * 2、redisTemplate配置完成可以直接使用redis
     */
    @Bean
    public RedisTemplate redisTemplate(RedisConnectionFactory connectionFactory) {
        RedisTemplate template = new RedisTemplate<>();
        template.setConnectionFactory(connectionFactory);

        //使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式)
        Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer<>(Object.class);
        ObjectMapper mapper = new ObjectMapper();
        mapper.setVisibility(PropertyAccessor.ALL, Visibility.ANY);
        mapper.enableDefaultTyping(DefaultTyping.NON_FINAL);
        serializer.setObjectMapper(mapper);

        //使用StringRedisSerializer来序列化和反序列化redis的key值
        template.setValueSerializer(serializer);
        template.setKeySerializer(new StringRedisSerializer());
        template.setHashKeySerializer(new StringRedisSerializer());
        template.setHashValueSerializer(serializer);
        template.afterPropertiesSet();
        return template;
    } 
  

二、使用redistemplate操作redis

1、pojo、dao等。

public class Person implements Serializable{
	private static final long serialVersionUID = -3189329947019478591L;
	private Integer id;
	public String name;
@Component
public class PersonDao {
	
	private static Map map = new HashMap<>();
	
	static {
		Person p;
		for (int i = 0; i < 10; i++) {
			p = new Person();
			p.setId(i);
			p.setName("name" + i);
			map.put(i, p);
		}
	}
	
	public void deleteById(Integer id) {
		map.remove(id);
	}
	
	public Person findById(Integer id) {
		return map.get(id);
	}
	
	public void updateOne(Person person) {
		Person old = map.get(person.getId());
		old.setName(person.getName());
	}

	public void saveOne(Person person) {
		map.put(person.getId(), person);
	}

	public List findList() {
		return new ArrayList<>(map.values());
	}

2、redisTemplate操作redis的service类

/**
 * 使用redisTemplate操作缓存。
 */
@Service
public class PersonService {
	
	 private Logger logger = LoggerFactory.getLogger(this.getClass());

	@Autowired
	private PersonDao personDao;
	
	@Resource
	private RedisTemplate redisTemplate;
	
	/**
	 * 查找person
	 * 缓存存在从缓存中取,不存在,查询出放入缓存。
	 */
	public Person getById(int id) {
		logger.info("获取用户start...");
		String key = "person_" + id;
		ValueOperations operations = redisTemplate.opsForValue();
		boolean hasKey = redisTemplate.hasKey(key);
		if (hasKey) {
			Person user = operations.get(key);
			logger.info("从缓存中获取了 id = " + id);
			return user;
		}
		Person person = personDao.findById(id);
		operations.set(key, person, 10, TimeUnit.SECONDS);
		return person;
	}
	
    /**
     * 更新用户
     * 如果缓存存在,删除
     * 如果缓存不存在,不操作
     */
    public void updateUser(Person person) {
        logger.info("更新用户start...");
        personDao.updateOne(person);
        String key = "person_" + person.getId();
        boolean hasKey = redisTemplate.hasKey(key);
        if (hasKey) {
            redisTemplate.delete(key);
            logger.info("更新时,删除缓存id= " + person.getId());
        }
    }
	
    /**
     * 删除用户
     * 如果缓存中存在,删除
     */
	public void deleteById(int id) {
		logger.info("删除用户start...");
		personDao.deleteById(id);
		String key = "person_" + id;
		boolean hasKey = redisTemplate.hasKey(key);
		if (hasKey) {
			redisTemplate.delete(key);
			logger.info("删除时,从缓存中删除id=>> " + id);
		}
	}

}

3、测试使用。

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
public class TestPersonService {
	
	 @Autowired
	 private PersonService personService;

	/**
	 * redis缓存使用redisTemplate操作的演示
	 */
	@Test
	public void testCache() {
		int id = 1;
		Person person = personService.getById(id);  // 第1次查询           //获取用户start...
		Person person2 = personService.getById(id); // 第2次查询         //获取用户start... 
																    //从缓存中获取了 id = 1
		person2.setName("update_name");
		personService.updateUser(person2); // 第1次更新  				//更新用户start... 
												       				//更新时,删除缓存id= 1
		Person person3 = personService.getById(id); // 第3次查询  	//获取用户start...
		System.out.println(person3.getName()); 						// update_name
		personService.deleteById(id); // 第1次删除   					// 删除用户start... 
									  								// 删除时,从缓存中删除id=>> 1
		assertNull(personService.getById(id));
	}
	
}

三、使用缓存注解的方式。

@Service
public class PersonCacheService {
	
	@Autowired
	private PersonDao personDao;
	
	/**
	 * 查询一个Person
	 */
	@Cacheable(value = "myCache", key = "'Persons_'+#id")
	public Person findPerson(Integer id) {
		Person person = this.personDao.findById(id);
		System.out.println("数据库查一条记录:id=" + id);
		return person;
	}
	
	/**
	 * 更新一个Person,每次都会执行。
	 */
	@CachePut(value="myCache", key="'Persons_'+#id")
	public Person updatePerson(Person person,Integer id) {
		this.personDao.updateOne(person);
		System.out.println("数据库更新一条记录:id=" + id);
		return person;
		
	}

	/**
	 * 删除一个Person
	 */
	@CacheEvict(value = "myCache", key = "'Persons_'+#id", condition = "#id!=99")
	public void delPerson(Integer id) {
		System.out.println("数据库删除一条记录:id=" + id);
		this.personDao.deleteById(id);
	}
	
}
@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
public class TestPersonCacheService {

	 @Autowired
	 private PersonCacheService personCacheService;
	
	 @Test
	 public void test1() {
		Person person1 = personCacheService.findPerson(1); // 数据库查一条记录:id=1
		Person person2 = personCacheService.findPerson(1);
		person2.setName("update_name");
		personCacheService.updatePerson(person2, 1); //数据库更新一条记录:id=1
		Person person3 = personCacheService.findPerson(1); // 不查询,@CachePut每次都会执行,并把结果放入缓存。
		System.out.println(person3.getName()); //update_name
		personCacheService.delPerson(1); // 数据库删除一条记录:id=1
	 }

}

 

 

你可能感兴趣的:(spring-boot)