Redis的数据类型

redis数据类型和底层数据结构

一、String类型

概述

String是redis最基本的类型,最大能存储512MB的数据,String类型是二进制安全的,即可以存储任何数据、比如数字、图片、序列化对象等。

方法

redis 127.0.0.1:6379> exists mykey                       #判断该键是否存在,存在返回1,否则返回0。
(integer) 0    
redis 127.0.0.1:6379> append mykey "hello"                       #该键并不存在,因此append命令返回当前Value的长度。
(integer) 5    
redis 127.0.0.1:6379> append mykey " world"                      #该键已经存在,因此返回追加后Value的长度。
(integer) 11
redis 127.0.0.1:6379> get mykey                          #通过get命令获取该键,以判断append的结果。
"hello world"
redis 127.0.0.1:6379> set mykey "this is a test"                     #通过set命令为键设置新值,并覆盖原有值。
OK
redis 127.0.0.1:6379> strlen mykey                       #获取指定Key的字符长度。
(integer) 14
redis 127.0.0.1:6379> set mykey 20                       #设置Key的值为20
OK
redis 127.0.0.1:6379> incr mykey                     #该Key的值递增1
(integer) 21
redis 127.0.0.1:6379> decr mykey                     #该Key的值递减1
(integer) 20
redis 127.0.0.1:6379> decrby mykey 5                         #减少指定的整数
(integer) 15
redis 127.0.0.1:6379> incrby mykey 10                            #增加指定的整数
(integer) 25
redis 127.0.0.1:6379> setnx mykey "hello"                        #该键并不存在,因此setnx命令执行成功。
(integer) 1
redis 127.0.0.1:6379> setnx mykey "world"                        #该键已经存在,因此本次设置没有产生任何效果。
(integer) 0
redis 127.0.0.1:6379> mset key1 "hello" key2 "world"                 #批量设置了key1和key2两个键。
OK
redis 127.0.0.1:6379> mget key1 key2                 #批量获取了key1和key2两个键的值。
1) "hello"
2) "world"                   

数据结构

底层数据结构为sds、embstr、raw。
详细说明见redis底层数据结构

二、List类型

概述

列表的元素类型为string,按照插入顺序排序,在列表的头部或尾部添加元素。

方法

redis 127.0.0.1:6379> lpush mykey a b c d    #mykey键并不存在,该命令会创建该键及与其关联的List,之后在将参数中的values从左到右依次插入。
(integer) 4
redis 127.0.0.1:6379> lrange mykey 0 2       #取从位置0开始到位置2结束的3个元素。
1) "d"
2) "c"
3) "b"
redis 127.0.0.1:6379> lrange mykey 0 -1      #取链表中的全部元素,其中0表示第一个元素,-1表示最后一个元素。
1) "d"
2) "c"
3) "b"
4) "a"
redis 127.0.0.1:6379> lpushx mykey e     #mykey键此时已经存在,所以lpushx命令插入成功,并返回链表中当前元素的数量。
(integer) 5
redis 127.0.0.1:6379> lpop mykey         #移除并返回mykey键的第一个元素,从左取
"e"
redis 127.0.0.1:6379> llen mykey         #在执行lpop命令两次后,链表头部的元素已经被弹出,此时链表中元素的数量是4
(integer) 4

redis 127.0.0.1:6379> rpush mykey a b c d            #从链表的尾部插入参数中给出的values,插入顺序是从右到左依次插入。
(integer) 4
redis 127.0.0.1:6379> rpushx mykey e            #该键已经存在并且包含4个元素,rpushx命令将执行成功,并将元素e插入到链表的尾部。
(integer) 5
redis 127.0.0.1:6379> lindex mykey 4            #通过lindex命令可以看出之前的rpushx命令确实执行成功,因为索引值为4的元素已经是新元素了。
"e"
127.0.0.1:6379> rpop mykey                       #移除并返回mykey键的第一个元素,从右取
"e"
redis 127.0.0.1:6379> rpoplpush mykey mykey2         #将mykey的尾部元素e弹出,同时再插入到mykey2的头部(原子性的完成这两步操作)。
"d"

数据结构

3.0之前ziplist、linkedlist,3.0之后quicklist
数据结构说明可见redis六种底层数据结构

三、Hash数据类型

概述

hash用于存储对象。可以采用这样的命名方式:对象类别和ID构成键名,使用字段表示对象的属性,而字段值则存储属性值。 如:存储 ID 为 2 的汽车对象。
如果Hash中包含很少的字段,那么该类型的数据也将仅占用很少的磁盘空间。每一个Hash可以存储4294967295个键值对。
类似于hbase存储格式。

方法

hset

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

hget

描述:返回哈希表key中给定域field的值。
参数:key field
返回值:给定域的值。当给定域不存在或是给定key不存在时,返回nil。

hdel

描述:删除哈希表key中的一个或多个指定域,不存在的域将被忽略。
参数:key field [field …]
返回值:被成功移除的域的数量,不包括被忽略的域。

