在Spring boot使用redis緩存


1.maven引包

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

注:springboot版本1.5.2

 

2. 配置application.properties

# Redis數據庫索引(默認為0)
spring.redis.database=0
# Redis服務器地址
spring.redis.host=127.0.0.1
# Redis服務器連接端口
spring.redis.port=6379
# Redis服務器連接密碼(默認為空)
spring.redis.password=
# 連接池最大連接數(使用負值表示沒有限制)
spring.redis.pool.max-active=8
# 連接池最大阻塞等待時間(使用負值表示沒有限制)
spring.redis.pool.max-wait=-1
# 連接池中的最大空閑連接
spring.redis.pool.max-idle=8
# 連接池中的最小空閑連接
spring.redis.pool.min-idle=0
# 連接超時時間(毫秒)
spring.redis.timeout=0

注:sever,mybatis等配置不贅述

 

3.為啟動類添加注解:

@SpringBootApplication @MapperScan("com.tqh.demo.mapper") @EnableScheduling @EnableCaching public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }

 

4.創建redis的配置類

@Configuration @EnableCaching public class RedisConfig extends CachingConfigurerSupport { @Value("${spring.redis.host}") private String host; @Value("${spring.redis.port}") private int port; @Value("${spring.redis.timeout}") private int timeout; //自定義緩存key生成策略 // @Bean // public KeyGenerator keyGenerator() { // return new KeyGenerator(){ // @Override // public Object generate(Object target, java.lang.reflect.Method method, Object... params) { // StringBuffer sb = new StringBuffer(); // sb.append(target.getClass().getName()); // sb.append(method.getName()); // for(Object obj:params){ // sb.append(obj.toString()); // } // return sb.toString(); // } // }; // } //緩存管理器
 @Bean public CacheManager cacheManager(@SuppressWarnings("rawtypes") RedisTemplate redisTemplate) { RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate); //設置緩存過期時間
        cacheManager.setDefaultExpiration(10000); return cacheManager; } @Bean public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory){ StringRedisTemplate template = new StringRedisTemplate(factory); setSerializer(template);//設置序列化工具
 template.afterPropertiesSet(); return template; } private void setSerializer(StringRedisTemplate template){ @SuppressWarnings({ "rawtypes", "unchecked" }) 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.setValueSerializer(jackson2JsonRedisSerializer); } }

 

4.創建測試類 User

public class User { String id; String name; String age; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; }

注:數據庫里也要創建好相應的表和測試的數據

 

5.創建UserMapper

@Repository public interface UserMapper { @Insert("insert into user(name,age) values(#{name},#{age})") int addUser(@Param("name")String name,@Param("age")String age); @Select("select * from user where id =#{id}") User findById(@Param("id") String id); @Update("update user set name=#{name} where id=#{id}") void updataById(@Param("id")String id,@Param("name")String name); @Delete("delete from user where id=#{id}") void deleteById(@Param("id")String id); }

 

6.創建UserService,緩存就在這層工作

//@Cacheable將查詢結果緩存到redis中,(key="#p0")指定傳入的第一個參數作為redis的key。 //
//@CachePut,指定key,將更新的結果同步到redis中 //
//@CacheEvict,指定key,刪除緩存數據,allEntries=true,方法調用后將立即清除緩存
@Service @CacheConfig(cacheNames = "users") public class UserService { @Autowired UserMapper userMapper; @Cacheable(key ="#p0") public User selectUser(String id){ System.out.println("select"); return userMapper.findById(id); } @CachePut(key = "#p0") public void updataById(String id, String name){ System.out.println("update"); userMapper.updataById(id,name); } //如果指定為 true,則方法調用后將立即清空所有緩存
    @CacheEvict(key ="#p0",allEntries=true) public void deleteById(String id){ System.out.println("delete"); userMapper.deleteById(id); } }

注: 給key增加額外字符的寫法 @Cacheable(key ="'user'+#p0")

 

 

7.Controller

@Controller @RequestMapping("/") public class RedisController { @Autowired UserService userService; @RequestMapping("select/{id}") @ResponseBody public User ForTest(@PathVariable String id){ return userService.selectUser(id); } @RequestMapping( "/update/{id}") @ResponseBody public String update(@PathVariable String id){ userService.updataById(id,"aaa"); return "update success"; } @RequestMapping( "/delete/{id}") @ResponseBody public String delete (@PathVariable String id){ userService.deleteById(id); return "delete success"; } }

 

測試:

 

第一次select成功,會在控制台打印“select”,說明查詢了mysql數據庫

第二次以后就不會打印了,因為查的是redis緩存

 

update和delete不贅述,可以在redis客戶端查看keys * 看到修改和刪除對應的數據變化

 

注:

redis默認的持久化方案是RDB,每xxx分鍾如果發生xxx條數據變化就存一次dump文件,重啟后會自動恢復(在dump文件的儲存目錄下啟動redis)。

另一種方案是AOF,記錄每一次數據的變化,二者都可在redis.conf里配置

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM