五、Redis五种常用数据结构-SET

Redis的Set结构存储的数据和Java中的HashSet类似,都是无序且不重复的。其底层的数据结构有两种,一是当value为整数时,且数据量不大时采用intset来存储。其他情况使用dict字典存储。集合中最多存储232-1(40多亿)个数据。

1、常用命令

  • sadd key v1v2,v3:向集合中添加一个或者多个元素。重复的元素将被忽略。如果key不存在,将创建一个新的key,并将数据保存到key里面。
  • scard key:获取集合的数据量
  • sdiff key1key2:返回第一个集合和其他集合的区别(即第一个集合独有的元素)。
  • sdiffstore destionation key1key2...:返回第一个集合和其他集合的差集并存储在destination中。指定destination集合已存在将被覆盖。即原来的数据会被删除。
  • sinter key1key2...:返回给定集合的所有交集。
  • sinterstore destination key1key2...:返回指定集合的交集,并保存到destination中。如果destination已存在将会被覆盖。
  • sismember key member:判断member元素是否是集合key的元素。
  • smembers key:返回集合中的所有数据。
  • smove source destination member:将member数据从source移动到destination中。smove是原子操作。
  1. 如果source集合不存在或者不存在指定的member元素,smove命令不进行任何操作,只是返回0。否则member元素从source集合中删除,并添加到destination集合中。
  2. 当destination集合中已存在member元素时,smove命令只是删除source集合中的数据。
  • spop key:移出并返回集合中随机一个数据。
  • srandmember keycount:返回集合中一个或者多个随机数
  • srem key member1member2:移出集合中一个或者多个元素,不存在则被忽略。
  • sunion key1 key2:返回所有给定集合中的并集。
  • sunionstore destination key1key2:所有给定集合的并集,并存储在destination中
  • sscan key cursor MATCH patternCOUNT count:迭代集合中的元素。

2、底层结构

2.1、intset

结构
c 复制代码
typedf struct intset{
	unint32_t encoding;//编码方式  有三种  默认 INSET_ENC_INT16
    unint32_t length;//集合元素的个数
    int8_t contents[];//实际存储元素的数组
}intset;
  • length字段记录了保存数据的contents中公有多少个元素
  • contents真正存数据的地方,数组都是按照从小到大 有序排列的,并且不包含任何重复项

intset示意图如下:

使用条件
  1. 存储的数据都为整数
  2. 集合保存的数据个数不超过512个

以上任何一个条件不满足就会使用dict字典结构。

2.2、字典-dict

见Hash中的dict结构

3、总结

相关推荐
你怎么知道我是队长9 分钟前
C++零基础第3周:if/else、switch、for/while/do-while 控制流完全指南(附20段可运行代码+避坑清单)
java·开发语言·c++
冻柠檬飞冰走茶23 分钟前
PTA刷题集之Airline Routes(C语言实现)
c语言·开发语言·数据结构·算法
damoluomu35 分钟前
Node 的 Headless 出厂没有前台,Java 的 Headless 是从门户里长出来的
java·开发语言·node.js
736c38 分钟前
固件开发岗算法
数据结构·算法
我命由我1234541 分钟前
Python 实用操作 - 文件操作(打开与关闭文件、读取文件、文件写入)
java·开发语言·前端·javascript·数据库·python·java-ee
冻柠檬飞冰走茶1 小时前
PTA刷题集之Battle Over Cities - Hard Version(C语言实现)
c语言·开发语言·数据结构·算法
小南家的青蛙1 小时前
华为云DCS全形态原生Redis命令兼容性测试方案
redis·华为云·兼容性·兼容性测试·dcs
学长毕设1 小时前
基于SpringBoot的网上流浪狗救助捐赠平台-附源码
java·spring boot·后端
xiaoqiMikko1 小时前
Redis 实战(三):持久化出错 —— fork 失败、磁盘写满、AOF 膨胀与损坏,逐个复现(6.2.4)
redis·后端
VimorphTech1 小时前
文本已经改了,旧的音频生成结果还能回写吗?
java·数据库·mybatis