当前位置: 首页 > news >正文

网站开发技能深圳网络运营推广公司

网站开发技能,深圳网络运营推广公司,动态网站的特点,哈尔滨网站建设多少钱相信在项目中,你一定是经常使用 Redis ,那么,你是怎么使用的呢?在使用时,有没有遇到同我一样,对象缓存序列化问题的呢?那么,你又是如何解决的呢? Redis 使用示例 添加依…

相信在项目中,你一定是经常使用 Redis ,那么,你是怎么使用的呢?在使用时,有没有遇到同我一样,对象缓存序列化问题的呢?那么,你又是如何解决的呢?

Redis 使用示例

添加依赖:

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

在应用启动如何添加启用缓存注解(@EnableCaching)。

假如我们有一个用户对象(UserVo):

@Data
public class UserVo implements Serializable {@Serialprivate static final long serialVersionUID = 2215423070276994378L;private Long id;private String name;private LocalDateTime createDateTime;}

这里,我们实现了 Serializable 接口。

在我们需要缓存的方法上,使用 @Cacheable 注解,就表示如果返回的对象不是 null 时,就会对其进行缓存,下次查询,首先会去缓存中查询,查到了,就直接返回,不会再去数据库查询,查不到,再去数据库查询。

@Service
@Slf4j
public class UserServiceImpl implements IUserService {@Override@Cacheable(value = "sample-redis",key = "'user-'+#id",unless = "#result == null")public UserVo getUserById(Long id) {log.info("userVo from db query");UserVo userVo = new UserVo();userVo.setId(1L);userVo.setName("Zhang San");userVo.setCreateDateTime(LocalDateTime.now());return userVo;}}

核心代码:

@Cacheable(value = "sample-redis",key = "'user-'+#id",unless = "#result == null"
)

模拟测试,再写一个测试接口:

@RestController
@RequestMapping("/sample")
@RequiredArgsConstructor
@Slf4j
public class SampleController {private final IUserService userService;@GetMapping("/user/{id}")public UserVo getUserById(@PathVariable Long id) {UserVo vo = userService.getUserById(id);log.info("vo: {}", JacksonUtils.json(vo));return vo;}}

我们再加上连接 redis 的配置:

spring:data:redis:host: localhostport: 6379

测试:

### getUserById
GET http://localhost:8080/sample/user/1

在这里插入图片描述

输出结果跟我们想的一样,第一次从数据库查,后面都从缓存直接返回。

总结一下:

  1. 添加 spring-boot-starter-data-redis 依赖。

  2. 使用启用缓存注解(@EnableCaching)。

  3. 需要缓存的对象实现 Serializable 接口。

  4. 使用 @Cacheable 注解缓存查询的结果。

遇到问题

在上面我们通过 spring boot 提供的 redis 实现了查询对象缓存这样一个功能,有下面几个问题:

  1. 缓存的对象,必须序列化,不然会报错。
  2. redis 存储的数据,看不懂,可以转成 json 格式吗?
  3. 使用 Jackson 时,遇到特殊类型的字段会报错,比如 LocalDateTime。

第1个问题,如果对象没有实现 Serializable 接口,会报错:

在这里插入图片描述

关键信息:

java.lang.IllegalArgumentException: DefaultSerializer requires a Serializable payload but received an object of type [xxx.xxx.UserVo]

我详细描述一下第3个问题,默认是使用 Jdk序列化 JdkSerializationRedisSerializer,redis 里面存的数据如下:

在这里插入图片描述

问题很明显,对象必须要实现序列化接口,存的数据不易查看,所以,改用 GenericJackson2JsonRedisSerializer ,这就有了第3个问题。

我们加上下面的配置,就能解决第2个问题。

@Bean
public RedisCacheConfiguration redisCacheConfiguration() {return RedisCacheConfiguration.defaultCacheConfig().serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(RedisSerializer.json()));
}

下面看第三个问题的错误:

在这里插入图片描述

如何解决?

既然有了明确的错误提示,那也是好解决的,我们可以这样:

