当前位置: 首页 > 知识库问答 >
问题:

如何使用key in spring应用程序将缓存的mysql数据作为redis缓存中的单个项读取

南宫森
2023-03-14

在第一次运行时缓存单个项数据后,后续运行将生成一个不能转换为错误的。我想解决在缓存中存储单个项目后获取该项目的问题。

这是一个gradle Spring应用程序,它将数据存储在MySQL数据库中,并使用redis作为缓存管理器。

服务实现类

@Autowired
    private ClientRepository clientRepository;
//This doesn't work
    @Override
    @Cacheable(value = "clientCache", key = "{#clientId}")
    public Client getClientById(long clientId) {
        System.out.println("--- Inside getClientById() ---");
        return clientRepository.findById(clientId).get();
    }

//This works
    @Override
    @Cacheable(value = "allClientsCache")
    public List<Client> getAllClients() {
        System.out.println("--- Inside getAllClients() ---");
        List<Client> list = new ArrayList<>();
        clientRepository.findAll().forEach(e -> list.add(e));
        return list;
    }

控制器类

@GetMapping("/client/{clientId}")
    @ResponseBody
    public ResponseEntity<Client> getClientById (@PathVariable Long clientId){
        Client client = clientService.getClientById(clientId);
        return new ResponseEntity<>(client, HttpStatus.OK);
    }
@GetMapping("/clients")
    public ResponseEntity<List<Client>> getAllClients() {
        List<Client> list = clientService.getAllClients();
        return new ResponseEntity<>(list, HttpStatus.OK);
    }

REDIS CONFIG课程

@Autowired
   private Environment env;

   @Bean
   public LettuceConnectionFactory redisConnectionFactory() {
        RedisStandaloneConfiguration redisConf = new RedisStandaloneConfiguration();
        return new LettuceConnectionFactory(redisConf);
   }

   @Bean
   public RedisCacheManager cacheManager() {
        RedisCacheManager rcm = RedisCacheManager.create(redisConnectionFactory());
        rcm.setTransactionAware(true);
        return rcm;
   }

    @Bean
    public RedisTemplate<?, ?> redisTemplate() {
        final RedisTemplate<?, ?> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory());
        redisTemplate.setEnableTransactionSupport(true);
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        return redisTemplate;
    }

我希望在浏览器上看到一个json客户端数据

查询单个项目时显示的错误为:

    There was an unexpected error (type=Internal Server Error, status=500).
com.example.redis.Models.ClientModel.Client cannot be cast to com.example.redis.Models.ClientModel.Client
java.lang.ClassCastException: com.example.redis.Models.ClientModel.Client cannot be cast to com.example.redis.Models.ClientModel.Client
    at com.example.redis.ServiceImplementers.Client.ClientServiceImpl$$EnhancerBySpringCGLIB$$4620f242.getClientById(<generated>)
    at com.example.redis.Controllers.ClientController.ClientController.getClientById(ClientController.java:23)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:892)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:797)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1039)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1005)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:897)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:882)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:118)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:853)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1587)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:748)

在终端上,redis将物品存储为

redis 127.0.0.1:6379> mget "clientCache::2"
1) "\xac\xed\x00\x05sr\x00\x1ecom.example.redis.Model.Client\x00\x00\x00\x00\x00\x00\x00\x01\x02\x00\nI\x00\x06activeJ\x00\bclientIdI\x00\x0bclient_codeI\x00\ncountry_idJ\x00\x06msisdnI\x00\x05phoneL\x00\aaddresst\x00\x12Ljava/lang/String;L\x00\x0bclient_nameq\x00~\x00\x01L\x00\x0bdescriptionq\x00~\x00\x01L\x00\x05emailq\x00~\x00\x01xp\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\a\x9b\x00\x00\x00\x03\x00\x00\x00hI\xa8\x00N)\xcb\xfcHt\x00\aKampalat\x00\x0cMTN Holdingst\x03wLorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.t\x00\x0fkainfo@host.com"

共有1个答案

陈马鲁
2023-03-14

https://stackoverflow.com/a/52649099/11305437

这个人把它整理出来了

谢谢@https://stackoverflow.com/users/1087605/nimai

 类似资料:
  • 问题内容: 我需要使用php创建一个具有大量数据的mysql数据库的解决方案。我的程序将有许多要求,我认为如果我使用缓存和OO数据库,我会得到很好的结果,但是我没有经验。 我认为,例如,如果我将保存在mysql中的信息缓存到redis数据库中,性能将会提高,但是我不知道这是否是个好主意,因此我希望有人来帮助我选择。 抱歉,如果我的英语不太好,我来自巴西。 问题答案: 是的,redis对此很有帮助。

  • 问题内容: 我有postgres 9.3 db,我想使用Redis来缓存对数据库的调用(基本上像memcached一样)。我遵循了这些文档,这意味着我已经基本配置了redis以用作LRU缓存。但是不确定下一步该怎么做。如何告诉Redis跟踪对数据库的调用并缓存其输出?我怎么知道它正在工作? 问题答案: 用伪代码: 这可能必须是您正在使用的查询引擎的自定义适配器。

  • 本文向大家介绍如何高效使用Redis作为LRU缓存,包括了如何高效使用Redis作为LRU缓存的使用技巧和注意事项,需要的朋友参考一下 当用Redis作为一个LRU存储时,有些时候是比较方便的,在你增添新的数据时会自动驱逐旧的数据。这种行为在开发者论坛是非常有名的,因为这是流行的memcached系统的默认行为。 LRU实际上只是支持驱逐的方式之一。这页包含更多一般的Redis maxmemory

  • 问题内容: 我们有一个iOS应用,可通过REST API与Django服务器通信。大多数数据由相当大的Item对象组成,这些对象包含一些渲染成单个平面词典的相关模型,并且该数据很少更改。 我们发现,查询这对于Postgres来说不是问题,但是生成JSON响应需要花费大量时间。另一方面,每个用户的项目集合也有所不同。 我想到了一个渲染系统,我们只需要为Item对象构建一个字典并将其保存为JSON字符

  • 本文向大家介绍使用Memcache缓存mysql数据库操作的原理和缓存过程浅析,包括了使用Memcache缓存mysql数据库操作的原理和缓存过程浅析的使用技巧和注意事项,需要的朋友参考一下 对于大型网站如facebook,ebay等网站,如果没有Memcache做为中间缓存层,数据访问不可能吃得消,对于一般网站,只要具备独立的服务器,完全可以通过配置Memcache提高网站访问速度和减少数据库压

  • 问题内容: 我正在计划将C#ASP.Net Web应用程序移到Azure(当前托管在单个专用服务器上)的过程中,并且正在研究缓存选项。当前,因为我们一次只能运行一个应用程序实例,所以我们有一个“进程中”内存缓存来缓解SQL DB的某些相同请求。 当前的过程是在管理器/服务对数据库的那些部分进行更改时清除缓存的某些部分,例如,我们有一个用户表,并且我们将拥有诸如“ User。{0}”之类的键,返回一