redis之数据结构

redis之数据结构

Redis的外围是由一个键、值映射的字典构成的。与Memcached类似,键都是字符型,但是Memcached的值只能储存字符型数据,而Redis可以存储五种类型的数据,它们分别为:

  • 字符类型(string)
  • 字符串列表(list)
  • 无序不重复的字符串集合(set)
  • 有序不重复的字符串集合(zset)
  • 键、值都是字符串的哈希表(hash)

接下来我们分别介绍Redis的着五种类型以及它们的相关常用命令。

1)字符串类型

Redis的字符串类型和其他语言中的字符串没有什么明显的不同。字符串可以存储以下三种类型的值

  • 字节串 也就是字符数组
  • 整数 取值范围与操作系统相关,32位系统长32位,64位系统长64位
  • 浮点数 取值范围与双精度浮点数(double)相同
127.0.0.1:6379> set key "hello redis"
OK
127.0.0.1:6379> get key
"hello redis"
127.0.0.1:6379> set key2 10
OK
127.0.0.1:6379> get key2
"10"
127.0.0.1:6379> set key3 10.3
OK
127.0.0.1:6379> get key3
"10.3"

由上述可以看出,Redis的字符串有三种类型,其中数值类型的字符串有一些独特的操作。当存储的值是整数类型的字符串时,redis支持对此字符串值进行自增,自减等操作,如果对一个不存在的键或者保存了空串的键进行自增自减操作的时候,这个键的值默认为0。如果尝试对一个无法被解释为整数或者浮点数的字符串键进行此操作,redis会返回一个err。详细见下述命令

incr key                //将键存储的值+1(整数类型)
decr key                //将键存储的值-1(整数类型)
incrby key amount       //将键存储的值+amount(整数类型)
decrby key amount       //将键存储的值-amount(整数类型)
incrbyfloat key amount  //值+浮点数amount(浮点数|整数)在redis 2.6以上版本可以使用

而对于字节串,Redis提供了追加以及截取子串等操作命令,SETRANGE从start位置开始,用value替换,当start+value的长度大于key的值时,则自动覆盖之后的字符,当start+value的长度小于key的值的长度,则只替换[start,start+value]之间的字符。

append key value         //追加字符
getrange key start end   //字符串子串,key[start,end]闭区间
setrange key start value //子串替换

127.0.0.1:6379> get key
"hello redis!"
127.0.0.1:6379> setrange key 0 H
(integer) 12
127.0.0.1:6379> get key
"Hello redis!"
127.0.0.1:6379> setrange key 11 ?????
(integer) 16
127.0.0.1:6379> get key
"Hello redis?????"

除了上述命令之外,Redis还提供了一些二进制位的命令,首先将字符串中的每一个字符转化为AscaII码对应的二进制数,然后在进行相应的操作,

getbit key offset               //获取指定位(offset从左到右)上的二进制(八位)值:0|1
setbit key offset value         //设置指定位上的二进制值
bitcount key [start end]        //统计指定范围内的二进制位串里面值为1的个数
bitop operation dest-key key [key2 ...] 
                                //对一个或多个二进制位串进行 AND OR XOR NOT等位运算,保存在dest-key里面


127.0.0.1:6379> setbit key 7 1          //key 00000001
(integer) 0
127.0.0.1:6379> setbit key2 7 1         //key2 00000011
(integer) 0
127.0.0.1:6379> setbit key2 6 1
(integer) 0
127.0.0.1:6379> bitop and key3 key key2 //key3 00000001 & 00000011 = 00000001
(integer) 1
127.0.0.1:6379> get key3    
"\x01"
127.0.0.1:6379> bitop or key4 key key2  //key4 00000001 | 00000011 = 00000011
(integer) 1
127.0.0.1:6379> get key4                    
"\x03"      

2)列表

Redis的列表允许用户在两端插入或者弹出元素,获取列表元素以及执行各种常见的操作

rpush key value [value...]  //将一个或者多个元素推入列表右端
lpush key value [value...]  //将一个或者多个元素推入列表左端
rpop key                    //将一个元素从列表右端弹出并返回该元素
lpop key                    //将一个元素从列表左端弹出并返回该元素
lindex key offset           //获取列表指定位置上的元素
lrange  key start end       //获取指定范围内的元素,包括startend
ltrim key start end         //对列表进行修剪,保留startend之间的元素,全闭区间

Redis还提供了阻塞弹出命令,当一个列表无元素可以弹出,则等待一段时间,如果有其他客户端压入元素进入列表中,则此客户端将弹出元素。

//从第一个非空列表中弹出位于最左端的元素,或者在timeout秒之内阻塞并等待可以弹出的元素出现;
//返回值为两个数,一个是key,一个是弹出的元素
blpop key [key...] timeout

