1 需求

要往redis存取List< Object>。

2 条件

1)Object:是一个UserEvent对象,对应3个字段:

Integer productId;
String eventCode;
Long timestamp;

2)要求
每个key里存取对象个数不超过xx个。
超过xx个,则剔除早期加入的对象数据。
备注:存之前的每个userEvent对象都是不一样的。

3)使用zset实现。

3 zset使用原理

1)zset是有一个score参数,这个分数是zset存储结构的顺序依据。可以按分数从小到大查询,也可以逆序查询。

2)因为当前场景,UserEvent对象的timestamp参数是一个时间戳,是对象产生的时间,可以用来做剔除早期数据的规则使用。使用这个参数作为zest的分数。

4 代码实现——存

1)思路
把对象的三个字段进行拼接,作为一个String类型的value。示例:productId,eventCode,timestamp

108634,1,1623136194

使用时间戳作为分数,主要分数是double类型。long型时间戳可以进行转换成double。
ps:2038年前时间戳都是可以使用的。:p

/*** 测试redis的zset*/@Testpublic void testRedisZset() {JedisPool jedisPool = new JedisPool("127.0.0.1", 6379);Jedis jedis = jedisPool.getResource();Map<String, Double> map = Maps.newHashMap();Map<String, Double> map2 = Maps.newHashMap();Map<String, Double> newMap = Maps.newHashMap();map.put("121624,1,1623136190", 1623136190.0);map.put("105916,2,1623136191", 1623136191.0);map2.put("107770,1,1623136192", 1623136192.0);map2.put("105916,2,1623136193", 1623136193.0);map2.put("105917,2,1623136193", 1623136193.0);jedis.zadd("user12", map);jedis.zadd("user12", map2);//查询添加后的总个数 5个int oldCount = jedis.zcard("user12").intValue();newMap.put("108634,1,1623136194", 1623136194.0);newMap.put("108634,3,1623136195", 1623136195.0);newMap.put("108635,3,1623136195", 1623138109.0);newMap.put("108638,3,1623136195", 1623138120.0);//需要新加入 4个int newCount = 4;//要求value容量是6个int size = 6;int diff = oldCount + newCount - size;if (diff > 0) {//移除得分最小的前3个 第0-2个jedis.zremrangeByRank("user12", 0, diff - 1);//再追加新的jedis.zadd("user12", newMap);} else {//还没有加满,直接追加jedis.zadd("user12", newMap);}//查询value  zrange得分从小到大排序 取size个Set<String> user12 = jedis.zrange("user12", 0, size);}

5 代码实现——取

1)另外一个项目需要取这些数据。
取出来之后stringToUserEvent方法进行切割还原成List< UserEvent>