hexists

描述:查看哈希表key中,给定域field是否存在。
参数:key field
返回值:如果哈希表含有给定域,返回1。如果哈希表不含有给定域,或key不存在,返回0。

hlen

描述:返回哈希表key中域的数量。
参数:key
返回值:哈希表中域的数量。当key不存在时,返回0。

hsetnx

描述:将哈希表key中的域field的值设置为value,当且仅当域field不存在。若域field已经存在,该操作无效。如果key不存在,一个新哈希表被创建并执行HSETNX命令。
参数:key field value
返回值:设置成功,返回1。如果给定域已经存在且没有操作被执行,返回0。

redis 127.0.0.1:6379> hset myhash field1 "zhang"            #给键值为myhash的键设置字段为field1,值为zhang。
(integer) 1
redis 127.0.0.1:6379> hget myhash field1             #获取键值为myhash,字段为field1的值。
"zhang"
redis 127.0.0.1:6379> hget myhash field2             #myhash键中不存在field2字段,因此返回nil。
(nil)
redis 127.0.0.1:6379> hset myhash field2 "san"                   #给myhash添加一个新的字段field2,其值为san。
(integer) 1
redis 127.0.0.1:6379> hlen myhash                    #hlen命令获取myhash键的字段数量。
(integer) 2
redis 127.0.0.1:6379> hexists myhash field1                  #判断myhash键中是否存在字段名为field1的字段,由于存在,返回值为1。
(integer) 1
redis 127.0.0.1:6379> hdel myhash field1                 #删除myhash键中字段名为field1的字段,删除成功返回1。
(integer) 1
redis 127.0.0.1:6379> hdel myhash field1                    #再次删除myhash键中字段名为field1的字段,由于上一条命令已经将其删除,因为没有删除,返回0。
(integer) 0
redis 127.0.0.1:6379> hexists myhash field1                     #判断myhash键中是否存在field1字段,由于上一条命令已经将其删除,因为返回0。
(integer) 0
redis 127.0.0.1:6379> hsetnx myhash field1 zhang            #通过hsetnx命令给myhash添加新字段field1,其值为zhang,因为该字段已经被删除,所以该命令添加成功并返回1。
(integer) 1
redis 127.0.0.1:6379> hsetnx myhash field1 zhang            #由于myhash的field1字段已经通过上一条命令添加成功,因为本条命令不做任何操作后返回0。
(integer) 0

数据结构

ziplist、hashtable

四、Set集合

概述

无序集合,元素类型为String类型,元素具有唯一性,不允许存在重复的成员。多个集合类型之间可以进行并集、交集和差集运算。

应用范围

  1. 可以使用Redis的Set数据类型跟踪一些唯一性数据,比如访问某一博客的唯一IP地址信息。对于此场景,我们仅需在每次访问该博客时将访问者的IP存入Redis中,Set数据类型会自动保证IP地址的唯一性。
  2. 充分利用Set类型的服务端聚合操作方便、高效的特性,可以用于维护数据对象之间的关联关系。比如所有购买某一电子设备的客户ID被存储在一个指定的Set中,而购买另外一种电子产品的客户ID被存储在另外一个Set中,如果此时我们想获取有哪些客户同时购买了这两种商品时,Set的intersections命令就可以充分发挥它的方便和效率的优势了。

方法

SADD key member [member …]

将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略。假如 key 不存在,则创建一个只包含 member 元素作成员的集合。当 key 不是集合类型时,返回一个错误。
时间复杂度: O(N),N 是被添加的元素的数量。
返回值: 被添加到集合中的新元素的数量,不包括被忽略的元素。

SMEMBERS key

返回集合 key 中的所有成员。不存在的 key 被视为空集合。
时间复杂度: O(N),N 为集合的基数。
返回值: 集合中的所有成员。

SCARD key

返回集合 key 的基数 (集合中元素的数量)。
时间复杂度: O(1)
返回值:集合的基数。当 key 不存在时,返回 0 。

SISMEMBER key member

判断 member 元素是否集合 key 的成员。
时间复杂度: O(1)
返回值:如果 member 元素是集合的成员,返回 1 。如果 member 元素不是集合的成员,或 key 不存在,返回 0 。

redis 127.0.0.1:6379> sadd myset a b c       #插入测试数据,由于该键myset之前并不存在,因此参数中的三个成员都被正常插入。
(integer) 3
redis 127.0.0.1:6379> sadd myset a d e       #由于参数中的a在myset中已经存在,因此本次操作仅仅插入了d和e两个新成员。
(integer) 2
redis 127.0.0.1:6379> sismember myset a      #判断a是否已经存在,返回值为1表示存在。
(integer) 1
redis 127.0.0.1:6379> sismember myset f      #判断f是否已经存在,返回值为0表示不存在。
(integer) 0
redis 127.0.0.1:6379> smembers myset     #通过smembers命令查看插入的结果,从结果可以看出,输出的顺序和插入顺序无关。
1) "c"
2) "d"
3) "a"
4) "b"
5) "e"
redis 127.0.0.1:6379> scard myset            #获取Set集合中元素的数量。
(integer) 5

