redis之数据结构

来源:互联网 发布:sql select语句 例题 编辑:程序博客网 时间:2024/06/15 11:38

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"OK127.0.0.1:6379> get key"hello redis"127.0.0.1:6379> set key2 10OK127.0.0.1:6379> get key2"10"127.0.0.1:6379> set key3 10.3OK127.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) 12127.0.0.1:6379> get key"Hello redis!"127.0.0.1:6379> setrange key 11 ?????(integer) 16127.0.0.1:6379> get key"Hello redis?????"

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

getbit key offset               //获取指定位(offset从左到右)上的二进制(八位)值:0|1setbit 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) 0127.0.0.1:6379> setbit key2 7 1         //key2 00000011(integer) 0127.0.0.1:6379> setbit key2 6 1(integer) 0127.0.0.1:6379> bitop and key3 key key2 //key3 00000001 & 00000011 = 00000001(integer) 1127.0.0.1:6379> get key3    "\x01"127.0.0.1:6379> bitop or key4 key key2  //key4 00000001 | 00000011 = 00000011(integer) 1127.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       //获取指定范围内的元素,包括startendltrim 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,不存在返回0scard 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                        //检查键是否存在于散列中,存在返回1hkeys 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                               //返回有序集合包含成员的数量szincrby key increment member            //给指定成员的的分数加上incrementzcount 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