Redis - 2、5大数据类型_redis -2

get


示例



127.0.0.1:6379> set name ready
OK
127.0.0.1:6379> get name
“ready”


#### 2.2.3、apend:追加值



> 
> 将给定的value追加到原值的末尾。
> 
> 
> 



append



示例



127.0.0.1:6379> set k1 hello
OK
127.0.0.1:6379> append k1 " world"
(integer) 11
127.0.0.1:6379> get k1
“hello world”


#### 2.2.4、strlen:获取值的长度



strlen


示例



127.0.0.1:6379> set name ready
OK
127.0.0.1:6379> strlen name
(integer) 5


#### 2.2.5、setnx:key不存在时,设置key的值



setnx


示例



127.0.0.1:6379> flushdb #清空db,方便测试
OK
127.0.0.1:6379> setnx site “itsoku.com” #site不存在,返回1,表示设置成功
(integer) 1
127.0.0.1:6379> setnx site “itsoku.com” #再次通过setnx设置site,由于已经存在了,所以设
置失败,返回0
(integer) 0


#### 2.2.6、incr:原子递增1



> 
> 将key中存储的值增1,只能对数字值操作,如果key不存在,则会新建一个,值为1
> 
> 
> 



incr


示例



127.0.0.1:6379> flushdb #清空db,方便测试
OK
127.0.0.1:6379> set age 30 #age值为30
OK
127.0.0.1:6379> incr age #age增加1,返回31
(integer) 31
127.0.0.1:6379> get age #获取age的值
“31”
127.0.0.1:6379> incr salary #salary不存在,自动创建一个,值为1
(integer) 1
127.0.0.1:6379> get salary #获取salary的值
“1”


#### 2.2.7、decr:原子递减1



> 
> 将key中存储的值减1,只能对数字值操作,如果为空,新增值为-1
> 
> 
> 



decr


示例



127.0.0.1:6379> flushdb #清空db,方便测试
OK
127.0.0.1:6379> set age 30 #age值为30
OK
127.0.0.1:6379> decr age #age递减1,返回29
(integer) 29
127.0.0.1:6379> get age #获取age的值
“29”
127.0.0.1:6379> decr salary #salary不存在,自动创建一个,值为-1
(integer) -1
127.0.0.1:6379> get salary #获取salary
“-1”


#### 2.2.8、incrby/decrby:递增或者递减指定的数字



> 
> 将key中存储的数字值递增指定的步长,若key不存在,则相当于在原值为0的值上递增指定的步长。
> 
> 
> 



incrby/decrby <步长>


示例



127.0.0.1:6379> set salary 10000 #设置salary为10000
OK
127.0.0.1:6379> incrby salary 5000 #salary添加5000,返回15000
(integer) 15000
127.0.0.1:6379> get salary #获取salary
“15000”
127.0.0.1:6379> decrby salary 800 #salary减去800,返回14200
(integer) 14200
127.0.0.1:6379> get salary #获取salary
“14200”


#### 2.2.9、mset:同时设置多个key-value



mset …


示例



127.0.0.1:6379> mset name ready age 30
OK
127.0.0.1:6379> get name
“ready”
127.0.0.1:6379> get age
“30”


#### 2.2.10、mget:获取多个key对应的值



mget …


 示例



127.0.0.1:6379> mset name ready age 30 #同时设置name和age
OK
127.0.0.1:6379> mget name age #同时读取name和age的值

  1. “ready”
  2. “30”

#### 2.2.11、msetnx:当多个key都不存在时,则设置成功



> 
> 原子性的,要么都成功,或者都失败。
> 
> 
> 



msetnx …


示例



127.0.0.1:6379> flushdb #清空db,方便测试
OK
127.0.0.1:6379> set k1 v1 #设置k1
OK
127.0.0.1:6379> msetnx k1 v1 k2 v2 #当k1和k2都不存在的时候,同时设置k1和k2,由于k1已存
在,所以这个操作失败
(integer) 0
127.0.0.1:6379> mget k1 k2 #获取k1、k2,k2不存在

  1. “v1”
  2. (nil)
    127.0.0.1:6379> msetnx k2 v2 k3 v3 #当k2、h3都不存在的时候,同时设置k2和k3,设置成功
    (integer) 1
    127.0.0.1:6379> mget k1 k2 k3 #后去k1、k2、k3的值
  3. “v1”
  4. “v2”
  5. “v3”

