Redis这五大数据类型你做过了解吗

Posted 孤岛上的笛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis这五大数据类型你做过了解吗相关的知识,希望对你有一定的参考价值。

目录标题

Redis五大数据类型

String数据类型

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

append:用于为指定的key追加值。
如果key已经存在并且是一个字符串,APPEND命令将value追加到key原来的值的末尾。
如果key不存在,APPEND就简单地将给定key设为value,就像执行set 可用 value 一样。

命令:set/get/append/strlen

判断该键是否存在,存在返回1,否则返回0
exists mykey

该键并不存在,因此append命令返回当前value的长度,并创建了该键继续执行则会进行追加长度(空格也算)
append mykey "hello"

set命令为键设置新值,也可以覆盖原有值
set mykey 666

get命令查看键的内容
get mykey

strlen获取键的字符长度
strlen mykey

命令:incr/decr/incrby/decrby

设置key的值20
set mykey 20

该key的值递增1
incr mykey

该key的值递减1
decr mykey

删除以有键,返回1删除成功
del mykey

对空值进行递减操作,从0开始计算递减后为-1
decr mykey

对控制执行递增操作,从0开始计算递增后为1
del mykey
incr mykey

将该键的value设置为不能转换为整型的普通字符串
set mykey hello
incr mykey则无法进行递增递减进行计算

减少指定的整数
set mykey 10
decrby mykey 100

增加指定的整数
incrby mykey 50


命令:getset

将计数器的值原子性的递增1
incr mycounter

在获取计数器原有值的同时,并将其设置为新值,这两个操作原子性的同时完成(相当于先执行get显示原来的值,再执行set进行覆盖)
getset mycounter 0

查看设置后的结果
get mycounter

命令:setex
设置指定key的过期时间为15秒
setex mykey 15 "hello"

通过ttl命令查看指定key剩余存活时间(单位:秒),-2表示已经过期,-1是永不过期
ttl mykey

命令:setnx
在指定的key不存在时,为key设置指定的值
该键并不存在时,setnx命令执行成功,存在时没有任何效果
setnx mykey 666
setnx mykey 777

命令:mset/mget/msetnx

批量设置键
mset key1 666 key2 777

批量查看
mget key1 key2

批量设置键返回1成功表示创建成功返回0表示其中的一个键已存在创建失败
mset key3 111 key4 222正常创建
mset key3 999 key5 333其中一个已经存在则失败返回0,但key3也不会修改
mget key3 key5批量获取但是key没有成功则看到nil

小结

set创建一个键且可以直接覆盖
append指定的键上追加内容不存在则创建
strlen获取键的字符长度
incr / decr加一减一对整数有效对不存在的键按0计算
incrby / decrby指定加减值
getset先看指定键原有值再设定覆盖
setex指定的键值设定时间单位秒ttl查看剩余存在时间
setnx设定值,如果原来有值则没有效果
mset/mget/msetnx批量处理键的创建查看

List数据类型

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

命令:lpush/lpushx/lrange

mykey键并不存在,该命令会创建该键及与其关联的List,之后在将参数中的values从左到右依次插入即再最左侧插入,如果该键存在则创建失败
lpush mykey a b c d
lrange mykey 0 2取元素为0到元素2的三个元素
lrange mykey 0 -1取表链中所有元素0表示第一个-1表示最后一个
lrange mykey 0 0取第一个元素
lrange mykey -1 -1取最后一个元素

使用lpushx时mykey2键不存在的话将不进行任何操作返回0
lpushx mykey2 e
lpush mykey2 e插入e
lpushx mykey2 a此时mykey2键存在了则会做插入a
lrange mykey2 0 -1

命令 :lpop/llen

del mykey清理一下这个键的内容

移除并返回mykey键的第一个元素,从右往左第一个
lpush mykey a b c d
lpop mykey
lpop mykey

获取表中元素数量,此时被移除两个元素了,链表汇总元素数量为2
llen mykey

命令:lrem/lset/lindex/ltrim

del mykey清理一下这个键的内容

lpush mykey a b c d a c测试所用数据

从头部(left)向尾部(right)变量链表,删除2个值等于a的元素,返回值为实际删除的数量
lrem mykey 2 a
lrange mykey 0 -1查看最后链表中的全部元素

获取索引值为1(头部的第二个元素)的元素值
lindex mykey 1

将索引值为1(头部的第二个元素)的元素值设置为新值e
lset mykey 1 e
lindex mykey 1查看结果

索引值超过表链元素量则返回nil
lindex mykey 6

