浏览数业务

使用了redis

spring中的RedisTemplate

增加浏览数量//简单的获取浏览数量,然后加一

Long previewNumber = getPreviewNumber(sourceId, previewType);

String key = getKey(previewType, sourceId);

previewNumber = previewNumber < 0 ? 0L : previewNumber + 1;

redisTemplate.opsForHash().put(PRIVIEW_KEY, key, previewNumber);

获取浏览数 //获取缓存数量,不存在,设置为-1

private Long getCacheNumber( Map map, PreviewType previewType,Object sourceId){

String key = getKey(previewType, sourceId.toString());

Long number = map.get(key);

return null == number ? -1 :number;

}

//获取如果cacheNumber小于0

Long cacheNumber = getCacheNumber(map,previewType, sourceId);

if (cacheNumber < 0) {

cacheNumber = 0L;

Preview preview = previewDao.getPreview(previewType.getCode(), sourceId);

if (null != preview) {

number = preview.getNumber();

//缓存不存在,数据库存在, 添加缓存

hashOperations.put(PRIVIEW_KEY, getKey(previewType, sourceId), number);

} else {

//没有浏览记录,增加缓存为 0的记录

hashOperations.put(PRIVIEW_KEY, getKey(previewType, sourceId), number);

}

}

return cacheNumber;

这什么烂代码!是的,改下,起码用redis 的 increment 来做增加数量

开始给自己挖坑

做了简单的修改

Long number = redisTemplate.opsForHash().increment(THUMB_UP_KEY, getKey(previewType, sourceId), 1);

error

Caused by: redis.clients.jedis.exceptions.JedisDataException: ERR hash value is not an integer 调用个简单的方法也报错?

debug

jedis直接调用了redis的hincrby命令,没什么可说的。

然后直接调用getIntegerReply获取redis服务器返回的信息

直接是minus_byte类型

抛出了异常,发生了什么?

找到了如下资料

应该是和序列化有关系的。 使用redis 会配置对应的key和value序列化方式。

例如:

RedisTemplate temp = new RedisTemplate();

temp.setKeySerializer(new StringRedisSerializer());

temp.setValueSerializer(new StringRedisSerializer());

但是不应该啊,存储到redis使用什么序列化方式,获取时肯定是用对应方式反序列化嘛, 问题应该不是出在这里。

代码注意到这里

spring直接调用了connection,并没有对delta进行序列化操作,接着点进去看到,

jedis提供的connection直接转换成String,然后使用String的getBytes();方法

然后看了下对应key再redis的数据

搞了个新key

原因很明显了

increment 会直接对值进行做增加操作,不会使用对应的redistemplate中设置的序列化方式

原来redis中的旧数据是通过redisTemplate.opsForHash().put进去的,会先通过设置的序列化方式进行序列化,

后面对key进行increment redis没办法对应value转成long进行操作,所以返回了ERR hash value is not an integer异常信息。

删除旧数据就可以了吧。

清空redis数据后 //这里出现了异常

hashOperations.entries(PRIVIEW_KEY)

org.springframework.data.redis.serializer.SerializationException: fst-deserialization-error; nested exception is java.io.IOException: java.lang.NullPointerException

原因和上面大同小异,这里获取的时候依然会进行序列化操作,而且increment设置的值是没有进行对应序列化的。这里是FST 进行反序列化时异常。

总结

increment使用要避免和其他需要经过序列化的操作混用。

对用到的东西要有全面的了解,才能避免各种坑。

为什么会这么累,就是喜欢给自己挖坑。

本文来自网易实践者社区,经作者张昌路授权发布。