数据结构

intset、hashtable

五、Sorted Set数据类型(zset、有序集合)

概述

  1. 有序集合,元素类型为Sting,元素具有唯一性,不能重复。
  2. 每个元素都会关联一个double类型的分数score(表示权重),可以通过权重的大小排序,元素的score可以相同。

应用范围

  1. 可以用于一个大型在线游戏的积分排行榜。每当玩家的分数发生变化时,可以执行ZADD命令更新玩家的分数,此后再通过ZRANGE命令获取积分TOP10的用户信息。当然我们也可以利用ZRANK命令通过username来获取玩家的排行信息。最后我们将组合使用ZRANGE和ZRANK命令快速的获取和某个玩家积分相近的其他用户的信息。
  2. Sorted-Set类型还可用于构建索引数据。

方法

zadd

描述:增加一个或多个元素,如果该元素已经存在,更新它的socre值
虽然有序集合有序,但它也是集合,不能重复元素,添加重复元素只会
更新原有元素的score值
参数:key score : double value: string
返回值:1 or 0

zcard

描述:返回存储在key对应的有序集合中的元素的个数。
参数:key
返回值:元素个数

count

描述:返回key对应的有序集合中介于min和max间的元素的个数。
参数:key start: string end: string
返回值:数组长度

zrem

描述:从有序集合中删除指定的成员。
参数:key member
返回值:1 or 0

zincrby

将key对应的有序集合中member元素的scroe加上increment。如果指定的member不存在,那么将会添加该元素,并且其score的初始值为increment。如果key不存在,那么将会创建一个新的有序列表,其中包含member这一唯一的元素。如果key对应的值不是有序列表,那么将会发生错误。指定的score的值应该是能够转换为数字值的字符串,并且接收双精度浮点数。同时,你也可用提供一个负值,这样将减少score的值。
参数:key value member
返回值:字符型数据

zscore

描述:返回key对应的有序集合中member的score值。如果member在有序集合中不存在,那么将会返回null。
参数:key member

zrange

描述:取得特定范围内的排序元素,0代表第一个元素,1代表第二个以此类推。-1代表最后一个,-2代表倒数第二个…
参数:key start: long end: long withscores: bool = false
返回值:数组

zrank, zrevrank

描述:返回key对应的有序集合中member元素的索引值,元素按照score从低到高进行排列。rank值(或index)是从0开始的,这意味着具有最低score值的元素的rank值为0。使用ZREVRANK可以获得从高到低排列的元素的rank(或index)。
参数:key member
返回值:数字

redis 127.0.0.1:6379> zadd myzset 1 "one"                #添加一个分数为1的成员。
(integer) 1
redis 127.0.0.1:6379> zadd myzset 2 "two" 3 "three"      #添加两个分数分别是2和3的两个成员。
(integer) 2
redis 127.0.0.1:6379> zrange myzset 0 -1 WITHSCORES      #0表示第一个成员,-1表示最后一个成员。WITHSCORES选项表示返回的结果中包含每个成员及其分数,否则只返回成员。
1) "one"
2) "1"
3) "two"
4) "2"
5) "three"
6) "3"
redis 127.0.0.1:6379> zrank myzset one                   #获取成员one在Sorted-Set中的位置索引值。0表示第一个位置。
(integer) 0
redis 127.0.0.1:6379> zrank myzset four                  #成员four并不存在,因此返回nil。
(nil)
redis 127.0.0.1:6379> zcard myzset                       #获取myzset键中成员的数量。
(integer) 3
redis 127.0.0.1:6379> zcount myzset 1 2                  #zcount key min max,分数满足表达式1 <= score <= 2的成员的数量。
(integer) 2
redis 127.0.0.1:6379> zrem myzset one two                #删除成员one和two,返回实际删除成员的数量。
(integer) 2
redis 127.0.0.1:6379> zcard myzset                       #查看是否删除成功。
(integer) 1
redis 127.0.0.1:6379> zscore myzset three                #获取成员three的分数。返回值是字符串形式。
"3"
redis 127.0.0.1:6379> zscore myzset two                  #由于成员two已经被删除,所以该命令返回nil。
(nil)
redis 127.0.0.1:6379> zincrby myzset 2 one                           #成员one不存在,zincrby命令将添加该成员并假设其初始分数为0,将成员one的分数增加2,并返回该成员更新后的分数。
"2"
redis 127.0.0.1:6379> zincrby myzset -1 one              #将成员one的分数增加-1,并返回该成员更新后的分数。
"1"
redis 127.0.0.1:6379> zrange myzset 0 -1 WITHSCORES              #查看在更新了成员的分数后是否正确。
1) "one"
2) "1"
3) "three"
4) "3"

数据结构

ziplist、zskiplist

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值