redis 系列13 集合对象

一. 集合对象概述

  这里的集合是string类型的无序集合,在集合对象中集合成员是唯一的,这就意味着集合中不能出现重复的数据。集合是通过哈希表实现的,集合中最大的成员数为 232-1 (4294967295, 每个集合可存储40多亿个成员)。集合对象的编码可以是intset或者hashtable。

  1.1 intset编码

    intset编码的集合对象使用整数集合作为底层实现,集合对象包含的所有元素都被保存在整数集合里面。例如下面使用整数集合:

     127.0.0.1:6379> sadd numbers 1 3 5
    (integer) 3
    127.0.0.1:6379> object encoding numbers
    "intset"

  1.2 hashtable编码

     另一个编码是hashtable,集合对象使用字典作为底层实现,字典的每个键都是一个字符串对象,每个字符串对象包含了一个集合元素,而字典的值则全部被设置为null。

    127.0.0.1:6379> sadd furits "apple" "banana"
    (integer) 2
    127.0.0.1:6379> object encoding furits
    "hashtable"

  两个底层结构如下图所示,作为字典结构,键都是一个字符串对象,值都为NULL。

  1.3  编码转换

    当集合对象可以同时满足以下两个条件时,对象使用intset编码:(1) 集合对象保存的所有元素都是整数值;(2) 集合对象保存的元素数量不超过512个。当不能满足这两个条件的集合对象使用的是hashtable编码。对于第二个条件的上限值可以通过配置文件中的set-max-intset-entries选项来修改。

   127.0.0.1:6379> config get set-max-intset-entries
	1) "set-max-intset-entries"
	2) "512"

  

二. 集合命令实现

-- Sadd 命令将一个或多个成员元素加入到集合中,已经存在于集合的成员元素将被忽略。
    127.0.0.1:6379> sadd myset "hello" "foo"
    (integer) 2

-- Scard 命令返回集合中元素的数量
    127.0.0.1:6379> scard myset
    (integer) 2

--  Sdiff 命令返回给定集合之间的差集, 返回包含差集成员的列表。下面是返回myset1对比myset2,返回myset1的差集。
    127.0.0.1:6379> sadd myset1 "hello" "foo" "bar"
    (integer) 3
    127.0.0.1:6379> sadd myset2 "hello" "world"
    (integer) 2
    127.0.0.1:6379> sdiff myset1 myset2
    1) "foo"
    2) "bar"

-- Sdiffstore 命令将差集存储在指定的集合中,如果指定的集合(destination) key已存在,则会被覆盖, 下面集合key为 destset不存在,创建该新集合并且新集合值为二个集合的差集。
。
    127.0.0.1:6379> sdiffstore destset myset1 myset2
    (integer) 2
    127.0.0.1:6379> smembers destset
    1) "foo"
    2) "bar"

-- Sinter 命令返回给定所有给定集合的交集,与Sdiff相反。下面返回myset1和myset2二个集合共同有的值。
    127.0.0.1:6379> sinter myset1 myset2
    1) "hello"

-- Sinterstore命令将给定集合之间的交集存储在指定的集合中。如果指定的集合已经存在,则将其覆盖, 与Sdiffstore 相反。下面集合key为 destset2不存在,创建该新集合并且新集合值为二个集合的交集。

    127.0.0.1:6379> sinterstore destest2 myset1 myset2
    (integer) 1
    127.0.0.1:6379> smembers destest2
    1) "hello"

--  Sismember 命令判断成员元素是否是集合的成员。如果成员元素是集合的成员,返回 1。
    127.0.0.1:6379> sismember myset1 "hello"
    (integer) 1

-- Smembers 命令返回集合中的所有的成员。 不存在的集合 key 被视为空集合。
    127.0.0.1:6379> smembers myset1
    1) "hello"
    2) "bar"
    3) "foo"

-- Smove 命令将指定成员 member 元素从 source 集合移动到 destination 集合,SMOVE 是原子性操作。
    127.0.0.1:6379> smembers myset1
    1) "hello"
    2) "bar"
    3) "foo"
    127.0.0.1:6379> smembers myset2
    1) "hello"
    2) "world"
    127.0.0.1:6379> smove myset1 myset2 "bar"  --将myset1的元素移到myset2中
    (integer) 1
    127.0.0.1:6379> smembers myset1  -- myset1中少了"bar"元素
    1) "hello"
    2) "foo"
    127.0.0.1:6379> smembers myset2  --myset2 中多了"bar" 元素
    1) "hello"
    2) "world"
    3) "bar"

--Spop 命令用于随机移除指定count元素数量,并返回集合中的移出的元素。
    127.0.0.1:6379> smembers myset1
    1) "three"
    2) "one"
    3) "hello"
    4) "two"
    127.0.0.1:6379> spop myset1  3  --随机移除3个
    1) "hello"
    2) "two"
    3) "three"
    127.0.0.1:6379> smembers myset1  --只剩下一个元素
    1) "one"

--Srem 命令用于移除集合中的一个或多个成员元素,不存在的成员元素会被忽略。
    127.0.0.1:6379> smembers myset1
    1) "three"
    2) "one"
    3) "two"
    127.0.0.1:6379> srem myset1 "one"  --移除指定元素
    (integer) 1
    127.0.0.1:6379> smembers myset1  --只剩下二个元素
    1) "three"
    2) "two"

--Sunion 命令返回给定集合的并集,相当于sql中的join合并去重。
    127.0.0.1:6379> smembers myset2
    1) "one"
    2) "two"
    127.0.0.1:6379> smembers myset1
    1) "three"
    2) "two"
    127.0.0.1:6379> sunion myset2 myset1  --返回合并后的元素
    1) "three"
    2) "one"
    3) "two"

