仿redis的zset类型

2024-04-25 23:12
文章标签 类型 redis zset

本文主要是介绍仿redis的zset类型,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言
模仿redis的zset数据类型,写了Java内存版,写这个的背景是做自己的小项目,服务器资源有限,不想引入redis,但同时又想使用zset的排序功能,所以就自己写了一个简化版本。

package com.fjding.exam.utils;import lombok.ToString;import java.util.*;
import java.util.stream.Collectors;/*** 实现类似redis zset的功能** @author fjding* @date 2024/4/8*/
public class Zset<T> {public TreeSet<Entity> treeSet = new TreeSet<>();private Set<T> keySet = new HashSet<>();public static void main(String[] args) {Zset<Integer> zset = new Zset<>();zset.add(1);zset.add(4);zset.add(7);zset.add(6);zset.add(3);zset.add(3);System.out.println(zset.treeSet);}public void add(T key) {add(key, 1);}public void add(T key, Integer score) {if (keySet.contains(key)) {Entity entity = treeSet.stream().filter(e -> e.key.equals(key)).findFirst().get();// 解决当已添加元素后,再修改score时,无法重新排序问题treeSet.remove(entity);keySet.remove(key);entity.score += score;// 分数必须>0if (entity.score > 0) {treeSet.add(entity);keySet.add(key);}} else {keySet.add(key);treeSet.add(new Entity(key, score));}}public void remove(T key) {if (keySet.contains(key)) {keySet.remove(key);treeSet.removeIf(e -> e.key.equals(key));}}public void removeFirst() {Entity entity = treeSet.first();keySet.remove(entity.key);treeSet.remove(entity);}public void removeLast() {Entity entity = treeSet.last();keySet.remove(entity.key);treeSet.remove(entity);}public T getFirst() {return treeSet.first().key;}public T getLast() {return treeSet.last().key;}public List<T> range() {return range(1, 10);}public List<T> range(int page) {return range(page, 10);}/*** @param page 默认1* @param size 默认10*/public List<T> range(int page, int size) {if (page <= 0) {page = 1;}if (size <= 0) {size = 10;}int start = (page - 1) * size;int end = page * size;if (start >= treeSet.size()) {return Collections.emptyList();}if (end > treeSet.size()) {end = treeSet.size();}List<Entity> list = treeSet.stream().collect(Collectors.toList());List<Entity> subList = list.subList(start, end);return subList.stream().map(e -> e.key).collect(Collectors.toList());}public int size() {return keySet.size();}@ToStringpublic class Entity implements Comparable<Entity> {public T key;public Integer score;public Entity(T key, Integer score) {this.key = key;this.score = score;}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Entity entity = (Entity) o;return key != null ? key.equals(entity.key) : entity.key == null;}@Overridepublic int hashCode() {return key != null ? key.hashCode() : 0;}@Overridepublic int compareTo(Entity o) {int scoreComparison = o.score.compareTo(score);//return scoreComparison;if (scoreComparison != 0) {return scoreComparison;} else {return o.key.toString().compareTo(key.toString());}}}
}

这篇关于仿redis的zset类型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/936055

相关文章

Redis客户端工具之RedisInsight的下载方式

《Redis客户端工具之RedisInsight的下载方式》RedisInsight是Redis官方提供的图形化客户端工具,下载步骤包括访问Redis官网、选择RedisInsight、下载链接、注册... 目录Redis客户端工具RedisInsight的下载一、点击进入Redis官网二、点击RedisI

Redis实现RBAC权限管理

《Redis实现RBAC权限管理》本文主要介绍了Redis实现RBAC权限管理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1. 什么是 RBAC?2. 为什么使用 Redis 实现 RBAC?3. 设计 RBAC 数据结构

Redis 内存淘汰策略深度解析(最新推荐)

《Redis内存淘汰策略深度解析(最新推荐)》本文详细探讨了Redis的内存淘汰策略、实现原理、适用场景及最佳实践,介绍了八种内存淘汰策略,包括noeviction、LRU、LFU、TTL、Rand... 目录一、 内存淘汰策略概述二、内存淘汰策略详解2.1 ​noeviction(不淘汰)​2.2 ​LR

Rust中的BoxT之堆上的数据与递归类型详解

《Rust中的BoxT之堆上的数据与递归类型详解》本文介绍了Rust中的BoxT类型,包括其在堆与栈之间的内存分配,性能优势,以及如何利用BoxT来实现递归类型和处理大小未知类型,通过BoxT,Rus... 目录1. Box<T> 的基础知识1.1 堆与栈的分工1.2 性能优势2.1 递归类型的问题2.2

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相

redis群集简单部署过程

《redis群集简单部署过程》文章介绍了Redis,一个高性能的键值存储系统,其支持多种数据结构和命令,它还讨论了Redis的服务器端架构、数据存储和获取、协议和命令、高可用性方案、缓存机制以及监控和... 目录Redis介绍1. 基本概念2. 服务器端3. 存储和获取数据4. 协议和命令5. 高可用性6.

Go语言中三种容器类型的数据结构详解

《Go语言中三种容器类型的数据结构详解》在Go语言中,有三种主要的容器类型用于存储和操作集合数据:本文主要介绍三者的使用与区别,感兴趣的小伙伴可以跟随小编一起学习一下... 目录基本概念1. 数组(Array)2. 切片(Slice)3. 映射(Map)对比总结注意事项基本概念在 Go 语言中,有三种主要

Redis的数据过期策略和数据淘汰策略

《Redis的数据过期策略和数据淘汰策略》本文主要介绍了Redis的数据过期策略和数据淘汰策略,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录一、数据过期策略1、惰性删除2、定期删除二、数据淘汰策略1、数据淘汰策略概念2、8种数据淘汰策略

Redis存储的列表分页和检索的实现方法

《Redis存储的列表分页和检索的实现方法》在Redis中,列表(List)是一种有序的数据结构,通常用于存储一系列元素,由于列表是有序的,可以通过索引来访问元素,因此可以很方便地实现分页和检索功能,... 目录一、Redis 列表的基本操作二、分页实现三、检索实现3.1 方法 1:客户端过滤3.2 方法

Python中操作Redis的常用方法小结

《Python中操作Redis的常用方法小结》这篇文章主要为大家详细介绍了Python中操作Redis的常用方法,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解一下... 目录安装Redis开启、关闭Redisredis数据结构redis-cli操作安装redis-py数据库连接和释放增