以前只是使用过redis做过一些缓存功能,对Redis中的数据类型没有做过详细的了解。今天就让我们一起来看看Redis中到底有哪些数据类型吧。
1.字符串类型
对于字符串大家肯定都非常熟悉,不管是哪种编程语言都会有字符串的身影。它是Redis中最基本的数据类型,他能存储任意形式的字符串,包括二进制数据,是Redis中其他数据类型的基础。下面我们就介绍一下Redis操作字符串的常用命令。
赋值与取值:
SET key value
GET key
递增数字
INCR key
当递增的不是整数时会报错:
127.0.0.1:6379> set age df
OK
127.0.0.1:6379> INCR age
(error) ERR value is not an integer or out of range
递增指定整数
INCRBY key increment
减少整数
INCT key
INCRBY key decrement
增加浮点数
INCRBYFLOAT key increment
向尾部追加
APPEND key value
获取字符串长度
STRLEN key
设置获取多个键值
MSET key value [key value ...]
MGET key [key ...]
位操作
获取字符串类型键指定位置的二进制位的值(0或1),超出实际长度返回0
GETBIT key offset
设置字符串类型指定二进制位的值(设置0或1),如果设置的位置超过字符串二进制位的长度,则将当前长度到指定偏移量之间的二进制位都设置成0
SETBIT key offset value
获取字符串类型键中为1的二进制位个数,start、end是字节的范围
BITCOUNT key [start] [end]
BITOP命令可以对多个字符串进行位运算,并将结果存储在destkey参数指定的键中。BITOP支持的运算操作有AND、OR、XOP和NOT。
BITOP operation destkey key [key ...]
下面我们对bar和arr进行OR运算:
redis>SET fool bar
OK
redis>SET foo2 arr
OK
redis>BITOP OR foo1 foo2
(integer) 3
redis>GET res
"car"
Redis2.8.7引入BITPOS命令,可以获取指定键第一个0或1的位置
redis>SET foo bar
OK
redis>BITPOS foo 1
(integer) 1
BITPOS key value start end
指定区间查询某个key的二进制位中出现0或1的位置(start和end是字节),返回的偏移量是从开头算的。
redis>BITPOS foo 1 1 2
(integer) 9
有一个有趣的现象:如果查询指定区间内所有的二进制位值都为1,在没有指定end的情况下查询第一个出现0的位置,返回的结果将是键值长度下一个字节位置的偏移量,因为redis认为键值长度以后的二进制位都是0。
2.散列表 hash
Redis是采用字典结构以键值对的形式存储数据的,而散列类型(hash)的键值也是一种字典结构。下面我们介绍一下散列类型(hash)常用的命令:
设置获取字典元素键值
hset key field value
hget key field
设置获取多个字典元素键值
hmset key field value [field value...]
hmget key field [field...]
获取字典中所有键值
hgetall key
判断是否存在,不存在赋值
hexists key field value
增加数字的值
hincrby key key field increment
删除指定字段
hdel key field [field]
只获取keys
hkeys key
只获取values
hvals key
获取长度
hlen key
3.列表类型
列表类型(list)可以存储一个有序字符串列表,常用的操作是向列表两端添加元素,或者获取列表某一个片段。
列表类型内部是使用双向链表(double linked list)实现的,所以向列表两端添加元素的时间复杂度为O(1),获取越接近两端的元素速度越快。(事实上获取一个长度为100000和一个长度为20列表的第10个元素的速度是一样的)。下面我们就介绍一下列表(list)常用的命令:
向列表两端添加元素:
lpush key value [value...]
rpush key value [value...]
从列表两端弹出元素:
lpop key
rpop key
获取列表长度
llen key
获取列表片段(包含头,也包含尾),如果是负数是从右边数
lrange key start stop
删除值为value的元素(当count大于0时从左面删count个,count小于0从右面算起删count个,等于0,全删)
lrem key count value
返回指定索引的元素
lindex key indix
设置指定索引元素的值
lset key index value
删除索引之外的元素
ltrim key start end
将value插入到值为pivot的前面或后面
linsert key beform|after pivot value
从source列表右边弹出一个元素添加到destistion列表的左边
rpoplpush source destinstion
redis 中设置key的过期时间:
EXPIRE key seconds
4.集合类型
集合的概念我们在高中都已经学过,在集合中的每个元素都是不同的,且没有顺序。一个集合最多能存储2^31-1个字符串。
集合与列表有相识之处,但很容易将他们区分开:
集合类型 | 列表类型 | |
---|---|---|
存储内容 | 至多2^31-1个字符串 | 至多2^31-1个字符串 |
有序性 | 否 | 是 |
唯一性 | 是 | 否 |
集合类型的常用操作是向集合中加入或删除元素、判断某个元素是否存在等,由于集合在Redis中是使用值为空的散列表(hash table)实现的,所以这些操作的时间复杂度都是O(1)。最方便的是多个集合之间还可以进行并集、交集和差集运算,下面我们就介绍一下集合(set)的常用命令:
增加删除元素(如果键不存在直接创建):
SAAD key member [member ...]
SREM key member [member ...]
获取集合中所有元素
SMEMBERS key
判断元素是否在集合中
SISMEMBER key member
集合间的运算(差集set1-set2、交集set1nset2、并集set1Uset2)
SDIFF set1 [set2 ...]
SINTER set1 [set2 ...]
SUNION set1 [set2 ...]
获取集合中元素的个数
SCARD key
进行集合间的运算,并将结果存储:
SDIFFSTORE destination key [key ...]
SINTERSTORE destination key [key ...]
SUNIONTORE destination key [key ...]
随机获取集合中的元素(count 表示一次获取元素的个数):
SRANDMEMBER key [count]
从集合中弹出一个元素:
SPOP key
5.有序集合
有序集合就是在集合的基础上为每个元素关联了一个分数,这使得我们不仅可以完成插入删除和判断元素是否存在集合等集合类型支持的操作,还能够获取分数最高或最低的N个元素、获取指定分数范围内的元素等与分数有关的操作。虽然集合中的每个元素是不同的,但是他们的分数是可以相同的。
有序集合和列表的比较:
- 二者都是有序的
- 二者都可以获取某一范围的元素
- 列表类型通过双向链表实现,获取靠近两端的元素速度极快,而当元素增加后获取中间的元素较慢,所以它适用于“新闻”、“新鲜事”、“日志”等很少访问中间元素的应用。
- 有序集合是使用散列表和跳跃表(skip list)实现的,所以读取中间位置的元素也是较快的(时间复杂度为:O(log(N)))
- 列表中不能简单的调整某个元素的位置,但有序集合可以(通过更改元素的分数)
- 有序结合要比列表更耗内存。
下面我们简单介绍一下有序列表常用的命令:
增加元素(+inf和-inf表示正无穷和负无穷):
ZADD key score member [score member]
获取元素分数:
ZSCORE key [member]
获得排名在某个范围的元素列表(WITHSCORES:表示显示分数,序号为-1表示最后一个元素):
ZRANGE key start stop [WITHSCORES]
:从小到大
ZREFVRANGE key start stop [WITHSCORES]
:从大到小
获取指定分数范围的元素:
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
这条命令是从小到大获取分数位于min与max之间的元素,加上WITHSCORES
表示查出元素的分数,LIMIT offset count
和SQL
中的用法相同,表示查询起点为offset
偏移量为count
。
增加某个元素的分数
ZINCRBY key increment member
获取集合中元素个数
ZCARD key
获取指定分数范围内元素的个数
ZCOUNT key min max
删除一个或多个元素
ZREM key member [member ...]
按照排名范围删除元素
ZREMRANGEBYRANK key start stop
按照分数范围删除元素
ZREMRANGEBYSCORE key min max
获取元素的排名
ZRANK key member
ZREVRANK key member
计算有序集合的交集
ZINTERSTORE destination munkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
destination
键中元素的分数是由AGGREGATE
参数决定的:
- 当
AGGREGATE
是SUM时(也是默认值),destination
键中元素的分数是每个参与计算的集合中该元素分数的和; - 当
AGGREGATE
是MIN时,destination
键中元素的分数是参与计算的集合中该元素分数的最小值; - 当
AGGREGATE
是MAX时,destination
键中的元素分数是参与计算的集合中该元素的最大值。
ZINTERSTORE
命令还能够通过WEIGHTS
参数设置每个集合的权重,每个集合在参与计算时元素的分数都会被乘上该元素的权重。
另外还有一种命令与ZINTERSTORE
命令的用法一样,名为ZUNIONSTORE
,它的作用是计算集合间的并集。
至此,Redis中主要的5种数据类型就全部介绍完了。
网友评论