设置的索引值6超过了表链中元素的数量,设置失败返回错误信息
lset mykey 6 hh

仅保留索引值0到2之间的3个元素,注意第0个和第2个元素均被保留
ltrim mykey 0 2
lrange mykey 0 -1

命令:linsert

del mykey清理一下这个键的内容
lpush mykey a b c d e测试所用数据

在a的前面插入新元素a1
linsert mykey before a a1
lrange mykey 0 -1查看结果

在e的后面插入新元素e2
linsert mykey after e e2
lrange mykey 0 -1查看结果

在不存在的元素之前或者之后插入新元素,操作失败会返回-1
linsert mykey before q q1
linsert mykey after q q2

在不存在的key插入新元素,操作失败会返回0
linsert mykey1 after a a2

命令:rpush/rpushx/rpop/rpoplpush

del mykey清理一下这个键的内容

从表链的尾部插入参数中给出的values,插入顺序是从右到左依次插入
rpush mykey a b c d
lrange mykey 0 -1查看插入顺序结果

该键已经存在并且包含4个元素,rpushx命令将执行成功,并将元素e插入到链表尾部
rpushx mykey e

通过lindex命令可以看出之前的rpushx命令确实执行成功,因为索引为4的元素已经是新元素了
lindex mykey 4

因为mykey2键不存在,因此rpushx命令不会插入数据,返回0
rpushx mykey2 e
lrange mykey 0 -1查看链表中元素有哪些,关注位置关系

移除并返回mykey键的第一个元素,从右取
rpop mykey
lrange mykey 0 -1

将mykey的尾部元素e弹出,同时再插入到mykey2的头部(原子性的完成这两部操作)
rpoplpush mykey mykey2
lrange mykey 0 -1

通过lrange命令查看mykey2在插入元素后的结果
lrange mykey2 0 -1

将souree和destination设为同一键,将mykey中的尾部元素移到其头部
rpoplpush mykey mykey
lrange mykey 0 -1

小结

lpush/lpushx/lrange:创建关联的List——插入——查看
lpop/llen:移除从右往左第一个——查看元素量
lrem/lset/lindex/ltrim:删除指定元素及个数——指定删除索引值的元素——仅保留两数之间索引值元素其他都删除
linsert:在指定元素的前或后加入新元素
rpush/rpushx/rpop/rpoplpush:创建关联的List右插入——插入元素到尾部——移除从往右第一个——将mykey的尾部元素e弹出,同时再插入到mykey2的头部

Hash数据类型(散列类型)

概述:hash用于存储对象。可以采用这样的命名方式:对象类别和ID构成键名,使用字段表示对象的属性,而字段值则存储属性值。

如:存储ID为2的汽车对象
如果Hash中包含很少的字段,那么该类型的数据也将仅占用很少的磁盘空间。每一个Hash可以存储2的23次方-1,即4294967295个键值对。

命令:hset/hget/hdel/hexists/hlen/hsetnx

给键值为myhash的键设置字段为field1,值为zhangsan
hset myhash field1 "zhang"

获取键值为myhash,字段为field1的值
hget myhash field1

myhash键中不存在field2字段,因此返回nil
hget myhash field2

给myhash添加一个新的字段field2,其值为san
hset myhash field2 "san"

heen命令获取myhash键的字段数量
hlen myhash

判断myhash键中是否存在字段名为field1的字段,由于存在,返回值1
hexists myhash field1

删除myhash键中字段名为field1的字段,删除成功返回1
hdel myhash field1

再次删除myhash键中字段名为field1的字段,由于上一条已经将其删除,所以返回0
hdel myhash field1

判断myhash键中是否存在field1字段,由于上一条命令已将其删除所以返回0
hexists myhash field1

通过hsetnx命令给myhash添加新字段field1,其值为zhang,因为字段已经被删除,所以该命令添加成功并返回1
hsetnx myhash field1 zhang

由于myhash的field1字段已经通过上一条命令添加成功,因为本条命令不做任何操纵后返回0
hsetnx myhash field1 zhang

命令:hincrby

删除该键,便于后面示例的测试
del myhash

准备测试数据,该myhash的field字段设定值5
hset myhash field 5

hincrby命令给myhash的field字段的值加1,返回加后的结果
hincrby myhash field 1

hincrby命令给myhash的field字段的值加-1,返回加后的结果
hincrby myhash field -1

hincrby命令给myhash的field字段的值加-10,返回加后的结果
hincrby myhash field -10

命令:hgetall/hkeys/hvals/hmget/hmset