@Testpublic void redisGetZSet() {//取3个int size=3;List<UserEvent> userEvents = Lists.newArrayListWithExpectedSize(size);//reverseRange按从大往小取size个,也就是取最新的Set<String> range = stringRedisTemplate.opsForZSet().getOperations().boundZSetOps("user12").reverseRange(0, size);if (range != null && range.size() > 0) {userEvents = range.stream().map(a -> stringToUserEvent(a)).filter(userEvent -> userEvent != null).collect(Collectors.toList());}System.out.println(userEvents);}

6 小乌龙

阿里云数据库查看key的数据,发现左侧的序号不对应得分排序。奇怪?没排序好吗?

原来左侧的序号不是排序号。

毕竟zset的查询,是通过分数score来排序来查询结果的,不要以为左侧的序号是排序号!

不过云数据库结果呈现的顺序是什么依据呢?只是方便看总的个数吧!

redis的zset使用(java)——存取List< Object>相关推荐

  1. java和redis统计在线,在SpringBoot中使用Redis的zset统计在线用户信息

    统计在线用户的数量,是应用很常见的需求了.如果需要精准的统计到用户是在线,离线状态,我想只有客户端和服务器通过保持一个TCP长连接来实现.如果应用本身并非一个IM应用的话,这种方式成本极高. 现在的应 ...

  2. 使用redis的zset实现排行榜

    1.使用场景 现在公司有个项目,类似于今日头条,需要实现对应分类阅读排行榜的功能. 每一篇文章所属于一个分类,当用户阅读该文章时,阅读次数+1,排行榜实时变化. 2.redis的ZSet数据结构 zs ...

  3. zset中的score_读懂才会用 : 带你见识 Redis 的 zset

    快餐车 本文从代码角度分析Redis 的 zset 结构,希望通过本文掌握如下内容: Redis 中 zset 不是单一结构完成,是跳表和哈希表共同完成 跳表的实现原理,跳表升维全靠随机 跳表中查找. ...

  4. 读懂才会用 : 带你见识 Redis 的 zset

    快餐车 本文从代码角度分析Redis 的 zset 结构,希望通过本文掌握如下内容: Redis 中 zset 不是单一结构完成,是跳表和哈希表共同完成 跳表的实现原理,跳表升维全靠随机 跳表中查找. ...

  5. Redis的zset有多牛?请把耳朵递过来

    来自公众号:小姐姐味道 作者简介:一个不允许程序员走弯路的公众号.聚焦基础架构和Linux.十年架构,日百亿流量,与你探讨高并发世界,给你不一样的味道. 本篇文章很短,但信息量很大,是关于redis的 ...

  6. 自学Redis技术,如何在Java应用

    自学Redis技术,如何在Java应用 ~~自学之路之艰辛,现在的世界离不开百度 但是百度要么找到大牛篇,要么就是复制粘贴篇. (小白的无奈)以此篇开始,无论是否找到工作,开启了漫漫自学之路 一个程序 ...

  7. 记录一次使用Redis中ZSet和List分页

    使用Redis的ZSet和List进行分页,两者都可以实现,共同特性相当于截取集合中的一部分,ZSet拥有去重特性,List可能会出现数据重复情况,推荐使用ZSet. 另外说明:使用其他类型就不可以, ...

  8. Redis中ZSet的底层数据结构跳跃表skiplist,你真的了解吗?

    欢迎大家关注我的微信公众号[老周聊架构],Java后端主流技术栈的原理.源码分析.架构以及各种互联网高并发.高性能.高可用的解决方案. 一.前言 老周写这篇文章的初衷是这样的,之前项目中有大量使用 R ...

  9. java redis集群操作,java操作redis3.0集群

    java(JedisCluster)操作redis集群 这里只是几个简单的demo,直接上代码吧,没啥好说的 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ...

最新文章

  1. C++入门教程,全套C++基础教程(已更新完毕)
  2. 渣渣小本求职复习之路每天一博客系列——TCP/IP协议栈(5)
  3. Graph Embedding方案之DeepWalk
  4. jQuery慢慢啃之事件对象(十一)
  5. Leetcode--1019. 链表中的下一个更大节点(java)
  6. 程序员职业自由6个阶段,你处于哪个?
  7. java 绘制sin函数图像_第11讲 数学软件Mathematica内置函数的使用规则
  8. 【已解决】java.lang.IllegalStateException: Only fullscreen opaque activities can request orientation
  9. 适合新手的python练习(9)
  10. 零基础Linux搭建虚拟专用网络(实现游戏局域网联机)
  11. 查找攻击者ip的方法
  12. 固态硬盘SSD使用随笔
  13. HAUTOJ 1100~1200题题解
  14. 查看检测排名各网站的网站
  15. PTV Vissim学习
  16. Linux查看进程运行的完整路径方法
  17. Error 1718. File was rejected by digital signature policy错误,文件的数字签名被你的本地软件策略给拒绝了,来看看解决方法
  18. 虚漠鸿蒙什么意思,好!妙哉妙哉!张济所作之诗不仅符合题意,更是言出了万物伊始乃...
  19. python b站 排行_Python爬虫抓取B站小视频排行榜,新手也可以跟着做哦!
  20. 如何快速将无损音频WMA格式转换为MP3

热门文章

  1. 基本shell编程【3】- 常用的工具awk\sed\sort\uniq\od
  2. android camera滑动,Android怎么实现小米相机底部滑动指示器
  3. 报错 插入更新_window如何解决mysql数据量过大导致的报错
  4. redis单节点安装
  5. android5.1 sdk version,java - Android SDK version 23.6 - Stack Overflow
  6. python实现自动打电话软件_全自动手势联系软件 让你轻轻松松打电话
  7. c# 模拟登陆 webbrowser 抓取_《VR+电力——更换绝缘子培训》已登陆Pico Neo 2
  8. 安阳师范学院计算机与信息工程学院吴琴霞,基于甲骨文字形动态描述库的甲骨文输入方法...
  9. jtessboxeditorfx 界面显示不出来_macOS 使用 XQuartz 支持 X11 实现 Linux 图形化界面显示...
  10. git切换用户密码_Git 最基本的命令