你的位置:首页 > Java教程

[Java教程]SpringBoot使用redis缓存ListObject

Spring Boot使用redis做数据缓存 - 沧海一滴 - 博客园

Spring Boot使用redis做数据缓存 1 添加redis支持在...jackson2JsonRedisSerializer.setObjectMapper(om); ...sentinel.nodes= # ma-separated li...

SpringBoot中整合Redis(缓存篇) - 为程序员

今天先来讲下在 springboot 中整合 redis 的详细...Serializer = new Jackson2JsonRedisSerializer(Object...listUnshift(String key, T domain); /**...

Redis操作Listlt;Objectgt; - CSDN博客

了解Redis的朋友应该 知道,redis能操作String,Hash,Set,List等数据类型,但是不能直接对List此种数据类型进行缓存。但是我们可以借助API里面提供的set(...

SpringBoot使用redis缓存List - 酷辣虫 - CoLaBug.

Redis 数据库安装 REmote DIctionary Server(Redis) 是一个由 Salvatore Sanfilippo 写的 key-value 存储系统。 Redis 是一个开源的使用 ANSI C 语言...

(一)由浅入深学习springboot中使用redis - nfcm - 博客园

redis连接工厂类 template(模版) key和value序列化 springboot缓存某个方法 申明...(也就是查出所有的商品) Listlt;Objectgt; prodList = template.opsForList()...

详解Spring Boot使用redis实现数据缓存_java_脚本之家

本篇文章主要介绍了详解Spring Boot使用redis实现数据缓存,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

SpringBoot缓存-整合Redis | 易学教程

SpringBoot缓存-整合Redis 由匿名(未验) 提交于 2018-06-14 01:25:36 ...put(quot;user:1quot;, quot;namequot;, quot;技术部quot;); Listlt;Objectgt; keys = new ArrayList...

springboot集成redis详解-浮云-51CTO博客

toString(); } }; } /** * 管理缓存 */ @...NON_FINAL); jackson2JsonRedisSerializer.setObject...springframework.data.redis.core.ListOperations;...

Redis缓存Object,List对象 - 有梦就能实现 - 博客园

Redis缓存Object,List对象 一、到目前为止(jedis-2.2.0.jar),在Jedis中其实并没有提供这样的API对对象,或者是List对象的直接缓存,即并没有如下类似的A...

Redis 存储Listlt;Objectgt; - - ITeye博客

springboot redis 【问题解决】Redis存储Hash-Map时无法序列化问题 Redis缓存Object,List对象 Redis存储list对象 redis各种类型的存储情况分析 【redi...

redis怎么缓存listlt;objectgt;_百度知道

1个回答 - 回答时间: 2017年10月4日

redis是一个key-value存储系统和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合...更多关于SpringBoot使用redis缓存ListObject的问题gt;gt;

SpringBoot中使用redis事务 - 空挡 - 简书

首先从使用springboot+redis碰到的一个问题说起。在前几篇文章中介绍了用SpringBoot+redis构建了一个个人博客。在刚开始远行的时候发现发了几个请求操...

springboot之使用redistemplate优雅地操作redis - Janti - 博客园

介绍redis与springboot的整合 sringboot中的redistemplate...ObjectOutputStream进行序列化操作,最终redis-server...List类型的操作参考 集合 redis集...

Redis存储Object 和 listlt;objectgt; - 赵树祥的博客 - CSDN博客

redis Jedis存取list对象和map 1,redis缓存配置类 Java代码   public class...SpringBoot入门 阅读量: 篇 SpringCloud入门 阅读量:1673642...

SpringBoot整合Redis之进阶篇 - CSDN博客

上一篇文章写了SpringBoot和Redis的基本操作(SpringBoot...当然,这是并没有使用缓存的,现在我们在Service中整合...lt;Listgt; dbFunc,Object... object) {...

Redis存储Listlt;Maplt;String, Objectgt;gt; - Chou_Yuan的博客 - CSDN博客

这两天做排行榜的缓存,在对List容器进行序列化时,报reditTemplate未被定义的错误.查了一些资料大致了解了Springboot中使用redis的一些之前没用到过得...

Spring-Data-Redis存储对象(redisTemplate) - 阿宇_

)-value(byte[]-gt;Object) package .zhxjz.framework.util.redis; import java.io.Serializable; import org.springframework.dao.DataAccessExcept...

redis怎么缓存listlt;objectgt;-问答-云栖社区-阿里云