#### 2.2.12、getrange:获取值的范围,类似java中的substring



> 
> 获取[start,end]返回为的字符串
> 
> 
> 



getrange key start end


示例



127.0.0.1:6379> set k1 helloworld
OK
127.0.0.1:6379> getrange k1 0 4
“hello”


#### 2.2.13、setrange:覆盖指定位置的值



setrange <起始位置>


示例



127.0.0.1:6379> set k1 helloworld
OK
127.0.0.1:6379> get k1
“helloworld”
127.0.0.1:6379> setrange k1 1 java
(integer) 10
127.0.0.1:6379> get k1
“hjavaworld”


#### 2.2.14、setex:设置键值&过期时间(秒)



setex <过期时间(秒)>


示例



127.0.0.1:6379> setex k1 100 v1 #设置k1的值为v1,有效期100秒
OK
127.0.0.1:6379> get k1 #获取k1的值
“v1”
127.0.0.1:6379> ttl k1 #获取k1还有多少秒失效
(integer) 96


#### 2.2.15、getset:以新换旧,设置新值同时返回旧值



getset



127.0.0.1:6379> set name ready #设置name为ready
OK
127.0.0.1:6379> getset name tom #设置name为tom,返回name的旧值
“ready”
127.0.0.1:6379> getset age 30 #设置age为30,age未设置过,返回age的旧值为null
(nil)


### 2.3、数据结构


String的数据结构为简单动态字符串(Simple Dynamic String,缩写SDS)。是可以修改的字符串,内部结构上类似于Java的ArrayList,采用分配冗余空间的方式来减少内存的频繁分配。