java hincrby_挖坑记录-redistemplate hincrby相关推荐

  1. Java设计模式学习记录-解释器模式

    前言 这次介绍另一个行为模式,解释器模式,都说解释器模式用的少,其实只是我们在日常的开发中用的少,但是一些开源框架中还是能见到它的影子,例如:spring的spEL表达式在解析时就用到了解释器模式,以 ...

  2. 一起初学java,笔记记录的第五天:数组、排序和查找

    一起初学java,笔记记录的第五天:数组.排序和查找 适用于初学java者 这个首先指出本文中图片和资源来自**韩顺平**老师,感谢老师做的无私奉献的教学! 1. 数组介绍 数组可以存放多个同一类型的 ...

  3. 已知挖坑记录(不知道什么时候才填)

    挖坑记录 前言 一.区块链安全 1.基于区块回滚的攻击 2. 二.架构设计 1.数据中台方面 2.大数据应用方面 3.云边融合方面 三.自己瞎捣鼓的Relax框架相关 1.消灭Service层 2.消 ...

  4. Redis的Java客户端——SpringDataRedis、RedisTemplate、StringRedisTemplate

    目录 一.初步了解SpringDataRedis 1.1 特点: 二.快速入门SpringDataRedis 2.1  引入依赖 2.2 配置文件 2.3 注入RedisTemplate 2.4 编写 ...

  5. NWJS 调用java问题处理记录

    NWJS 调用java问题处理记录 有关NWJS调用JAVA安装与发布运行时的问题: 1:确认nwjs使用的版本(x86或x86-64)与本机使用的node版本一致. 2:提示Error: Canno ...

  6. 2019个人Java实习生面试记录

    2019个人Java实习生面试记录 第一次: 1.sql排序语句 2.对框架的理解 3.说一下对Spring的理解 4.说一下对mvc的理解 第二次 5.&与&&的区别 6.S ...

  7. java hincrby_使用Redis构建文章投票网站(Java)

    文章投票网站的redis相关Java实现 需求: 1.要构建一个文章投票网站,文章需要在一天内至少获得200张票,才能优先显示在当天文章列表前列. 2.但是为了避免发布时间较久的文章由于累计的票数较多 ...

  8. java通用日志记录_JAVA实现通用日志记录方法

    前言: 之前想在filter层直接过滤httpServerletRequest请求进行日志处理,但是之后再getWriter()的 时候报already been call异常.查了下,才发现原来流形 ...

  9. Java中的记录类型

    2020年3月发布的JDK 14引入了记录 (预览语言功能),这些记录提供了一种紧凑的语法来声明主要用于保存数据的类. 在记录中 ,所有低级,重复且容易出错的代码都类似于构造函数,访问器和通用方法,例 ...

最新文章

  1. php网页添加图片的代码,天天查询-PHP版的kindeditor编辑器加图片上传水印功能
  2. Zabbix如何实现Server和Agent的通信加密
  3. keep健身软件电脑版_一款不错的健身软件keep会员实现教程
  4. C#3.0扩展方法[转]
  5. 【C语言】实参求值的顺序
  6. BZOJ2460: [BeiJing2011]元素(线性基+贪心)
  7. Windows 7 下 PHP 开发环境搭建(手动)
  8. [原创]数据库视图介绍和使用
  9. linux卸载qt5.6.2,请问该怎么把linux的Qt升级为5.6?
  10. 2016年农民工监测调查报告(zz)
  11. 关于T—SQL与SQL企业管理器
  12. 虚幻引擎与现代C++:转移语义和右值引用
  13. 学了 C 语言到底能做什么, 能从事什么工作?(附课程)
  14. linux基础操作--参考狂神说
  15. iOS音视频播放-AVPlayer简单使用
  16. xp远程登录linux,Linux操作系统下如何远程登录XP桌面
  17. C# DataView常见操作
  18. 无法安装64位版本的office解决方案
  19. 送一台高清显示器(控制人数,限时删)
  20. Esri总裁用96页PPT告诉你GIS的未来将如何发展,而我们又该为此如何准备

热门文章

  1. Linux创建新用户和key登陆
  2. 手机可以玩python吗_在手机上玩python编程-Pydroid3
  3. 中山大学计算机研究生专业课考什么,2021中山大学考研专业的考试科目有变吗_21中大考研哪些初试笔试科目变了-聚创考研网...
  4. 计算机组成原理——万字详解
  5. 如何修复带有问号错误的 Mac 文件夹
  6. python找人_Python爬虫实现全国失信被执行人名单查询功能示例
  7. [免费下载应用]iNeuKernel.Ocr 图像数据识别与采集原理和产品化应用
  8. TI ARM 性能天梯图
  9. html+form+提交json数据,form表单提交json格式数据
  10. 在线sqli-labs 通关大全 Less-1