redis五种数据类型
redis里的string、hash、list、set结构其实与我们熟悉的string、hash、list、set很相似,不同的是redis多了key来方便进行操作,实际就是key string/hash/list/set。如果存储数据时,该key已有数据,如果该数据类型与新数类型一致则会修改原本所存储的数据为新的数据,不一致则存储失败
string
-
string类型数据结构为:key value
-
基本操作
存数据:set name '张三'
读数据:get name
删数据:del name
一次存储多个key:mset name1 '张三' name2 '李四' name3 '王五'
一次读取多个key:mget name1 name2 name3
获取字符个数(1个中文=3个字符):strlen name
追加字符串:append name '爱吃鱼'
-
扩展操作
set num 10
自增1:incr num
自增指定值:incrby num 5
自增小数:incrbyfloat num 0.3
自减1:decr num
自减指定值:decrby num 5
(注:incr不可自增为小数的value值,decrby也一样)
-
控制数据时效性
超过指定秒后自动删除:setex name 5 '张三'
超过指定毫秒后自动删除:psetex name 5000 '张三'
hash
-
hash类型数据结构为:key hash (即:key field value)
-
基本操作
存数据:
hset user name '张三'
hset user password 123
读数据:
hget user name
hget user password
删数据:
hdel user name
hdel user password
一次性存储/修改指定key的多个field:
hmset user name '张三' password 123
一次性读取指定key的多个field:
hmget user name password
获取指定key中的field数:
hlen user
判断指定数据(key)中是否包含指定的字段(field) (返回1[有]或0[无]):
hexists user username
获取指定数据中的所有字段以及value值:
hgetall user
-
扩展操作
获取key中所有的field:hkeys user
获取key中所有的value:hvals user
给指定key中的指定field增加指定的值:
hincrby user age 1
hincrbyfloat user ago 0.2
存数据的扩展hsetnx:
hsetnx用法与hset一样,但hsetnx会判断key中是否有对应的field,有返回0,没有返回 1并存对应的值进去
list
-
lsit类型数据结构为:key lsit (即key value1 value2 value3 ...)
-
基本操作
lpush namelist '二河'
添加数据:
添加到队列左侧:lpush namelist '张三' '李四'
添加到队列右侧:rpush namelist '王五' '赵六'
获取数据:
lrange key start stop 从左到右读取,start开始到stop结束(start从0开始)
lrange namelist 0 3 #从左到右查询,
lrange namelist 0 -2 #从左到右查询,在((总数+1)-2)处停下
lrange namelist 0 -1 #从左到右查询,在((总数+1)-1)处停下,即查询全部数据
lindex key index 根据index查询
lindex namelist 3 #从左到右第(3+1)个(index以0为开始)
移除数据(会返回被移除的数据):
lpop namelist #从队列左边移除第一个元素并返回该元素
rpop namelist #从队列右边移除第一个元素并返回该元素
-
扩展操作
限时移除数据:
blpop namelist 5 #5秒内从队列左边移除第一个元素并返回该元素
brpop namelist 5 #5秒内从队列右边移除第一个元素并返回该元素
移除指定数据
lrem namelist 2 '王五' 从左边开始移除2个王五
set
-
set类型数据结构为:key set(即key member1 member2 member3 ...)
-
基本操作
添加数据:sadd myset 1 a '王五' 2 4 5 b c x d
读取全部数据:smembers myset
删除数据:srem myset 1
获取集合中元素的个数:scard myset
判断集合中是否包含指定的数据 (返回1[有]或0[无]):sismember myset a
-
扩展操作
随机获取指定key中随机值:
srandmember myset 3 从myset 中随机获取3个值
随机删除指定key中的随机值(返回被移除的值):
spop myset3
获取两个集合的交、并、差集:
sadd myset2 1 a '王五' 4 6 7 0 b k f p 添加一个集合
sinter myset myset2 #交集 sunion myset myset2 #并集 sdiff myset myset2 #差集
获取两个集合的交、并、差集存储到指定集合中
sinterstore myset3 myset myset2 #交集 sunionstore myset3 myset myset2 #并集 sdiffstore myset3 myset myset2 #差集
移动集合中的指定元素到另一个集合
smove myset myset2 '王五' 移动myset中的 '王五' 到myset2中
sorted_set
-
sorted_set的数据结构与set相似,但多了一个分值(即key score1 member1 score2 member2 score3 member3)
-
基本操作
添加数据:
zadd students 80 ls 85 ww 60 zl 70 tq
读取数据:
zrange students 0 -1 withscores #withscores显示分值,可写可不写
zrevrange students 0 -1 withscores #zrevrange反转查询结果
删除数据:
zrem students zs zl
根据分值筛选:
zrangebyscore students 60 80 withscores
zrevrangebyscore students 60 80 withscores #反转查询
zrangebyscore students 60 80 withscores limit 0 2 #从0开始查询2条数据
查询集合总数量:
zcard students
根据分值范围查询集合总数量:
zcount student 60 80
-
扩展操作
取多个集合中的交集、并集到指定集合(分值会累加):
zadd num1 1 a 4 b 7 c 10 d 13 e #添加集合num1
zadd num2 2 a 5 b 8 c 11 e 14 r #添加集合num2
zadd num3 3 a 6 b 9 c 12 q 15 w #添加集合num3
zinterstore temp1 3 num1 num2 num3 #交集,temp1后面的数字是要取集合的数量
zunionstore temp1 3 num1 num2 num3 #并集,temp1后面的数字是要取集合的数量