Redis 数据结构(二)—集合和有序集合

 集合(Set)允许用户将多个各不相同的元素(文本或二进制数据)存储到集合中,以无序的方式存储元素。

有序集合(Sorted Set)同时具有“有序”和“集合”两种性质。每个元素由一个成员和分值组成。成员以字符串方式存储,而分值以64位双精度浮点数格式存储。

1 集合 Set

添加和移除

SADD、SREM

集合

移动一个元素到另一个集合:SMOVE

返回集合包含的所有元素:SMEMBERS

返回集合包含的元素数量:SCARD

检查元素是否存在于集合:SISMEMBER

随机获取集合中的元素:SRANDMEMBER

随机从集合中移除指定数量的元素:SPOP

集合运算

交集:SINTER、SINTERSTORE

并集:SUNION、SUNIONSTORE

差集:SDIFF、SDIFFSTORE

表 集合数据结构相关命令

1.1 示例

打标签:购物网站为商品添加标签,方便顾客了解商品的不同特性及筛选商品。

public class GoodsTags {private final static Jedis jedis = RedisPool.getJEdis();private final static String GOODS_TAGS_KEY = "goods_tags_set::%s";public static void addTags(String goodsId,String ... tags) {jedis.sadd(String.format(GOODS_TAGS_KEY,goodsId),tags);}public static boolean hasTag(String goodsId,String tag) {return jedis.sismember(String.format(GOODS_TAGS_KEY,goodsId),tag);}public static void removeTag(String goodsId,String tag) {jedis.srem(String.format(GOODS_TAGS_KEY,goodsId),tag);}public static void showTags(String goodsId) {System.out.println(jedis.smembers(String.format(GOODS_TAGS_KEY,goodsId)));}public static void main(String[] args) {addTags("1","苹果","电脑","M2","办公","程序员");showTags("1");System.out.println("has 办公:" + hasTag("1","办公"));removeTag("1","办公");System.out.println("has 办公:" + hasTag("1","办公"));}
}

共同关注与推荐关注:在抖音上,访问某个用户的个人主页时,页面会展示出我们和这个用户都在关注的人。

除此之外,还会为用户推荐他可能感兴趣的关注对象。简单的实现算法是:从用户正在关注集合中随机选出指定数量的用户作为种子用户,然后对这些种子用户的正在关注集合执行并集计算,最后从这个并集中随机选出一些用户作为推荐关注对象。

public class CommonAndRecommendUser {private final static Jedis jedis = RedisPool.getJEdis();private final static String FOLLOWING_KEY = "user_following_set:%s";private final static String TEMP_USER_RECOMMEND_KEY = "temp_user_recommend_set";public static void addFollowing(String user,String ... targetUsers) {String key = String.format(FOLLOWING_KEY, user);jedis.spop(key,999);jedis.sadd(key,targetUsers);}public static void showFollowing(String user) {System.out.println(jedis.smembers(String.format(FOLLOWING_KEY,user)));}public static void showCommon(String user,String target) {System.out.println(jedis.sinter(String.format(FOLLOWING_KEY,user),String.format(FOLLOWING_KEY,target)));}public static void showRecommend(String user) {List<String> members = jedis.srandmember(String.format(FOLLOWING_KEY, user), 5);Set<String> keys = new HashSet<>();if (members != null && !members.isEmpty()) {for (String it : members) keys.add(String.format(FOLLOWING_KEY,it));jedis.sunionstore(TEMP_USER_RECOMMEND_KEY,keys.toArray(new String[1]));jedis.sdiffstore(TEMP_USER_RECOMMEND_KEY,TEMP_USER_RECOMMEND_KEY,String.format(FOLLOWING_KEY, user));jedis.srem(TEMP_USER_RECOMMEND_KEY,user);System.out.println(jedis.srandmember(TEMP_USER_RECOMMEND_KEY,5));}}public static void main(String[] args) {addFollowing("黄先生","刘女士","小陈","小吴","小李","小张");addFollowing("刘女士","黄先生","小陈","小吴");addFollowing("小李","黄先生","小吴","小张","小孔");addFollowing("小张","老李","老吴","黄先生");showFollowing("黄先生");showFollowing("刘女士");showCommon("黄先生","刘女士");showCommon("小李","小张");showRecommend("黄先生");showRecommend("刘女士");}
}

2 有序集合Sorted Set

有序集合具有以下特点:

  1. 有序性:按照分数的大小进行排序。
  2. 唯一性:不会出现重复的元素。
  3. 快速查找:可以快速查找某个元素的位置、分数以及排名等信息。
  4. 范围操作:根据分数的范围来获取一段区间内的元素。
  5. 更新分数:可以对集合中的元素进行分数增减操作。

添加和移除

ZADD、ZREM

弹出分值最高、最低的成员:ZPOPMAX、ZPOPMIN

分值

获取成员的分值:ZSCORE