删除该键,便于后面示例的测试
del myhash

hmset命令为该键myhash,一次性设置多个字段,分别是field=“hello”,field2=“world”
hmset myhash field1 "hello" field2 "world"

hmget命令获取myhash键的多个字段,其中field3并不存在,因为在返回结果中与该字段对应的值为nil
hmget myhash field1 field2 field3

hgetall命令返回myhash键的所有字段及其值,从结果中可以看出,他们是逐对列出的
hgetall myhash

hkeys命令仅获取myhash键中所有字段的名字
hkeys myhash

hvals命令仅获取myhash键中所有字段的值
hvals myhash

小结

hset/hget:hash数据类型的创建和获取
hdel:删除
hlen:获取键的字段数量
hexists:判断是否存在
hsetnx :添加新字段
hincrby:给键增加值可以正负
hgetall:逐对列出所有字段及其值
hkeys:仅获取指定键所有字段的名字
hvals:仅获取指定键所有字段的值
hmset/hmget:连续多个创建和获取

set数据类型(无序集合)

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

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

命令:sadd/smembers/scard/sismember

将一个或多个member元素加入到集合key当中,已经存在于集合的member元素将被忽略(集合中的元素各不相同)
格式sadd key member [member ...]
返回集合中的所有成员
格式smembers key
返回集合的数量。当集合key不存在时返回0
格式scard key name

插入测试数据,由于该键myset之前并不存在,因此参数中的三个成员都被正常插入
sadd myset a b c

由于参数中的a在myset中已经存在,因此本次操作仅仅插入了d和e两个新成员
sadd myset a d e

判断a是否已经存在,返回1表示存在
sismember myset a

判断f是否已经存在,返回0表示不存在
sismember myset f

通过smembers命令查看插入的结果,从结果可以看出,输出的顺序和插入顺序无关
smembers myset

获取set集合中元素的数量
scard myset

命令:spop/srem/srandmember/smove

移除集合中的指定 key 的一个或多个随机元素,移除后会返回移除的元素
spop key [count]

Redis Srem命令用于移除集合中的一个或多个成员元素,不存在的成员元素会被忽略
当key不是集合类型,返回一个错误
srem key member1..membern

返回集合中的一个随机元素
从 Redis 2.6版本开始,Srandmember 命令接受可选的 count 参数:
如果count为整数,且小于集合基数,那么命令返回一个包含count个元素的数组,数组中的元素各不相同。如果count大于等于集合基数,那么返回整个集合
如果count为负数,那么命令返回一个数组,数组中的元素可能会重复出现多次,而数组的长度为count的绝对值
该操作和spop相似,但spop将随机元素从集合中移除并返回,而Srandmember
则仅仅返回随机元素,而不对集合进行任何改动。
srandmember key [count]

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

删除该键,便于后面的测试
del myset

为后面的示例准备测试数据
sadd myset a b c d

查看set中成员的位置
smembers myset

从结果可以看出,该命令确实是随机的返回了某一成员(多试几次)
srandmember myset

随机的移除并返回set中的某一成员
spop myset

查看移除后set的成员信息
smembers myset

从ser中移除a、d和f三个成员,其中f并不存在,因此只有a和d两个成员被移出,返回2
srem myset a d f

查看移除后的输出结果
smembers myset

为后面的smove命令准备数据
sadd myset a b
sadd myset2 c d

将a从myset移到myset2,从结果可以看出移动成功
smove myset myset2 a

再次将a从myset移到myset2,此时a已经不是myset成员了,因此失败返回0
smove myset myset2 a

分别查看myset和myset2的成员,确认移动是否真的成功
smembers myset
smembers myset2

小结

sadd:将一个或多个member元素加入到集合key当中
smembers:查看所有元素内容
scard:获取set集合中元素的数量
sismember:判断元素是否已经存在
spop:随机的移除元素
srem:批量移除
srandmember:随机的返回了某一成员
smove:将元素从两个键之间移动

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

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

应用范围:
按个人喜好的游戏举例(寻仙),比如游戏的战力排行。每当玩家的战力发生变化时,可以执行zadd命令更新玩家的战力,此后再通过zrange命令获取积分top10的玩家信息,当然我们也可以利用zrank命令通过username来获取玩家的排行信息。最后我们将组合使用zrange和zrank命令快速的获取和某个玩家战力相近的其他用户的信息。
Sorted-Set类型还可以用于构建索引数据

命令:zadd/zcard/zcount/zrem/zincrby/zscore/zrange/zrank