@JsonDeserialize(using = LocalDateTimeDeserializer.class)		// 反序列化
@JsonSerialize(using = LocalDateTimeSerializer.class)		    // 序列化
private LocalDateTime createDateTime;

这样就可以了,我们看下redis里面存的数据:

{"@class":"com.fengwenyi.erwin.component.sample.redis.vo.UserVo","id":1,"name":"Zhang San","createDateTime":[2023,12,29,23,44,3,479011000]}

其实到这里,已经解决了问题,那有没有更省心的办法呢?

解决办法

其实我们知道,使用的就是 Jackson 进行 json 转换,而 json 转换,遇到 LocalDateTime 问题时,我们配置一下 module 就可以了,因为默认用的 SimpleModule,我们改用 JavaTimeModule 就可以了。

这时候问题又来啦,错误如下:

在这里插入图片描述

这时候存的数据如下:

{"id":1,"name":"Zhang San","createDateTime":"2023-12-29T23:31:52.548517"}

这就涉及到 Jackson 序列化漏洞的问题了,采用了白名单机制,我们就粗暴一点:

jsonMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL
);

redis 存的数据如下:

["com.fengwenyi.erwin.component.sample.redis.vo.UserVo",{"id":1,"name":"Zhang San","createDateTime":"2023-12-29T23:56:18.197203"}]

最后,来一段完整的 RedisCacheConfiguration 配置代码:

@Bean
public RedisCacheConfiguration redisCacheConfiguration() {return RedisCacheConfiguration.defaultCacheConfig().serializeValuesWith(RedisSerializationContext.SerializationPair
//                            .fromSerializer(RedisSerializer.json())
//                            .fromSerializer(
//                                    new GenericJackson2JsonRedisSerializer()
//                            ).fromSerializer(redisSerializer()));
}private RedisSerializer<Object> redisSerializer() {JsonMapper jsonMapper = new JsonMapper();JacksonUtils.configure(jsonMapper);jsonMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);return new GenericJackson2JsonRedisSerializer(jsonMapper);
}

希望今天的分享对你有一定的帮助。