-- Sunionstore 命令将给定集合的并集,存储在指定的集合 destination 中。
    127.0.0.1:6379> sunionstore myset  myset2 myset1
    (integer) 3
    127.0.0.1:6379> smembers myset  --并集后,存储到了myset集合中
    1) "three"
    2) "one"
    3) "two

-- Sscan 命令用于迭代集合键中的元素
    127.0.0.1:6379> smembers myset
    1) "three"
    2) "one"
    3) "two"
    127.0.0.1:6379> sscan myset 0  match t*
    1) "0"
    2) 1) "three"
       2) "two"

  

原文地址:https://www.cnblogs.com/MrHSR/p/9981706.html

时间: 2024-11-05 22:48:50

redis 系列13 集合对象的相关文章

redis 系列15 数据对象的(类型检查,内存回收,对象共享)和数据库切换

原文:redis 系列15 数据对象的(类型检查,内存回收,对象共享)和数据库切换 一.  概述 对于前面的五章中,已清楚了数据对象的类型以及命令实现,其实还有一种数据对象为HyperLogLog,以后需要用到再了解.下面再了解类型检查,内存回收,对象共享,对象的空转时长. 1.1   类型检查与命令多态 redis中用于操作键的命令基本上可以分为两种类型,一种是可以对任何的键执行,如:del, expire,rename,type,object 这些命令等,对于这些命令属于多态命令.另一种命令

Java 集合系列13之 WeakHashMap详细介绍(源码解析)和使用示例

概要 这一章,我们对WeakHashMap进行学习.我们先对WeakHashMap有个整体认识,然后再学习它的源码,最后再通过实例来学会使用WeakHashMap.第1部分 WeakHashMap介绍第2部分 WeakHashMap数据结构第3部分 WeakHashMap源码解析(基于JDK1.6.0_45)第4部分 WeakHashMap遍历方式第5部分 WeakHashMap示例 转载请注明出处:http://www.cnblogs.com/skywang12345/admin/EditPo

redis系列之------对象

前言 Redis 并没有直接使用数据结构来实现键值对 数据库, 而是基于这些数据结构创建了一个对象系统, 这个系统包含字符串对象.列表对象.哈希对象.集合对象和有序集合对象这五种类型的对象, 每种对象都用到了至少一种我们前面所介绍的数据结构. 通过这五种不同类型的对象, Redis 可以在执行命令之前, 根据对象的类型来判断一个对象是否可以执行给定的命令. 使用对象的另一个好处是, 我们可以针对不同的使用场景, 为对象设置多种不同的数据结构实现, 从而优化对象在不同场景下的使用效率. 除此之外,

Java 集合系列 13 WeakHashMap

java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java 集合系列 04 LinkedList详细介绍(源码解析)和使用示例 Java 集合系列 05 Vector详细介绍(源码解析)和使用示例 Java 集合系列 06 Stack详细介绍(源码解析)和使用示例 Java 集合系列 07 List总结(LinkedList, ArrayList等使用场景和

redis源码阅读之集合对象

redis当中集合对象的底层实现为intset和hashtable实现,用hashtable实现时,存储具体值的是key,value统一用NULL.其实集合对象的实现和hash对象的实现还是非常类似的,都是尽可能用占用空间小的底层类型存储,如果实在存不下了,就得鸟枪换炮了老规矩,还是先说转换的条件,由于占地较小的实现为intset,这就导致发生转化的条件比zipmap->hashtable要不一样了,但也是一共两项,若有一项或一项以上没法满足,则intset转为hashtable: 集合对象均为

《Redis - 集合对象》

一:概述 - Redis 源码版本为3.0.0. - Redis 集合命令请戳. - OBJECT ENCODING key 查看数据底层类型实现. 二:集合对象的底层实现 - 编码方式 - 字符串对象共有两种编码方式  intset(整数集合) / hashtable(字典) - 编码方式的选择 -  当列表对象 元素都是整数/元素数量小于512 则使用 intset(set-max-intset-entries) . - 不满足条件则使用 hashtable. - inset 编码方式 - 

Redis系列(1)之安装

Redis系列(1)之安装 由于项目的需要,最近需要研究下Redis.Redis是个很轻量级的NoSql内存数据库,它有多轻量级的呢,用C写的,源码只有3万行,空的数据库只占1M内存.它的功能很丰富,可以将其用作缓存,队列系统等.我们的项目就是用其作为缓存系统.关于Redis的介绍这里就不多说,刚上手完了一会,感觉还不错.那么熟悉Redis就从安装开始. 1. Redis 单机的安装 相比于Hbase的安装,Redis的安装非常简单. 首先从官网上下载安装包,注意Redis的版本规则是次版本(即

Redis系列(2)之数据类型

Redis系列(2)之数据类型 <Redis系列(1)之安装>中介绍了Redis支持以下几种数据类型,那么本节主要介绍学习下这几种数据类型的基本操作 字符串类型,string 散列类型,hash 列表类型,list 集合类型,set 有序集合类型,zset 1. 字符串类型 赋值与取值 SET 与 GET. 当键不存在时候返回为空. 1 127.0.0.1:6379> set key hello 2 OK 3 127.0.0.1:6379> get key 4 "hell

Redis系列(一)--安装、helloworld以及读懂配置文件

再开个redis系列,本系列打算不详细讲一系列的命名的了(会推荐别人写的,人家写的够详细了),我直接就是做redis方案提供,当然一开始还是讲下helloworld和配置文件好了.会逐步更新,欢迎关注. 文章结构:(1)安装:(2)helloworld:(3)解析配置文件(一一罗列方便复习):(4)重点配置 一.安装:把到官网下载好的redis压缩包放置到你想要的位置.并解压. 然后进入redis-3.0.4目录,执行make命令 jackfrost@jackfrost-pc:~/MyResou