评论

收藏

[Java] spring-data-redis 2.0 的使用示例代码

编程语言 编程语言 发布于:2021-10-05 19:30 | 阅读数:340 | 评论:0

这篇文章主要介绍了spring-data-redis 2.0 的使用示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
在使用spring boot2.x运行redis时,发现百度不到顺手的文档,搞通后发现其实这个过程非常简单和简洁,觉得有必要拿出来分享一下。
spring boot2.x 不再使用jedis,换成了lettuce。lettuce是基于 netty 实现的,所以性能更好。但是我看到很多文章居然在spring boot 2.x还在写jedis的配置。
依赖
依赖比较简单,spring-boot-starter-data-redis、commons-pool2 即可。
<!-- redis -->
<dependency>
  <groupid>org.springframework.boot</groupid>
  <artifactid>spring-boot-starter-data-redis</artifactid>
</dependency>
 
 
<!--spring2.0集成redis所需common-pool2-->
<dependency>
  <groupid>org.apache.commons</groupid>
  <artifactid>commons-pool2</artifactid>
  <version>2.4.2</version>
</dependency>
属性配置
在属性中配置redis server的访问地址、密码、数据库,并配置连接池的属性。
redis:
 #  reids的连接ip
 host: 127.0.0.1
 port: 6379
 password: helloworld
 
 # redis默认情况下有16个分片,这里配置具体使用的分片,默认是0
 database: 0
 
 # 连接超时时间(毫秒)
 timeout: 10000ms
 
 # redis client配置,使用lettuce
 lettuce:
  pool:
   # 连接池中的最小空闲连接 默认 0
   min-idle: 0
   # 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1
   max-wait: 1000ms
   # 连接池最大连接数(使用负值表示没有限制) 默认 8
   max-active: 8
   # 连接池中的最大空闲连接 默认 8
   max-idle: 8
注解配置
全局使能缓存
@enableswagger2   // 使用swagger api 功能
@enablecaching    // 使用缓存
@springbootapplication
public class starter {
 
  public static void main(string[] args) {
  springapplication.run(starter.class, args);
  }
}
通过注解使用缓存,@cacheable 将获取值存入缓存
/**
 * 基于id 获取用户信息
 */
@cacheable(value="user", key="#id", unless="#result == null")
public userdto getuserbyid(int id) {
  user userentity = usermapper.getuserbyid(id);
  if (userentity == null){
  return null;
  }
 
  /* entity 转 dto */
  userdto userdto = new userdto();
  userdto.setage(userentity.getage());
  userdto.setid(id);
  userdto.setname(userentity.getname());
  userdto.setcreatetime(unixtime2string(userentity.getcreatetime()));
  userdto.setphone(userentity.getphone());
  userdto.setemail(userentity.getemail());
  return userdto;
}
@cacheput 更新缓存
@cacheput(value = "user", key="#p0.id")
public userdto updateuser(inputuserinfodto inputuserinfodto){
  usermapper.updateuser(inputuserinfodto.getid(), inputuserinfodto.getname(), inputuserinfodto.getage());
  user userentity = usermapper.getuserbyid(inputuserinfodto.getid());/* entity 转 dto */
 
  if (null == userentity){
  return null;
  }
  userdto userdto = new userdto();
  userdto.setage(userentity.getage());
  userdto.setid(userentity.getid());
  userdto.setname(userentity.getname());
  userdto.setcreatetime(unixtime2string(userentity.getcreatetime()));
  userdto.setphone(userentity.getphone());
  userdto.setemail(userentity.getemail());
  return userdto;
}
@cacheevict 删除缓存
@cacheevict(value = "user", key="#id")
public void deleteuser(int id){
  usermapper.deleteuser(id);
}
当然为了支持序列化,我的userdto得implements serializable
@data
public class userdto implements serializable {
//public class userdto implements serializable {
  private int id;
  private string name;
  private int age;
  private string createtime;
  private string phone;
  private string email;
}
至此缓存已经可以用起来了,不需要编写redisconfig代码,有点小遗憾,直接去redis查看数据,发现是乱码。这是因为我使用的是java自带的序列化,如果要更换redis序列化方法,就要重写redisconfig了。
redisconfig
这个配置也不复杂,使用jackson2jsonredisserializer将对象转换为json串,注意这里一定要使用objectmapper,否则再将json串反序列化为对象时会报。
@configuration
@conditionalonclass(redisoperations.class)
@enableconfigurationproperties(redisproperties.class)
public class redisconfig extends cachingconfigurersupport{
 
  @bean
  public cachemanager cachemanager(redisconnectionfactory factory) {
  redisserializer<string> redisserializer = new stringredisserializer();
  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);
 
  // 配置序列化(解决乱码的问题)
  rediscacheconfiguration config = rediscacheconfiguration.defaultcacheconfig()
            .entryttl(duration.zero)
            .serializekeyswith(redisserializationcontext.serializationpair.fromserializer(redisserializer))
            .serializevalueswith(redisserializationcontext.serializationpair.fromserializer(jackson2jsonredisserializer))
            .disablecachingnullvalues();
 
  rediscachemanager cachemanager = rediscachemanager.builder(factory).cachedefaults(config).build();
  return cachemanager;
  }
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持CodeAE代码之家
原文链接:https://segmentfault.com/a/1190000017953598

关注下面的标签,发现更多相似文章