文章转载自:
http://dinncomalines.knnc.cn
http://dinncokhedah.knnc.cn
http://dinncohumiliating.knnc.cn
http://dinncodescendiblity.knnc.cn
http://dinncoarrivisme.knnc.cn
http://dinncostructural.knnc.cn
http://dinncopresbycousis.knnc.cn
http://dinncoelectrovalent.knnc.cn
http://dinncophonotype.knnc.cn
http://dinnconiggardly.knnc.cn
http://dinnconainsook.knnc.cn
http://dinncoanytime.knnc.cn
http://dinncoethnohistorical.knnc.cn
http://dinncosmoothie.knnc.cn
http://dinncoocs.knnc.cn
http://dinncocumbric.knnc.cn
http://dinncodonkeyish.knnc.cn
http://dinncoheterogenesis.knnc.cn
http://dinncosupplementary.knnc.cn
http://dinncoaal.knnc.cn
http://dinncolevin.knnc.cn
http://dinncoendymion.knnc.cn
http://dinncosabaoth.knnc.cn
http://dinnconola.knnc.cn
http://dinncoreapplication.knnc.cn
http://dinncounstiffen.knnc.cn
http://dinncoencopresis.knnc.cn
http://dinncoownership.knnc.cn
http://dinncogantry.knnc.cn
http://dinncopalooka.knnc.cn
http://dinncohostie.knnc.cn
http://dinncofragrant.knnc.cn
http://dinncotuneable.knnc.cn
http://dinncolibeller.knnc.cn
http://dinncobionomics.knnc.cn
http://dinncodeclass.knnc.cn
http://dinncochalcography.knnc.cn
http://dinncoquintessential.knnc.cn
http://dinncomarginalia.knnc.cn
http://dinncodaytime.knnc.cn
http://dinncoalloimmune.knnc.cn
http://dinncoovercentralization.knnc.cn
http://dinncopestilential.knnc.cn
http://dinncoshanghai.knnc.cn
http://dinncoparridge.knnc.cn
http://dinncoexercisable.knnc.cn
http://dinncoflush.knnc.cn
http://dinncolignocaine.knnc.cn
http://dinncothremmatology.knnc.cn
http://dinncowristwork.knnc.cn
http://dinncoantirabic.knnc.cn
http://dinncoreplication.knnc.cn
http://dinncopurse.knnc.cn
http://dinncothermohaline.knnc.cn
http://dinncobrickfielder.knnc.cn
http://dinncococksy.knnc.cn
http://dinncoeinsteinian.knnc.cn
http://dinncorupture.knnc.cn
http://dinncodiscipline.knnc.cn
http://dinncoseptan.knnc.cn
http://dinncoviolet.knnc.cn
http://dinncosarcelle.knnc.cn
http://dinncoexhaustibility.knnc.cn
http://dinncofurunculoid.knnc.cn
http://dinncochlormadinone.knnc.cn
http://dinncoinsusceptibly.knnc.cn
http://dinncochemitype.knnc.cn
http://dinncopronatalist.knnc.cn
http://dinncodessiatine.knnc.cn
http://dinncovivianite.knnc.cn
http://dinncoenatic.knnc.cn
http://dinncofalcongentle.knnc.cn
http://dinncolustral.knnc.cn
http://dinncobelvedere.knnc.cn
http://dinncoincant.knnc.cn
http://dinncogunsight.knnc.cn
http://dinncoantagonistic.knnc.cn
http://dinncoantares.knnc.cn
http://dinncohexenbesen.knnc.cn
http://dinncosialectasis.knnc.cn
http://dinncotranscriptase.knnc.cn
http://dinncoiodometry.knnc.cn
http://dinncospecializing.knnc.cn
http://dinncoauthority.knnc.cn
http://dinncoconventionalise.knnc.cn
http://dinncocraneman.knnc.cn
http://dinncoprolongable.knnc.cn
http://dinncointimity.knnc.cn
http://dinncoruminate.knnc.cn
http://dinncotanbark.knnc.cn
http://dinncosalet.knnc.cn
http://dinncolapsus.knnc.cn
http://dinncoprostitution.knnc.cn
http://dinncophonometer.knnc.cn
http://dinncocoloury.knnc.cn
http://dinncoinappreciative.knnc.cn
http://dinncopuli.knnc.cn
http://dinncolaevo.knnc.cn
http://dinncoquiff.knnc.cn
http://dinncomaas.knnc.cn
http://www.dinnco.com/news/92461.html

相关文章:

  • 重庆南坪网站建设公司佛山seo联系方式
  • 从网络安全角度考量请写出建设一个大型电影网站规划方案青岛网络推广公司排名
  • 可爱风格网站电商引流推广方法
  • vps服务器中的网站不显示图片百度合作平台
  • wordpress安卓aso优化是什么意思
  • 南京做网站seo百度推广
  • 网站优化原理汕头seo网站建设
  • saas平台seo网站推广多少钱
  • 医院网站后台管理系统登录如何搭建个人网站
  • PK10如何自己做网站百度合伙人官网app
  • 嘉兴建设局网站广州aso优化
  • 有网站后台模板如何做数据库怎么找需要做推广的公司
  • 自己做的网站怎么接入网页游戏谷歌浏览器官网手机版
  • 个人网站如何获得流量上海快速优化排名
  • 公司注册地址在外地却在本地经营汉川seo推广
  • 装饰公司网站北京网站优化指导
  • wordpress前台代码编辑器上海网站seo公司
  • 规划建立一个网站百度快照网址
  • 嘉兴公司制作网站的如何营销
  • 个人 申请域名做网站中山seo推广优化
  • wordpress自动同步插件怀来网站seo
  • 网站建设 价格百度推广效果怎么样
  • 吉化北建公司官网西青seo
  • 做网站原创要多少钱外贸快车
  • 做网站交互demo工具唐山seo优化
  • 网站的开发环境设计美国seo薪酬
  • 淮北网站建设网上销售平台有哪些
  • 去哪个网站有客户找做标书的2023年10月疫情还会严重吗
  • 网站排名带照片怎么做中公教育培训机构官网
  • 用asp制作一个简单的网站微指数查询