redis妙用-set类型
set类型,在redis中是非常强大的存在,但是我们一般不会想到用它。所以我最想分享的也就是set类型,想让大家对set引起重视。因为在互联网中其实也有很多set的身影,只是我们不难么容易联想到而已。比如
- 抽奖活动
- 点赞、签到
- 好友关注模型
- 电商商品筛选
- 大数据量对账
api
基本操作
命令 |
说明 |
---|---|
SADD key membermember... |
存储元素 |
SREM key membermember... |
从集合中删除元素 |
SMEMBERS key |
获取集合中所有元素 |
SCARD key |
获取集合的元素个数 |
SISMEMBER key member |
判断{member}是否存在集合中 |
SRANDMEMBER key count |
从集合中随机选出{count}个元素,不删除 |
SPOP key count |
从集合中随机选出{count}个元素,删除 |
集合运算操作
命令 |
说明 |
---|---|
SINTER key key... |
交集运算 |
SUNION key key... |
并集运算 |
SDIFF key key... |
差集运算 |
SINTERSTORE {resultKey} key key... |
交集运算,保存到resultKey中 |
SUNIONSTORE {resultKey} key key... |
并集运算,保存到resultKey中 |
SDIFFSTORE {resultKey} key key... |
差集运算,保存到resultKey中 |
应用场景
抽奖活动
# 刷礼物或转发,将用户加入到抽奖集合中
SADD key {userId}
# 抽取中奖用户
SPOP/SRANDMEMBER key [count]
点赞、签到
SADD like::{articleId} {userId} # 点赞
SREM like::{articleId} {userId} # 取消赞
SISMEMBER like::{articleId} {userId} # 检查用户是否点过赞
SMEMBERS like::{articleId} # 获取所有点赞用户列表
SCARD like::{articleId} # 获取点赞用户数
好友关注模型
far关注的人:farsub -> {"jayden", "james", "mic"}
ally关注的人:allysub -> {"seven", "jack", "mic", "james"}
far和ally共同关注的人:SINTER farsub allysub -> {"mic", "james"}
far关注的人是否关注了ally:SISMEMBER allysub jayden、 SISMEMBER allysub james
far可能认识的人:SDIFF allysub farsub -> {"seven", "jack"}
电商商品筛选
在每个商品入库的时候,给没有商品建立它的静态标签,如品牌、尺寸、处理器、内存...。如下
SADD brand::lenovo 拯救者y7000 Thinkpad-T480
SADD screenSize::15.6 拯救者y7000 雷神911-M5TA
SADD cpu::i7 拯救者y7000 雷神911-M5TA
SADD memory::8G 拯救者y7000 Thinkpad-T480
那么你在筛选查询的时候,将各个标签放在一起求交集就得到对应的结果,如下
SINTER brand::lenovo screenSize::15.6 cpu::i7 memory::8G -> 拯救者y7000
订单对账的功能
场景是这样的,与第三方公司交互时,不能实时对账。第三方公司只能在第二天将前一天的所有订单都传过来,然后要跟我们自己这边的订单对账。
当你的数据量比较庞大时,一天几十万单的时候,你循环一个个遍历我们的订单是否存在对方的订单中,这样的操作肯定是不合适的。
使用redis解决方案。将我们要关注的字段值,比如订单号、金额组成一个值存入redis的set类型中,形成两个set集合,然后取差值。如下
- 安全工具Aircrack-ng的使用
- Windows Server 2008 R2 搭建微信小程序
- insert事务产生duplicate key error引发的死锁分析
- 零基础入门深度学习 | 第六章:长短时记忆网络(LSTM)
- 第6章 I/O复用:select和poll函数
- 第7章 套接字选项
- 第8章 基本UDP套接字编程
- 第11章 名字与地址转换
- explicit_defaults_for_timestamp参数导致复制中断
- 剑指offer代码解析——面试题15求链表中倒数第K个结点
- 第15章 Unix域协议
- 第13章 守护进程和inetd超级服务器
- 第14章 高级I/O函数
- Python测试应用与工具
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Spring Boot 2.x基础教程:使用EhCache缓存集群
- 白平衡初探
- Activity的启动过程详解(基于10.0源码)
- Activity生命周期-你真的了解吗?
- Activity启动模式
- Redis6.0主从、哨兵、集群搭建和原理
- Linux入门学习笔记二
- 聊聊dubbo-go的tracingFilter
- 轻松学Pytorch –使用torchvision实现对象检测
- Linux core dump有什么用?
- Linux系统搭建C++开发环境
- Spring入门
- TKE容器实现限制用户在多个namespace上的访问权限(上)
- TKE容器实现限制用户在多个namespace上的访问权限(下)
- 小程序Android可以请求,ios请求失败wx.request