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数据库的必会技能-----五大数据类型