对成员的分值执行整数运算:ZINCRBY

集合

集合的大小:ZCARD

成员在集合中的排名:ZRANK、ZREVRANK

指定索引范围内的成员:ZRANGE、ZREVRANGE

指定分数范围内的成员:ZRANGEBYSCORE、ZREVRANGEBYSCORE(指定范围时,更大的分数在前面)

统计指定分值范围内的成员数量:ZCOUNT

移除指定排名范围内的成员:ZREMRANGEBYRANK

移除指定分值范围内的成员:ZREMRANGEBYSCORE

集合运算

并集:ZUNIONSTORE

交集:ZINTERSTORE

字典

指定字典序列范围内的成员:ZRANGEBYLEX、ZREVRANGEBYLEX

统计字典序列指定范围内的成员数量:ZLENCOUNT

移除位于字典序列指定范围内的成员:ZREMRANGEBYLEX

阻塞

BZPOPMAX、BZPOPMIN

表 有序集合相关命令

2.1 示例

自动补全:在搜索框输入某些文字的时候,系统的自动补全特性就会列出一些比较著名的以这些文字开头的选项。

public class AutoComplete {private final static Jedis jedis = RedisPool.getJEdis();private final static String COMPLETE_KEY = "auto_complete_sorted_set::%s";public static void feed(String str) {if (str != null) {for (int i = 1; i < str.length() + 1; i++) {String key = String.format(COMPLETE_KEY,str.substring(0,i));System.out.println("key:" + key);jedis.zincrby(key,1,str);}}}public static void hint(String str) {if (str != null) {String key = String.format(COMPLETE_KEY,str);Set<String> set = jedis.zrange(key, 0, -1);System.out.println(set);}}public static void main(String[] args) {feed("黄子韬");feed("黄晓明");feed("黄渤");feed("黄金海岸");feed("黄嘉千");feed("黄金价格");feed("黄历");feed("黄石公园");feed("黄家驹");feed("黄雷");hint("黄");hint("黄金");}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/889076.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【HarmonyOS学习日志(13)】计算机网络之TCP/IP协议族(二)

文章目录 TCP/IP协议族ARPDNS标志字段&#xff1a;协商具体的通信方式和反馈通信状态DNS查询问题的格式资源记录&#xff08;Resource Record, RR&#xff09;格式&#xff1a;被用于应答字段、授权字段和额外信息字段 IP协议IP服务的特点无状态无连接不可靠 IP头部结构IPv4头部…

Python + Playwright:集成 Applitools 进行视觉回归测试(快速入门)

集成 Applitools 进行视觉回归测试(快速入门) 简介Applitools 的核心特点Applitools 的应用场景1. 准备工作2. 获取示例项目2.1 下载示例代码2.2 安装依赖2.3 选择测试运行方式3. 代码解析3.1 测试用例示例4. 运行测试4.1 设置 Applitools API 变量4.2 设置 Applitools Eyes …

javaScript交互补充

1、元素的三大系列 1.1、offset系列 1.1.1、offset初相识 使用offset系列相关属性可以动态的得到该元素的位置&#xff08;偏移&#xff09;、大小等 ●获得元素距离带有定位祖先元素的位置 ●获得元素自身的大小&#xff08;宽度高度&#xff09; ●注意&#xff1a;返回的…

【Linux】-学习笔记09

第六章、nfs网络文件系统 1.nfs网络文件系统简介 NFS(Network File system&#xff0c;网络文件系统)是由SUN公司研制的UNIX表示层协议&#xff0c;它允许网络中的计算机(不同的计算机、不同的操作系统)之间通过TCP/IP网络共享资源&#xff0c;主要在unix系列操作系统上使用。…

【C++】LeetCode:LCR 078. 合并 K 个升序链表

题干&#xff1a; 给定一个链表数组&#xff0c;每个链表都已经按升序排列。 请将所有链表合并到一个升序链表中&#xff0c;返回合并后的链表。 解法&#xff1a;优先队列 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *ne…

xvisor调试记录

Xvisor是一种开源hypervisor,旨在提供完整、轻量、移植且灵活的虚拟化解决方案,属于type-1类型的虚拟机,可以直接在裸机上启动。 启动xvisor步骤: 1、搭建riscv编译环境 首先从github上下载riscv-gnu-toolchain很费劲,建议直接从国内的源下载 git clone https://gitee…

minGW安装教程

一、下载 1.通过官网WinGW官网下载 http://www.mingw-w64.org 2.通过SourceForge网站下载MinGW https://sourceforge.net/projects/mingw/files/latest/download 二、安装 右键mingw-get-setup.exe&#xff0c;以管理员身份运行 点击Install安装 点击“Change”修改安装地…

BFS入门

目录 定义二叉树层次遍历电梯问题倒可乐BFS基本思想算法 四方访问 定义 BFS 通常是指广度优先搜索&#xff08;Breadth - First Search&#xff09;&#xff0c;它是一种图形数据结构的遍历算法。从给定的起始顶点开始&#xff0c;首先访问起始顶点的所有邻接顶点&#xff0c;然…

【数据库】Oracle

文章目录 1. 批量更新 1. 批量更新 这种方式将所有更新操作放在一个事务中执行&#xff0c;减少了与数据库的交互次数&#xff0c;从而可能提高性能。此外&#xff0c;事务处理还可以确保数据的一致性和完整性。begin; update mytable set STATE 102,STATE_DATE now() …

SQL Server数据库中设置索引的策略

在 SQL Server 中&#xff0c;索引通过加快数据检索速度在优化查询性能方面发挥着关键作用。在数据库中设置索引的策略受数据库结构、表的大小和将要运行的查询类型的影响。索引策略通常涉及考虑维度表、事实数据表、大型表和小型表之间的差异。以下是如何将索引应用于这些不同…

如何将CSDN的文章保存为PDF?

目录 1、打开CSDN文章2、按F12或者鼠标右键选择检查并进入控制台3、在控制台输入以下代码4、然后回车&#xff08;Enter&#xff09;如果纵向显示不全就横向 1、打开CSDN文章 2、按F12或者鼠标右键选择检查并进入控制台 3、在控制台输入以下代码 (function(){ $("#side&q…

25考研软件工程 西南大学跟重庆大学哪个难?

需知晓&#xff0c;西南大学每年报考人数众多&#xff0c;可这不代表报考软件工程专业的人数就多呀&#xff0c;况且西南大学的优势学科并非工科&#xff0c;故而软件工程的报考热度不会如题主所言那般高呢。 其次得明白&#xff0c;软件工程专业上岸难度方面&#xff0c;重庆大…

普通算法——二维前缀和

二维前缀和 题目链接&#xff1a;https://www.acwing.com/problem/content/798/ 题目描述&#xff1a; 输入一个 n n n 行 m m m 列的整数矩阵&#xff0c;再输入 q q q 个询问&#xff0c;每个询问包含四个整数 ** x 1 , y 1 , x 2 , y 2 x1,y1,x2,y2 x1,y1,x2,y2 &…

【无标题】dom不更新 萤石云 ezuikit-js class赋值失败

原因&#xff1a;EZUIKit类赋值到dom节点后影响到dom节点更新 解决&#xff1a;外层嵌套一层节点&#xff0c;v-for外层节点如下 <div :class"item" v-for"item in videoPlay2" :key"item"> <div :id"item"></div> …

Mock神器:Easy-Mock 私有化部署及使用介绍

在现代前后端分离的开发模式中&#xff0c;后端接口的数据模拟是一个常见且必要的需求。尤其是在后端接口尚未开发完成时&#xff0c;前端开发需要依赖模拟数据进行开发与测试。Easy-Mock 是一个非常流行的开源工具&#xff08;虽然它已经停止更新好长时间了&#xff09;&#…

力扣第96题 不同的二叉搜索树

力扣第96题 - 不同的二叉搜索树 题目描述 给定一个整数 n&#xff0c;求以 1 到 n 为节点组成的所有 不同的二叉搜索树&#xff08;BST&#xff09; 的个数。 题目分析 二叉搜索树的性质 对于一个二叉搜索树&#xff0c;以 i 为根节点&#xff1a; 左子树的节点值来自 [1, i…

List与Set、数组与ArrayList、ArrayList与LinkedList的区别

List 与 Set 的区别&#xff1a; 项ListSet重复允许重复的对象&#xff08;多个null也可以&#xff09;不允许重复的对象&#xff08;null也只能有一个&#xff09;有序性有序的。 保持了每个元素的插入顺序。即输出顺序就是输入顺序。 有序和无序都有。 HashSet&#xff1a;无…

Java的Mvc整合Swagger的knife4框架

Swagger的介绍 Swagger 是一个规范和完整的框架&#xff0c;用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。使用Swagger&#xff0c;就是把相关的信息存储在它定义的描述文件里面&#xff08;yml或json格式&#xff09;&#xff0c;再通过维护这个描述 文件可以去更…

01_Node.js入门 (黑马)

01_Node.js入门 知识点自测 从 index.js 出发&#xff0c;访问到 student/data.json 的相对路径如何写? A&#xff1a;../public/teacher/data.json B&#xff1a;./public/student/data.json C&#xff1a;../student/data.json <details><summary>答案</sum…

2024.12.5——攻防世界Training-WWW-Robots攻防世界baby_web

2024.12.5—攻防世界Training-WWW-Robots 知识点&#xff1a;robots协议 dirsearch工具 本题与第一道Robots协议十分类似&#xff0c;不做wp解析 大致步骤&#xff1a; step 1 打开靶机&#xff0c;发现是robots协议相关 step 2 用dirsearch进行扫描目录 step 3 url传参r…