//从第一个非空列表中弹出位于最右端的元素,或者在timeout秒之内阻塞并等待可以弹出的元素出现;
//返回值为两个数,一个是key,一个是弹出的元素
brpop key [key...] timeout              

//从source-key最右端弹出一个元素推入desk-key的最左端,并返回这个元素
rpoplpush source-key dest-key 

//从source-key最右端弹出一个元素,然后推入dest-key的最左端,
//如果source-key为空,则阻塞等待timeout秒以后再弹出。
brpoplpush source-key dest-key timeout  

3)集合

Redis集合以无序的方式存放不重复的元素。

sadd key item [item...]         //将一个或者多个元素添加到集合中,并返回原本并不存在集合中的元素个数
srem key item [item...]         //从集合中移除一个或者多个元素,并返回移除的元素个数
sismember key item              //判断item是否存在于集合key中,存在返回1,不存在返回0
scard key                       //返回集合中的元素个数
smembers key                    //返回集合中的所有元素
srandmember key [count]         //随机地返回集合中count个元素,count为负数的时候,弹出的元素可能重复,
spop key                        //随机移除集合中的一个元素
smove source-key dest-key item  //如果集合source-key中包含item,则将其移除并添加到dest-key中,成功返回1,失败返回0

此外,Redis还提供了一些关于集合间的操作命令,如集合的比较,合并,取交集等等

sdiff key [key...]                  //返回哪些存在于第一个集合但是不存在其他集合中的元素
sdiffstore dest-key key [key...]    //将哪些存在于第一个集合但不存在其他集合中的元素存储到dest-key中
sinter key [key...]                 //返回那些同时存在于所有集合中的元素
sinterstore dest-key key [key...]   //将哪些同时存在于所有集合中的元素存储在dest-key中
sunion key [key...]                 //返回集合的并集
sunionstore dest-key key [key...]   //将集合的并集存储在dest-key中

4)散列

一个散列就是多个键值对,即Redis的值可以存放多个键值对。从而可以将一些相关数据存储在一起。

hmget key key1 [key2...]                //从散列中获取一个或者多个键的值
hmset key key1 value1 [key2 value2...]  //为散列添加一个或多个键值对
hdel key key1                           //删除散列中的一个或者多个键值对,返回成功删除的数量
hlen key                                //返回散列中包含的键值对的数量

hexists key key1                        //检查键是否存在于散列中,存在返回1
hkeys key                               //返回散列中所有的键
hvals key                               //返回散列中所有的值
hgetall key                             //返回散列中的所有键值对,返回格式是键一行,值一行以此类推
hincrby key key1 increment              //将散列中key1对应的值+一个数值,前提是这个键对应的值是整数
hincrbyfloat key key1 increment         //将散列中key1对应的值+一个数值,前提是这个键对应的值是数值

5)有序集合

和散列存储这键和值之间的映射类似,有序集合也存储着成员与分值之间的映射。

zadd key score member[score memeber...] //将带有分值的成员添加到有序集合中
zrem key member[memeber...]             //从有序集合中移除指定的成员,并返回移除的数量
zcard key                               //返回有序集合包含成员的数量s
zincrby key increment member            //给指定成员的的分数加上increment
zcount key min max                      //返回分数在min和max之间的成员数量
zrank key member                        //返回成员在有序集合中的排名,从0开始
zscore key member                       //返回成员的分数
zrange key start stop [withscores]      //返回有序集合中排名[start,stop]之间的成员,若有withscores,则将分数也返回

有序集合高级特性命令,包括有序集合的排序反转,有序集合之间的交集和并集等操作

//返回有序集合中成员的排名,分数由大到小排序
zrevrank key member 

//返回有序集合给定排名范围中的成员,分数由大到小
zrevrange key start stop [withscores]

//返回有序集合中,分值介于minmax之间的所有成员
zrangebyscore key min max[withscores] [limit offset count]

//返回有序集合中,分值介于minmax之间的所有成员,分值由大到小排序
zrevrangebyscore key max min[withscores] [limit offset count]

//移除有序集合中排名[start,end]之间的所有成员,返回移除的成员个数
zremrangebyrank key start stop

//移除有序集合中分值[min,max]之间的所有成员
zremrangebyscore key min max

//对指定的有序集合执行类似集合的交集操作(默认分值会累加)
//weights是为每个key的score分配一个乘法因子,在合并的时候分别与乘法因子相乘,
//aggregate是以某种方式返回结果给结果集。sum|min|max|,默认是sum方式
zinterstore dest-key key-count key [key...] [weights weight [weight...]] [aggregate sum|min|max]

//对有序集合进行并集操作(并且相同的key的分值会累加)
zunionstore dest-key key-count key [key...] [weights weight [weight...]] [aggregate sum|min|max]

以上就是Redis中对数据类型操作的相关命令,如有错误,欢迎批评指出,谢谢!

参考 《Redis IN ACTION》 Josiah L.Carlson

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值