关于“redis怎么缓存list”这个问题,我认为:redis是一个key-value存储系统和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(...

Spring boot + redis + 序列化工具(四) - 飞鸟的轨迹 - CSDN博客

众所周知,使用redis,想要存入对象或者List对象,则需要给序列化一下 同时,我们在Spring boot中想要集成redis,首先,给引入jar amp;lt;dependencyamp;g...

Spring Boot 入门(二)Redis的配置与使用 - SegmentFault 思否

lt;!-- Spring Boot 使用 Redis 缓存 --gt; lt;dependency...org.springframework.data.redis.core.ListOperations;...Objectgt; valueOperations(RedisTempla...2017年广东街坊文化节开幕式什么时候?广州街坊文化节举办地点在哪里?华南植物园街坊欢乐节什么时候?广州华南植物园街坊欢乐节时间?华南植物园中秋游园会活动时间?广州华南植物园中秋游园会有什么好玩的?广州街坊文化节在哪里开幕?广东街坊文化节来华南植物园吗?2017广东街坊文化节时间?街坊文化节活动地点?中秋节去华南植物园有什么活动?广州华南植物园优惠活动介绍?北京出发去厄立特里亚旅游 北京出发去厄立特里亚旅游 北京出发去厄立特里亚旅游 北京出发去厄立特里亚旅游 北京出发去厄立特里亚旅游 北京出发去厄立特里亚旅游 北京出发去法国旅游 北京出发去法国旅游 北京出发去法国旅游 北京出发去法国旅游 北京出发去法国旅游 北京出发去法国旅游 北京出发去法罗群岛旅游 北京出发去法罗群岛旅游 北京出发去法罗群岛旅游 北京出发去法罗群岛旅游 北京出发去法罗群岛旅游 北京出发去法罗群岛旅游 北京出发去法属波利尼西亚旅游 北京出发去法属波利尼西亚旅游 北京出发去法属波利尼西亚旅游 北京出发去法属波利尼西亚旅游 北京出发去法属波利尼西亚旅游 北京出发去法属波利尼西亚旅游

一、概述

  最近在做性能优化,之前有一个业务是这样实现的:

  1.温度报警后第三方通讯管理机直接把报警信息保存到数据库

  2.我们在数据库中添加触发器,(BEFORE INSERT)根据这条报警信息处理业务逻辑,在数据库中插入“其他业务数据”

  3.前端setTimeout每隔5秒ajax去后端查询“其他业务数据”(查库)

  优化后这样实现:

  两个微服务,消息中间件专门一个服务,接收消息存入数据库,存入redis;业务服务直接从redis获取

  1.MQTT订阅通讯管理机报警事件主题

  2.发生报警后,java中根据报警信息保存“其他业务数据”到数据库并放入redis缓存

  3.前端setTimeout每隔5秒ajax去后端查询“其他业务数据”(改为从redis中获取)

  4.下一步计划使用WebSocekt,去掉前端setTimeout

二、SpringBoot配置redis

  pom.

  RedisTemplate<String, Object>可以直接存直接存List、Map等,使用jackson2JsonRedisSerializer序列化,

package ;import java.lang.reflect.Method;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.cache.CacheManager;import org.springframework.cache.interceptor.KeyGenerator;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.serializer.Jackson2JsonRedisSerializer;import org.springframework.data.redis.serializer.StringRedisSerializer;import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;import com.faster

 

三、List对象存入redis遇到的问题

  1.@Cacheable不起作用问题

  刚开始,计划在service层方法上使用注解@Cacheable进行缓存,但是redis没有保存,最后百度得到答案:一个类中@Cacheable标注的方法不能被本类中其他方法调用,否则缓存不起作用

  修改类方法调用后此问题解决

  错误的方法调用:

 

  正确的调用:其他类调用该方法

  这其中有个报错:No cache could be resolved for 'Builder[public java.util.List com.es.service.evralarm.EvrAlarmCacheService.getEvrAlarmByAccountId(java.lang.String)] caches=[] | key=''EvrAlarm-'+#accountId' | keyGenerator='' | cacheManager='' | cacheResolver='' | condition='' | unless='' | sync='false'' using resolver 'org.springframework.cache.interceptor.SimpleCacheResolver@7fbfc31a'. At least one cache should be provided per cache operation.

  @Cacheable注解中添加cacheNames即可

package ;import java.util.HashMap;import java.util.List;import java.util.Map;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.cache.annotation.Cacheable;import org.springframework.stereotype.Service;import com.es.entity.evralarm.EvrAlarm;import com.es.repository.evralarm.EvrAlarmDao;@Servicepublic class EvrAlarmCacheService {	@Autowired	private EvrAlarmDao evrAlarmDao;		@Cacheable(cacheNames="EvrAlarms",key="'EvrAlarm-'+#accountId")	public List<EvrAlarm> getEvrAlarmByAccountId(String accountId){		Map<String,Object> params = new HashMap<>();		params.put("accountId", accountId);		params.put("limit", 1);		List<EvrAlarm> evrAlarms = evrAlarmDao.selectEvrAlarmByAccount(params);				return evrAlarms;	}}

  redis中存储的数据如下图:

 

  2.Could not resolve type id 'com.es.xx.evralarm.EvrAlarm' into a subtype of [simple type, class java.lang.Object]: no such class found

at [Source: [B@29a6e242; line: 1, column: 60] (through reference chain: java.util.ArrayList[0])

  业务服务中原代码:

@Cacheable(cacheNames="EvrAlarms",key="'EvrAlarm-'+#accountId")		public List<EvrAlarm> selectEvrAlarmByAccount(String accountId){			Map<String,Object> params = new HashMap<>();			params.put("accountId", accountId);			return evrAlarmDao.selectEvrAlarmByAccount(params);		}

  看到一遍文档后明白了,根本原因是:两个微服务,实体类内容虽然一样,但是类路径不一样

四、使用StringRedisTemplate、RedisTemplate<String, Object>

  进一步分析发现使用@Cacheable有问题,消息中间件收到第二条报警消息,如果业务系统没有处理第一条报警消息(redis中未删除,同样的key redis中已有一条)则redis中的信息不会更新

  应该是:消息中间件每次接收消息,处理后都往redis中更新

  使用RedisTemplate<String, Object>直接保存List对象,redis存储中会携带一个类路径信息("com.es.xx.evralarm.EvrAlarm"),业务服务获取的时候无法解析(两个实体类内容相同,类路径不同),只能使用StringRedisTemplate了,只能是在redis存取前后自己手动对象转json

  使用Gson直接把要保存的List<>对象转成json再保存到redis

  中间件所在服务存入redis:

package com.xx.service.evralarm;import java.util.HashMap;import java.util.List;import java.util.Map;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.redis.core.StringRedisTemplate;import org.springframework.data.redis.core.ValueOperations;import org.springframework.stereotype.Service;import com.es.entity.evralarm.EvrAlarm;import com.es.repository.evralarm.EvrAlarmDao;import com.google.gson.Gson;@Servicepublic class EvrAlarmCacheService {	@Autowired	private EvrAlarmDao evrAlarmDao;		@Autowired	private StringRedisTemplate redisTemplate;		public List<EvrAlarm> getEvrAlarmByAccountId(String accountId){		Map<String,Object> params = new HashMap<>();		params.put("accountId", accountId);		params.put("limit", 1);		List<EvrAlarm> evrAlarms = evrAlarmDao.selectEvrAlarmByAccount(params);				//redis缓存		ValueOperations<String,String> vo = redisTemplate.opsForValue();		Gson gson = new Gson();		vo.set("EvrAlarm-"+accountId, gson.toJson(evrAlarms));		return evrAlarms;	}}

  

  业务服务从redis中取:

  从redis中获取key对应的value,得到string类型的value,使用Gson转成List<>对象

查询:
/**		 * 根据账户ID查询最新告警信息		 * */		public List<EvrAlarm> selectEvrAlarmByAccount(String accountId){			//redis缓存中获取			ValueOperations<String,String> vo = redisTemplate.opsForValue();			String value = vo.get("EvrAlarm-"+accountId);			Gson gson = new Gson();			List<EvrAlarm> evrAlarms = gson.fromJson(value, List.class);			return evrAlarms == null ? new ArrayList<>() : evrAlarms;		}

 

   业务操作删除、同时删除redis:  

public void deleteAccountEvralarm(String accountId, String evrAlarmId){ 	Map<String, Object> queryMap = new HashMap<>(); 	queryMap.put("accountId", accountId); 	queryMap.put("evrAlarmId", evrAlarmId); 	accountEvralarmDao.deleteByPrimaryKey(queryMap); 	//redis删除缓存 	redisTemplate.delete("EvrAlarm-"+accountId); }

  

 

最后问题解决

参考文档: