Spring-data-redis问题

问题描述

使用的RedisTemplate,做读写操作时候,都是要经过序列化和反序列化。最近遇到了一个问题,使用incr计数,存进去了一个数字(int类型),但是因为是序列化之后存进去的,调用incr方法时候报错了:​org.springframework.dao.InvalidDataAccessApiUsageException:ERRvalueisnotanintegeroroutofrange;nestedexceptionisredis.clients.jedis.exceptions.JedisDataException:ERRvalueisnotanintegeroroutofrangeatorg.springframework.data.redis.connection.jedis.JedisUtils.convertJedisAccessException(JedisUtils.java:72)atorg.springframework.data.redis.connection.jedis.JedisConnection.convertJedisAccessException(JedisConnection.java:135)atorg.springframework.data.redis.connection.jedis.JedisConnection.incrBy(JedisConnection.java:1099)atsun.reflect.NativeMethodAccessorImpl.invoke0(NativeMethod)​...RedisTemplate本身没有提供不需要序列化就可以存储的方法,有什么办法可以解决呢?

解决方案

解决方案二:
save方法,序列化是自己实现的:publicvoidsave(finalKredisKey,finalVdata){if(redisKey!=null&&data!=null){redisTemplate.execute(newRedisCallback<V>(){publicVdoInRedis(RedisConnectionconnection)throwsDataAccessException{byte[]bkey=ObjectTranscoder.serialize(redisKey);connection.set(bkey,ObjectTranscoder.serialize(data));connection.close();returnnull;}});}}incrBy方法:publicvoidincr(finalKredisKey,finallongincreValue){if(redisKey!=null){redisTemplate.execute(newRedisCallback<V>(){publicVdoInRedis(RedisConnectionconnection)throwsDataAccessException{byte[]bkey=ObjectTranscoder.serialize(redisKey);connection.incrBy(bkey,increValue);connection.close();returnnull;}});}}
解决方案三:
修改了一下,虽然功能是实现了,但是原子性没有了,并发时候会有问题,希望大神解决呀~publicvoidincr(finalKredisKey,finallongincreValue){if(redisKey!=null){redisTemplate.execute(newRedisCallback<V>(){publicVdoInRedis(RedisConnectionconnection)throwsDataAccessException{byte[]bkey=ObjectTranscoder.serialize(redisKey);Objectobj=ObjectTranscoder.deserialize(connection.get(bkey));if(obj==null){connection.close();returnnull;}longvalue=Long.valueOf(obj.toString())+increValue;longexpitedTime=connection.ttl(bkey);connection.setEx(bkey,expitedTime,ObjectTranscoder.serialize(value));connection.close();returnnull;}});}}谢谢。
解决方案四:
JedisConnectioncon=this.jedisConnectionFactory.getConnection();con.incr("a:a".getBytes());

这样试试看

时间: 2024-10-01 22:07:42

Spring-data-redis问题的相关文章

Spring Data Redis 让 NoSQL 快如闪电(2)

[编者按]本文作者为 Xinyu Liu,文章的第一部分重点概述了 Redis 方方面面的特性.在第二部分,将介绍详细的用例.文章系国内 ITOM 管理平台 OneAPM 编译呈现. 把 Redis 当作数据库的用例 现在我们来看看在服务器端 Java 企业版系统中把 Redis 当作数据库的各种用法吧.无论用例的简繁,Redis 都能帮助用户优化性能.处理能力和延迟,让常规 Java 企业版技术栈望而却步. 1. 全局唯一增量计数器 我们先从一个相对简单的用例开始吧:一个增量计数器,可显示某网

Spring Data Redis—Pub/Sub(附Web项目源码)

一.发布和订阅机制 当一个客户端通过 PUBLISH 命令向订阅者发送信息的时候,我们称这个客户端为发布者(publisher). 而当一个客户端使用 SUBSCRIBE 或者 PSUBSCRIBE 命令接收信息的时候,我们称这个客户端为订阅者(subscriber). 为了解耦发布者(publisher)和订阅者(subscriber)之间的关系,Redis 使用了 channel (频道)作为两者的中介 -- 发布者将信息直接发布给 channel ,而 channel 负责将信息发送给适当

Spring Data Redis—Pub/Sub(附Web项目源码) (转)

一.发布和订阅机制 当一个客户端通过 PUBLISH 命令向订阅者发送信息的时候,我们称这个客户端为发布者(publisher). 而当一个客户端使用 SUBSCRIBE 或者 PSUBSCRIBE 命令接收信息的时候,我们称这个客户端为订阅者(subscriber). 为了解耦发布者(publisher)和订阅者(subscriber)之间的关系,Redis 使用了 channel (频道)作为两者的中介 -- 发布者将信息直接发布给 channel ,而 channel 负责将信息发送给适当

数据-spring data redis RedisTemplate 操作

问题描述 spring data redis RedisTemplate 操作 工程结构:springmvc + mybatis: 现在集成redis做基础数据的缓存,如何实现通过PO类的属性查找一个List(类似Java), 如果没有直接的实现办法,请大家给一个思路: 谢谢!

Spring Data Redis 让 NoSQL 快如闪电 (1)

[编者按]本文作者为 Xinyu Liu,详细介绍了 Redis 的特性,并辅之以丰富的用例.在本文的第一部分,将重点概述 Redis 的方方面面.文章系国内 ITOM 管理平台 OneAPM 编译呈现. 建立在 Java 企业版之上的多层体系结构是强大的服务器端编程解决方案.作为一名从业多年的 Java 企业版开发人员,我最满意的就是三层企业开发法:最下方是 JPA/Hibernate 持久层,中间是 Spring 或 EJB 应用层,最上方则是 web 层.对于较为复杂的用例,我用 BPM(

【Spring】Redis的两个典型应用场景--good

  原创 BOOT Redis简介 Redis是目前业界使用最广泛的内存数据存储.相比memcached,Redis支持更丰富的数据结构,例如hashes, lists, sets等,同时支持数据持久化.除此之外,Redis还提供一些类数据库的特性,比如事务,HA,主从库.可以说Redis兼具了缓存系统和数据库的一些特性,因此有着丰富的应用场景.本文介绍Redis在Spring Boot中两个典型的应用场景. 场景1:数据缓存 第一个应用场景是数据缓存,最典型的当属缓存数据库查询结果.对于高频读

第 8 章 Spring Data

8.1. Spring Data Redis 8.1.1. pom.xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-redis</artifactId> </dependency> 8.1.2. springframework-servlet.xml <!-- Redis Connection

第 5 章 Spring Data

5.1. Spring Data Redis 5.1.1. pom.xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-redis</artifactId> </dependency> 5.1.2. springframework-servlet.xml <!-- Redis Connection

《Spring Data实战》——导读

前言 数据访问领域在过去的7年间发生了重要的变化.过去30年间一直占据企业级数据存储和处理核心位置的关系型数据库已经不能再独领风骚了.在过去的7年间诞生了很多可选的数据存储形式,当然也有的面临着消亡,它们被使用到了带有关键任务的企业级应用程序之中.这些新的数据存储形式是为了解决特定的数据访问问题而设计的,使用关系型数据库通常无法高效地解决这些问题. 将关系型数据库推到拐点的一个问题就是扩展性(scale).试问,我们如何将几百甚至几千TB(terabyte)的数据存储到关系型数据库中?这个问题让

spring结合redis如何实现数据的缓存_java

1.实现目标 通过redis缓存数据.(目的不是加快查询的速度,而是减少数据库的负担) 2.所需jar包 注意:jdies和commons-pool两个jar的版本是有对应关系的,注意引入jar包是要配对使用,否则将会报错.因为commons-pooljar的目录根据版本的变化,目录结构会变.前面的版本是org.apache.pool,而后面的版本是org.apache.pool2... style="background-color: #0098dd; color: white; font-s