添加一个分数为1的成员
zadd myzset 1 "one"

添加两个分数分别是2和3的两个成员
zadd myzset 2 "two" 3 "three"

0表示第一个成员,-1表示最后一个成员。withscores选项表示返回的结果中包含每个成员及其分数,否则只返回成员
zrange myzset 0 -1 withscores

获取成员one在Sorted-Set中的位置索引值。0表示第一个位置
zrank myzset one

成员four并不存在,因此返回nil
zrank myzset four

获取myzset键中成员数量
zcard myzset

zcount key min max,分数满足表达式1<=score<=2的成员的数量
zcount myzset 1 2

删除成员one和two,返回实际删除成员的数量
zrem myzset one two

查看是否删除成功
zcard myzset

获取成员three的分数,返回值是字符串形式
zscore myzset three

由于成员two已经被删除,所以该命令返回nil
zscore myzset two

成员one不存在,zincrby命令将添加该成员并假设其初始分数为0,将成员one的分数增加2,并返回该成员更新后的分数
zincrby myzset 2 one

将成员one的分数增加-1,并返回该成员更新后的分数
zincrby myzset -1 one

查看在更新了成员的分数后是否正确
zrange myzset 0 -1 withscores

命令:zrangebyscore/zremrangebyrank/zremrangebyscore
删除该键,便于后面的测试
del myset

为后面的示例准备测试数据
zadd myzset 1 one 2 two 3 three 4 four

zrangebyscore key min max,获取分数满足表达式1 <=score<=2的成员
zrangebyscore myzset 1 2

获取分数满足表达式1<score<=2的成员
zrangebyscore myzset (1 2

-inf表示第一个成员(位置索引值最低的,即0),+inf表示最后一个成员(位置索引值最高的),limit后面的参数用于限制返回成员的值,2表示从位置所有等于2的成员开始,取后而3个成员
zrangebyscore myzset -inf +inf limit 2 3
zrangebyscore myzset 0 4 limit 2 3另一种方法

删除分数满足表达式1<=score<=2的成员,并返回实际删除的数量。
zremrangebyscore myzset 1 2

查看一下,上面的删除是否成功
zrange myzset 0 -1

删除位置索引满足表达式0<=rank<=1的成员
zremrangebyrank myzset 0 1

查看上一条命令
zcard myzset

命令:zrevrange/zrevrangebyscore/zrevrank

为后面的示例准备测试数据
del myzset
zadd myzset 1 one 2 two 3 three 4 four

以位置索引从高到低的方式获取并返回此区间内的成员
zrevrange myzset 0 -1 withscores

由于是从高到低的排序,所以位置等于0的是four,1是three,并以此类推
zrevrange myzset 1 3

由于是从高到低的排序,所以one的位置是3
zrevrank myzset one

由于是从高到低的排序,所以four的位置是0
zrevrank myzset four

zrevrangebyscore key max min,获取分数满足表达式3>=score>=0的成员,并以从高到低的顺序输出
zrevrangebyscore myzset 3 0

zrevrangebyscore命令支持limit选项,其含义等同于zrangebyscore中的该选项,只是在计算位置时按照相反的顺序计算和获取
zrevrangebyscore myzset 4 0 limit 1 2
zrevrangebyscore myzset +inf -inf limit 1 3

小结

zadd:添加
zcard:获取键中成员数量
zcount:可以运用表达式<=score<=的方式来显示成员的数量
zrem:删除成员,返回数量
zincrby:加上一个值得结果可以是正/负数
zscore:获取成员的分数
zrange:查看成员:加withscores每个成员及其分数
zrank:获取成员在Sorted-Set中的位置索引值
zrangebyscore:获取分数满足表达式1 <=score<=2的成员
zremrangebyrank:删除位置索引满足表达式0<=rank<=1的成员
zremrangebyscore:返回指定区间索引对应的成员
zrevrange:以位置索引从高到低的方式获取并返回此区间内的成员
zrevrangebyscore:获取分数满足表达式3>=score>=0的成员,并以从高到低的顺序输出
zrevrank:由于是从高到低的排序方式搜索成员显示出位置

以上是关于Redis这五大数据类型你做过了解吗的主要内容,如果未能解决你的问题,请参考以下文章

Redis学习五大数据类型学习以及特殊的三大类型了解

不得不了解的知识!redis五大数据类型介绍!

深入了解Redis操作五大数据类型常用命令

从了解到熟悉Redis数据库的必会技能-----五大数据类型

从了解到熟悉Redis数据库的必会技能-----五大数据类型

redis五大类型