Redis中的5种数据类型及常用命令

以前只是使用过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 countSQL中的用法相同,表示查询起点为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种数据类型就全部介绍完了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 198,932评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,554评论 2 375
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 145,894评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,442评论 1 268
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,347评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,899评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,325评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,980评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,196评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,163评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,085评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,826评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,389评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,501评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,753评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,171评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,616评论 2 339

推荐阅读更多精彩内容