设为首页 收藏本站
查看: 1233|回复: 0

[经验分享] SpringBoot使用Redis缓存

[复制链接]

尚未签到

发表于 2017-12-20 17:23:19 | 显示全部楼层 |阅读模式
  (1)pom.xml引入jar包,如下:
  

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

  (2)修改项目启动类,增加注解@EnableCaching,开启缓存功能,如下:
  

package springboot;  

  

import org.springframework.boot.SpringApplication;  

import org.springframework.boot.autoconfigure.SpringBootApplication;  

import org.springframework.cache.annotation.EnableCaching;  

import org.springframework.scheduling.annotation.EnableScheduling;  

  
@SpringBootApplication
  
@EnableScheduling
  
@EnableCaching
  

public>
public static void main(String[] args) {  SpringApplication.run(SpringbootApplication.
class, args);  }
  
}
  

  (3)application.properties中配置Redis连接信息,如下:
  

# Redis数据库索引(默认为0)  
spring.redis.database
=0  
# Redis服务器地址
  
spring.redis.host
=172.31.19.222  
# 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  

  (4)新建Redis缓存配置类RedisConfig,如下:
  

package springboot.config;  

import org.springframework.beans.factory.annotation.Value;  

import org.springframework.cache.CacheManager;  

import org.springframework.cache.annotation.CachingConfigurerSupport;  

import org.springframework.cache.annotation.EnableCaching;  

import org.springframework.context.annotation.Bean;  

import org.springframework.context.annotation.Configuration;  

import org.springframework.data.redis.cache.RedisCacheManager;  

import org.springframework.data.redis.connection.RedisConnectionFactory;  

import org.springframework.data.redis.core.RedisTemplate;  

import org.springframework.data.redis.core.StringRedisTemplate;  

import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;  

  

import com.fasterxml.jackson.annotation.JsonAutoDetect;  

import com.fasterxml.jackson.annotation.PropertyAccessor;  

import com.fasterxml.jackson.databind.ObjectMapper;  

  

  

/**  * Redis缓存配置类
  *
@author szekinwin  *
*/  
@Configuration
  
@EnableCaching
  

public>
  @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);
  }
  
}
  

  (5)新建UserMapper,如下:
  

package springboot.dao;  

  

import org.apache.ibatis.annotations.Delete;  

import org.apache.ibatis.annotations.Insert;  

import org.apache.ibatis.annotations.Mapper;  

import org.apache.ibatis.annotations.Param;  

import org.apache.ibatis.annotations.Select;  

import org.apache.ibatis.annotations.Update;  

import org.springframework.cache.annotation.CacheConfig;  

import org.springframework.cache.annotation.CacheEvict;  

import org.springframework.cache.annotation.CachePut;  

import org.springframework.cache.annotation.Cacheable;  

  

import springboot.domain.User;  

  
@Mapper
  
@CacheConfig(cacheNames
= "users")  

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>@Cacheable(key ="#p0")  User findById(@Param(
"id") String>  @CachePut(key
= "#p0")  @Update(
"update user set name=#{name} where>void updataById(@Param("id")String>//如果指定为 true,则方法调用后将立即清空所有缓存  @CacheEvict(key ="#p0",allEntries=true)

  @Delete("delete from user where>
  void deleteById(@Param("id")String>  
}
  

  @Cacheable将查询结果缓存到redis中,(key="#p0")指定传入的第一个参数作为redis的key。
  @CachePut,指定key,将更新的结果同步到redis中
  @CacheEvict,指定key,删除缓存数据,allEntries=true,方法调用后将立即清除缓存
  (6)service层与controller层跟上一篇整合一样,启动redis服务器,redis服务器的安装与启动可以参考之前的博客,地址如下:
  http://www.cnblogs.com/gdpuzxs/p/6623171.html
  (7)配置log4j日志信息,如下:
  

## LOG4J配置  
log4j.rootCategory
=DEBUG,stdout  
## 控制台输出
  
log4j.appender.stdout
=org.apache.log4j.ConsoleAppender  
log4j.appender.stdout.layout
=org.apache.log4j.PatternLayout  
log4j.appender.stdout.layout.ConversionPattern
=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n  

  (8)验证redis缓存
  首先我们向user表总插入一条数据,数据库显示如下:
DSC0000.png

  现在,我们查询一下user表中id=24的数据,观擦控制台输出的信息,如下:
DSC0001.png

  通过控制台输出信息我们可以知道,这次执行了数据库查询,并开启了Redis缓存查询结果。接下来我们再次查询user表中id=24的数据,观察控制台,如下:
DSC0002.png

  通过控制台输出信息我们可以知道,这次并没有执行数据库查询,而是从Redis缓存中查询,并返回查询结果。我们查看redis中的信息,如下:
DSC0003.png

  方法finduser方法使用了注解@Cacheable(key="#p0"),即将id作为redis中的key值。当我们更新数据的时候,应该使用@CachePut(key="#p0")进行缓存数据的更新,否则将查询到脏数据。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-426137-1-1.html 上篇帖子: python之redis 下篇帖子: redis设置开机启动
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表