![](https://img-blog.csdnimg.cn/a4a7c32f0b6c4fef8cff8db3bcfaea86.png)


如图所示,内部为当前字符串实际分配的空间capacity一般要高于实际字符串长度len。当字符串长度小于1M时,扩容都是加倍现有的空间,如果超过1M,扩容时一次会多扩容1M的空间。 


要注意的是字符串最大长度为512M。


## 3、redis列表(List)


### 3.1、简介


单键多值  
 redis列表是简单的字符串列表,按照插入顺序排序。  
 你可以添加一个元素到列表的头部(左边)或者尾部(右边)。  
 它的底层实际上是使用双向链表实现的,对两端的操作性能很高,通过索引下标操作中间节点性能会较差。


![](https://img-blog.csdnimg.cn/7ba222b9f7864dbfb49725013aa524e0.png)


### 3.2、常用命令


#### 3.2.1、lpush/rpush:从左边或者右边插入一个或多个值



lpush/rpush …


示例



127.0.0.1:6379> flushdb #清空db,方便测试
OK
127.0.0.1:6379> rpush name java spring “springboot” “spring cloud” #列表name的左边
插入4个元素
(integer) 4
127.0.0.1:6379> lrange name 1 2 #从左边取出索引位于[1,2]范围内的元素

  1. “spring”
  2. “springboot”

#### 3.2.2、lrange:从列表左边获取指定范围内的值



> 
> 返回列表 key 中指定区间内的元素,区间以偏移量 start 和 stop 指定。  
>  下标(index)参数 start 和 stop 都以 0 为底,也就是说,以 0 表示列表的第一个元素,以 1  
>  表示列表的第二个元素,以此类推。  
>  你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此  
>  类推。  
>  返回值:  
>  一个列表,包含指定区间内的元素。
> 
> 
> 



lrange


示例



127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> rpush course java c c++ php js nodejs #course集合的右边插入6个元素
(integer) 6
127.0.0.1:6379> lrange course 0 -1 #取出course集合中所有元素

  1. “java”
  2. “c”
  3. “c++”
  4. “php”
  5. “js”
  6. “nodejs”
    127.0.0.1:6379> lrange course 1 3 #获取course集合索引[1,3]范围内的元素
  7. “c”
  8. “c++”
  9. “php”

#### 3.2.3、lpop/rpop:从左边或者右边弹出多个元素



> 
> count:可以省略,默认值为1  
>  lpop/rpop 操作之后,弹出来的值会从列表中删除  
>  值在键在,值光键亡。
> 
> 
> 



lpop/rpop


示例



127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> rpush course java c++ php js node js #集合course右边加入6个元素
(integer) 6
127.0.0.1:6379> lpop course #从左边弹出1个元素
“java”
127.0.0.1:6379> rpop course 2 #从右边弹出2个元素

  1. “js”
  2. “node”

#### 3.2.4、rpoplpush:从一个列表右边弹出一个元素放到另外一个列表中



> 
> 从source的右边弹出一个元素放到destination列表的左边
> 
> 
> 



rpoplpush source destination


示例



127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> rpush k1 1 2 3 #列表k1的右边添加3个元素[1,2,3]
(integer) 3
127.0.0.1:6379> lrange k1 0 -1 #从左到右输出k1列表中的元素

  1. “1”
  2. “2”
  3. “3”
    127.0.0.1:6379> rpush k2 4 5 6 #列表k2的右边添加3个元素[4,5,6]
    (integer) 3
    127.0.0.1:6379> lrange k2 0 -1 #从左到右输出k2列表中的元素
  4. “4”
  5. “5”
  6. “6”
    127.0.0.1:6379> rpoplpush k1 k2 #从k1的右边弹出一个元素放到k2的左边
    “3”
    127.0.0.1:6379> lrange k1 0 -1 #k1中剩下2个元素了
  7. “1”
  8. “2”
    127.0.0.1:6379> lrange k2 0 -1 #k2中变成4个元素了
  9. “3”
  10. “4”
  11. “5”
  12. “6”

#### 3.2.5、lindex:获取指定索引位置的元素(从左到右)



> 
> 返回列表 key 中,下标为 index 的元素。  
>  下标(index)参数 start 和 stop 都以 0 为底,也就是说,以 0 表示列表的第一个元素,以 1  
>  表示列表的第二个元素,以此类推。  
>  你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此  
>  类推。  
>  如果 key 不是列表类型,返回一个错误。  
>  返回值:  
>  列表中下标为 index 的元素。  
>  如果 index 参数的值不在列表的区间范围内(out of range),返回 nil
> 
> 
> 



lindex key index


示例



127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> rpush course java c c++ php #列表course中放入4个元素
(integer) 4
127.0.0.1:6379> lindex course 2 #返回索引位置2的元素
“c++”
127.0.0.1:6379> lindex course 200 #返回索引位置200的元素,没有
(nil)
127.0.0.1:6379> lindex course -1 #返回最后一个元素
“php”


#### 3.2.6、llen:获得列表长度



> 
> 返回列表 key 的长度。  
>  如果 key 不存在,则 key 被解释为一个空列表,返回 0 .  
>  如果 key 不是列表类型,返回一个错误。
> 
> 
> 



llen key


示例



127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> rpush name ready tom jack
(integer) 3
127.0.0.1:6379> llen name
(integer) 3


#### 3.2.7、linsert:在某个值的前或者后面插入一个值



> 
> 将值 newvalue 插入到列表 key 当中,位于值 value 之前或之后。  
>  当 value 不存在于列表 key 时,不执行任何操作。  
>  当 key 不存在时, key 被视为空列表,不执行任何操作。  
>  如果 key 不是列表类型,返回一个错误。  
>  返回值:  
>  如果命令执行成功,返回插入操作完成之后,列表的长度。  
>  如果没有找到 value ,返回 -1 。  
>  如果 key 不存在或为空列表,返回 0 。
> 
> 
> 



linsert before|after


示例



127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> rpush name ready tom jack #列表name中添加3个元素
(integer) 3
127.0.0.1:6379> lrange name 0 -1 #name列表所有元素

  1. “ready”
  2. “tom”
  3. “jack”
    127.0.0.1:6379> linsert name before tom lily #tom前面添加lily
    (integer) 4
    127.0.0.1:6379> lrange name 0 -1 #name列表所有元素
  4. “ready”
  5. “lily”
  6. “tom”
  7. “jack”
    127.0.0.1:6379> linsert name before xxx lucy # 在元素xxx前面插入lucy,由于xxx元素不存
    在,插入失败,返回-1
    (integer) -1
    127.0.0.1:6379> lrange name 0 -1
  8. “ready”
  9. “lily”
  10. “tom”
  11. “jack”

#### 3.2.8、lrem:删除指定数量的某个元素



> 
> 根据参数 count 的值,移除列表中与参数 value 相等的元素。  
>  count 的值可以是以下几种:
> 
> 
> * count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count 。
> * count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对
> * 值。
> * count = 0 : 移除表中所有与 value 相等的值。
> 
> 
> 返回值:  
>  被移除元素的数量。  
>  因为不存在的 key 被视作空表(empty list),所以当 key 不存在时,总是返回 0 。
> 
> 
> 


示例



127.0.0.1:6379> flushdb #清空db,方便测试
OK
127.0.0.1:6379> rpush k1 v1 v2 v3 v2 v2 v1 #k1列表中插入6个元素
(integer) 6
127.0.0.1:6379> lrange k1 0 -1 #输出k1集合中所有元素

  1. “v1”
  2. “v2”
  3. “v3”
  4. “v2”
  5. “v2”
  6. “v1”
    127.0.0.1:6379> lrem k1 2 v2 #k1集合中从左边删除2个v2
    (integer) 2
    127.0.0.1:6379> lrange k1 0 -1 #输出列表,列表中还有1个v2,前面2个v2干掉了
  7. “v1”
  8. “v3”
  9. “v2”
  10. “v1”

####  3.2.9、lset:替换指定位置的值



> 
> 将列表 key 下标为 index 的元素的值设置为 value 。  
>  当 index 参数超出范围,或对一个空列表( key 不存在)进行lset时,返回一个错误。  
>  返回值:  
>  操作成功返回 ok ,否则返回错误信息。
> 
> 
> 



lset


示例



127.0.0.1:6379> flushdb #清空db,方便测试
OK
127.0.0.1:6379> rpush name tom jack ready #name集合中放入3个元素
(integer) 3
127.0.0.1:6379> lrange name 0 -1 #输出name集合元素

  1. “tom”
  2. “jack”
  3. “ready”
    127.0.0.1:6379> lset name 1 lily #将name集合中第2个元素替换为liy
    OK
    127.0.0.1:6379> lrange name 0 -1 #输出name集合元素
  4. “tom”
  5. “lily”
  6. “ready”
    127.0.0.1:6379> lset name 10 lily #索引超出范围,报错
    (error) ERR index out of range
    127.0.0.1:6379> lset course 1 java #course集合不存在,报错
    (error) ERR no such key

### 3.4、数据结构


List的数据结构为快速链表quickList  
 首先在列表元素较少的情况下会使用一块连续的内存存储,这个结构是ziplist,也就是压缩列表。它将所有的元素紧挨着一起存储,分配的是一块连续的内存。当就比较多的时候才会改成quickList。  
 因为普通的链表需要的附加指针空间太大,会比较浪费空间,比如这个列表里存储的只是int类型的书,结构上还需要2个额外的指针prev和next。


![](https://img-blog.csdnimg.cn/ca08a3c688d5455dada8a99d2c3d6fd0.png)


 redis将链表和ziplist结合起来组成了quicklist。也就是将多个ziplist使用双向指针串起来使用,这样既满足了快速的插入删除性能,又不会出现太大的空间冗余。


## 4、redis集合(Set)


### 4.1、简介


redis set对外提供的功与list类似,是一个列表的功能,特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择。


redis的set是string类型的无序集合,他的底层实际是一个value为null的hash表,收益添加,删除,查找复杂度都是O(1)。


一个算法,如果时间复杂度是O(1),那么随着数据的增加,查找数据的时间不变,也就是不管数据多少,查找时间都是一样的。


### 4.2、常用命令


#### 4.2.1、sadd:添加一个或多个元素



sadd …


示例



127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> sadd k1 v1 v2 v1 v3 v2 #k1中放入5个元素,会自动去重,成功插入3个
(integer) 3


#### 4.2.2、smembers:取出所有元素



smembers


示例



127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> sadd k1 v1 v2 v1 v3 v2
(integer) 3
127.0.0.1:6379> smembers k1

  1. “v2”
  2. “v1”
  3. “v3”

#### 4.2.3、sismember:判断集合中是否有某个值



> 
> 判断集合key中是否包含元素value,1:有,0:没有
> 
> 
> 



sismember


示例



127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> sadd k1 v1 v2 v1 v3 v2 #k1集合中成功放入3个元素[v1,v2,v3]
(integer) 3
127.0.0.1:6379> sismember k1 v1 #判断k1中是否包含v1,1:有
(integer) 1
127.0.0.1:6379> sismember k1 v5 #判断k1中是否包含v5,0:无
(integer) 0


#### 4.2.4、scard:返回集合中元素的个数



> 
> 返回集合 key 的基数(集合中元素的数量)  
>  返回值:  
>  集合的基数。  
>  当 key 不存在时,返回 0 。
> 
> 
> 



scard


示例



127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> sadd k1 v1 v2 v1 v3 v2
(integer) 3
127.0.0.1:6379> scard k1
(integer) 3


#### 4.2.5、srem:删除多个元素



> 
> 移除集合 key 中的一个或多个 member 元素,不存在的 member 元素会被忽略。  
>  当 key 不是集合类型,返回一个错误。  
>  返回值:  
>  被成功移除的元素的数量,不包括被忽略的元素。
> 
> 
> 



srem key member [member …]


示例



127.0.0.1:6379> flushdb #清空db,方测试
OK
127.0.0.1:6379> sadd course java c c++ python #集合course中添加4个元素
(integer) 4
127.0.0.1:6379> smembers course #获取course集合所有元素

  1. “python”
  2. “java”
  3. “c++”
  4. “c”
    127.0.0.1:6379> srem course java c #删除course集合中的java和c
    (integer) 2
    127.0.0.1:6379> smembers course #获取course集合所有元素,剩下2个了
  5. “python”
  6. “c++”

#### 4.2.6、spop:随机弹出多个值



> 
> 随机从key集合中弹出count个元素,count默认值为1  
>  返回值:  
>  被移除的随机元素。  
>  当 key 不存在或 key 是空集时,返回 nil
> 
> 
> 



spop


示例



127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> sadd course java c c++ python #course集合中添加4个元素
(integer) 4
127.0.0.1:6379> smembers course #获取course集合中所有元素

  1. “python”
  2. “java”
  3. “c++”
  4. “c”
    127.0.0.1:6379> spop course #随机弹出1个元素,被弹出的元素会被删除
    “c++”
    127.0.0.1:6379> spop course 2 #随机弹出2个元素
  5. “java”
  6. “python”
    127.0.0.1:6379> smembers course #输出剩下的元素
  7. “c”

#### 4.2.7、srandmember:随机获取多个元素,不会从集合中删除



> 
> 从key指定的集合中随机返回count个元素,count可以不指定,默认值是1。  
>  srandmember 和 spop的区别:  
>  都可以随机获取多个元素,srandmember 不会删除元素,而spop会删除元素。  
>  返回值:  
>  只提供 key 参数时,返回一个元素;如果集合为空,返回 nil 。  
>  如果提供了 count 参数,那么返回一个数组;如果集合为空,返回空数组。
> 
> 
> 



srandmember


示例



127.0.0.1:6379> flushdb #清空db,方便测试
OK
127.0.0.1:6379> sadd course java c c++ python #course中放入5个元素
(integer) 4
127.0.0.1:6379> smembers course #输出course集合中所有元素

  1. “python”
  2. “java”
  3. “c++”
  4. “c”
    127.0.0.1:6379> srandmember course 3 #随机获取3个元素,元素并不会被删除
  5. “python”
  6. “c++”
  7. “c”
    127.0.0.1:6379> smembers course #输出course集合中所有元素,元素个数未变
  8. “python”
  9. “java”
  10. “c++”
  11. “c”

#### 4.2.8、smove:将某个原创从一个集合移动到另一个集合



> 
> 将 member 元素从 source 集合移动到 destination 集合。  
>  smove 是原子性操作。  
>  如果 source 集合不存在或不包含指定的 member 元素,则 smove 命令不执行任何操作,仅返  
>  回 0 。否则, member 元素从 source 集合中被移除,并添加到 destination 集合中去。  
>  当 destination 集合已经包含 member 元素时,smove 命令只是简单地将 source 集合中的  
>  member 元素删除。  
>  当 source 或 destination 不是集合类型时,返回一个错误。 
> 
> 
> 返回值:  
>  如果 member 元素被成功移除,返回 1 。  
>  如果 member 元素不是 source 集合的成员,并且没有任何操作对 destination 集合执行,那  
>  么返回 0 。
> 
> 
> 



smove member


示例



127.0.0.1:6379> flushdb #清空db,方便测试
OK
127.0.0.1:6379> sadd course1 java php js #集合course1中放入3个元素[java,php,js]
(integer) 3
127.0.0.1:6379> sadd course2 c c++ #集合course2中放入2个元素[c,c++]
(integer) 2
127.0.0.1:6379> smove course1 course2 js #将course1中的js移动到course2
(integer) 1
127.0.0.1:6379> smembers course1 #输出course1中的元素

  1. “java”
  2. “php”
    127.0.0.1:6379> smembers course2 #输出course2中的元素
  3. “js”
  4. “c++”
  5. “c”

#### 4.2.9、sinter:取多个集合的交集



sinter key [key …]


示例



127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> sadd course1 java php js #集合course1:[java,php,js]
(integer) 3
127.0.0.1:6379> sadd course2 c c++ js #集合course2:[c,c++,js]
(integer) 3
127.0.0.1:6379> sadd course3 js html #集合course3:[js,html]
(integer) 2
127.0.0.1:6379> sinter course1 course2 course3 #返回三个集合的交集,只有:[js]

  1. “js”

#### 4.2.10、sinterstore:将多个集合的交集放到一个新的集合中



> 
> 这个命令类似于 sinter 命令,但它将结果保存到 destination 集合,而不是简单地返回结果  
>  集。  
>  返回值:  
>  结果集中的成员数量。
> 
> 
> 



sinterstore destination key [key …]


#### 4.2.11、sunion:取多个集合的并集,自动去重



sunion key [key …]


示例



127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> sadd course1 java php js #集合course1:[java,php,js]
(integer) 3
127.0.0.1:6379> sadd course2 c c++ js #集合course2:[c,c++,js]
(integer) 3
127.0.0.1:6379> sadd course3 js html #集合course3:[js,html]
(integer) 2
127.0.0.1:6379> sunion course1 course2 course3 #返回3个集合的并集,会自动去重

  1. “php”
  2. “js”
  3. “java”
  4. “html”
  5. “c++”
  6. “c”

#### 4.2.12、sunionstore:将多个集合的并集放到一个新的集合中



> 
> 这个命令类似于 sunion 命令,但它将结果保存到 destination 集合,而不是简单地返回结果  
>  集。  
>  返回值:  
>  结果集中的成员数量。
> 
> 
> 



sinterstore destination key [key …]


####  4.2.13、sdiff:取多个集合的差集



> 
> 返回一个集合的全部成员,该集合是所有给定集合之间的差集。  
>  不存在的 key 被视为空集。
> 
> 
> 



SDIFF key [key …]


示例



127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> sadd course1 java php js #集合course1:[java,php,js]
(integer) 3
127.0.0.1:6379> sadd course2 c c++ js #集合course2:[c,c++,js]
(integer) 3
127.0.0.1:6379> sadd course3 js html #集合course3:[js,html]
(integer) 2
127.0.0.1:6379> sdiff course1 course2 course3 #返回course1中有的而course2和course3
中都没有的元素

  1. “java”
  2. “php”

####  4.2.14、sdiffstore:将多个集合的差集放到一个新的集合中



> 
> 这个命令类似于 sdiff 命令,但它将结果保存到 destination 集合,而不是简单地返回结果集。  
>  返回值:  
>  结果集中的成员数量。
> 
> 
> 



sdiffstore destination key [key …]


### 4.3、数据结构


set数据结构是字典,字典是用hash表实现的。  
 Java中的HashSet的内部实现使用HashMap,只不过所有的value都指向同一个对象。  
 Redis的set结构也是一样的,它的内部也使用hash结构,所有的value都指向同一个内部值。


## 5、redis哈希(Hash)


### 5.1、简介


Redis hash是一个键值对集合。  
 Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。  
 类似于java里面的Map<String,Object>


### 5.2、常用命令


#### 5.2.1、hset:设置多个field的值



> 
> 将哈希表 key 中的域 field 的值设为 value 。  
>  如果 key 不存在,一个新的哈希表被创建并进行 hset 操作。  
>  如果域 field 已经存在于哈希表中,旧值将被覆盖。  
>  返回值:  
>  如果 field 是哈希表中的一个新建域,并且值设置成功,返回 1 。  
>  如果哈希表中域 field 已经存在且旧值已被新值覆盖,返回 0 。
> 
> 
> 



hset key field value [field value …]


示例



127.0.0.1:6379> flushdb #清空db,方便测试
OK
127.0.0.1:6379> hset user name ready age 30 #哈希表user中设置2个域:name和age,name的
值为ready,age的值为30
(integer) 2


#### 5.2.2、hget:获取指定filed的值



hget key field


示例



127.0.0.1:6379> flushdb #清空db,方便测试
OK
127.0.0.1:6379> hset user name ready age 30 #哈希表user中设置2个域:name和age,name的
值为ready,age的值为30
(integer) 2
127.0.0.1:6379> hget user name #获取user中的name
“ready”


#### 5.2.3、hgetall:返回hash表所有的域和值



hgetall key


示例



127.0.0.1:6379> flushdb #清空db,方便测试
OK
127.0.0.1:6379> hset user name ready age 30 #哈希表user中设置2个域:name和age,name的
值为ready,age的值为30
(integer) 2
127.0.0.1:6379> hgetall user #获取user所有信息

  1. “name”
  2. “ready”

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以戳这里获取

将哈希表 key 中的域 field 的值设为 value 。
如果 key 不存在,一个新的哈希表被创建并进行 hset 操作。
如果域 field 已经存在于哈希表中,旧值将被覆盖。
返回值:
如果 field 是哈希表中的一个新建域,并且值设置成功,返回 1 。
如果哈希表中域 field 已经存在且旧值已被新值覆盖,返回 0 。

hset key field value [field value ...]

示例

127.0.0.1:6379> flushdb #清空db,方便测试
OK
127.0.0.1:6379> hset user name ready age 30 #哈希表user中设置2个域:name和age,name的
值为ready,age的值为30
(integer) 2

5.2.2、hget:获取指定filed的值
hget key field

示例

127.0.0.1:6379> flushdb #清空db,方便测试
OK
127.0.0.1:6379> hset user name ready age 30 #哈希表user中设置2个域:name和age,name的
值为ready,age的值为30
(integer) 2
127.0.0.1:6379> hget user name #获取user中的name
"ready"

5.2.3、hgetall:返回hash表所有的域和值
hgetall key

示例

127.0.0.1:6379> flushdb #清空db,方便测试
OK
127.0.0.1:6379> hset user name ready age 30 #哈希表user中设置2个域:name和age,name的
值为ready,age的值为30
(integer) 2
127.0.0.1:6379> hgetall user #获取user所有信息
1) "name"
2) "ready"


[外链图片转存中...(img-nbRfOjc9-1714421332748)]
[外链图片转存中...(img-Jx7ilIbr-1714421332748)]
[外链图片转存中...(img-VRaWmFmG-1714421332748)]

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**

  • 12
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值