Redis常用数据结构和命令

1. Redis数据结构

Redis可以存储键与5种不同数据结构类型之间的映射,分别为string(字符串)、list(列表)、set(集合)、hash(散列)和zset(有序集合)。日常使用的基本上就是如上的五种常见数据结构。此外,Redis还支持bitmaps(位图), hyperloglogs(超级日志), geospatial indexes with radius queries and streams(具有半径查询和流的地理空间索引)。

下面引用《Redis实战》的表格,介绍五种常见的数据结构

结构类型 结构存储的值 结构的读写能力
STRING 可以是字符串、整数或浮点数 对整个字符串或者字符串的其中一部分执行操作;对整数和浮点数执行自增(increment)或者自减(decrement)
LIST 一个链表,链表上的每个节点都包含一个字符串 从链表的两端推入或者弹出元素;根据偏移量对链表进行修剪(trim);读取单个或者多个元素;根据值查找或者移除元素。
SET 包含字符串的无序收集器(unordered collection),并且被包含的每个字符串都是独一无二、各不相同的 添加、获取、移除单个元素;检查一个元素是否存在于集合中;计算交集、并集、差集;从集合里面随机获取元素。
HASH 包含键值对的无序散列表 添加、获取、移除单个键值对;获取所有键值对。
ZSET(有序集合) 字符串成员(member)与浮点数分值(score)之间的有序映射,元素的排列顺序由分值的大小决定 添加、获取、删除单个元素;根据分值范围(range)或者成员来或许元素。
  • string:字符串类型是非常常见的一种类型,Redis中的字符串类型和很多编程语言里的字符串类型差不多,但相对要灵活些。字符串可以存储以下三种类型:

    • 字符串(字节组成的序列)
    • 整数
    • 浮点数

    当字符串中的值可以被解释成十进制数或者浮点数的时候,Redis就会发现这一点,并允许用户对这个字符串进行各种增(incr*)、减(decr*)操作。如果对一个不存在的键或者保存了空串的键进行增减操作,则Redis会将其值当做0来处理。如果值无法被解释为整数或浮点数,Redis将向用户返回一个错误。

  • list:列表可以看作是个双端队列,可以在列表两端推入和弹出元素。对列表的不同操作可以实现其他编程语言中的堆栈(同一端进出)和队列(一端进,另一端出)数据结构。

  • set:集合最显著的特点应该就是其中的元素互不相同。用户可以快速对集合进行插入,删除,检查某元素是否在集合中的操作。此外,多个集合间也能很方便的执行交、并、差集运算。

  • zset:有序集合存储着成员与分值(权值,在Redis中以IEEE 754双精度浮点数的格式存储)之间的映射,并且提供了分值处理命令。适用于按照权值获取元素的情况。如热门帖子获取、基于投票数排序文章等。

  • hash:Redis中的散列可以让用户将多个键值对存储到一个Redis键中,可以把这种数据聚集看作是关系数据库中的行,或者文档数据库中的文档。

2. Redis常用命令

2.1 key的有关命令

命令 操作
exists key 测试指定key是否存在
del key1 [key2 ...] 删除给定key
type key 返回给定key的类型
keys pattern 以正则表达式的形式,返回匹配的所有key
rename oldkey newkey 修改key的名字
dbsize 查看数据库中key的数量(并不是所谓的大小)
expire key seconds 为key指定过期时间,到期自动删除
ttl key 查看key的剩余时间
select index 选择数据库(默认16个数据库,index为0-15)
move key index 将key移动到指定数据库
flushdb 清空当前数据库key
flushall 清空所有数据库key

2.2 string的有关命令

命令 操作
set key value 设置key对应的值为string类型的value
mset key1 value1 [key2 value2...] 一次设置多个key
get key 获取指定key的value值
mget key1 [key2 ...] 一次获取多个key的value值
incr key 对key的值做自增操作,返回新的值
decr key 对key的值做自减操作,返回新的值
incrby key integer 对key的value加指定integer
decrby key integer 对key的value减指定integer
append key value 给指定key的字符串追加value
substr key start end 截取key,从start(包含)到end(包含)。注意只是返回截取的value,源value并没改变

2.3 list的有关命令

命令 操作
lpush key value1 [value2...] 在key对应的list的头部(左端)添加元素
rpush key value1 [value2...] 在key对应的list的尾部(右端)添加元素
lpop key 移除并返回key对应的list的头部(左端)元素
rpop key 移除并返回key对应的list的尾部(右端)元素
lindex key offset 返回列表中偏移量为offset的元素
lrange key start end 返回列表中从start偏移量到end偏移量中的元素,包含两个端点元素(只返回,原list不变)
ltrim key start end 对列表进行修剪,只保留从start偏移量到end偏移量的元素,包含两个端点
llen key 返回对应列表的长度

此外,list还包含一些阻塞式的命令以及在列表之间移动元素的命令:

命令 操作
blpop key1 [key2...] timeout 从第一个非空列表中弹出位于头部(左端)的元素,或者在timeout秒内阻塞并等待可弹出元素的出现
brpop key1 [key2...] timeout 从第一个非空列表中弹出位于尾部(右端)的元素,或者在timeout秒内阻塞并等待可弹出元素的出现
rpoplpush source-key dest-key 从source-key列表中弹出位于最右端的元素,然后把这个元素插入dest-key列表的最左端,并向用户返回该元素
brpoplpush source-key dest-key timeout 从source-key列表中弹出位于最右端的元素,然后把这个元素插入dest-key列表的最左端,并向用户返回该元素。如果source-key为空,则在timeout秒内阻塞并等待可弹出元素的出现

2.4 set的有关命令

命令 操作
sadd key value1 [value2...] 将一个或多个元素添加到集合中,并返回添加成功的元素的个数
srem key value1 [value2...] 从集合中移除一个或多个元素,返回移除成功的元素的个数
sismember key value 检查元素value是否在集合key中,存在返回1,不存在返回0
scard key 返回集合包含的元素个数
smembers key 返回集合包含的全部元素
srandmember key [count] 随机返回集合中的一个或多个元素。当count为正数时,返回的元素不会重复;当count为负数时,返回的元素有可能会重复
spop key 随机移除集合中的某个元素,被返回给用户
smove source-key des-key value 如果集合source-key中包含元素value,则移除它,并添加到dest-key中;成功移除并添加则返回1,否则返回0

处理多个集合的常用命令:

命令 操作
sdiff key1 [key2...] 返回所有集合的差集
sdiffstore dest-key key1 [key2...] 将计算所得的差集中的元素添加到dest-key中
sinter key1 [key2...] 返回所有集合的交集
sinterstore dest-key key1 [key2...] 将计算所得的交集中的元素添加到dest-key中
sunion key1 [key2...] 返回所有集合的并集
sunionstore dest-key key1 [key2...] 将计算所得的并集中的元素添加到dest-key中

2.5 zset的有关命令

命令 操作
zadd key score1 member1 [score2 member2 ... ] 将带有给定分值的成员你添加到有序集合中。注意分值在前,成员在后
zrem key member1 [member2 ... ] 从有序集合中删除指定成员,并返回成功删除的元素个数
zcard key 返回有序集合包含的成员个数
zincrby key increment member 给指定成员的分值加上increment
zcount key min max 返回分值介于min和max之间的成员数量
zrank key memeber 返回指定成员在有序集合中的排名,成员按照score从小到大排序
zrevrank key memeber 返回指定成员在有序集合中的排名 ,成员按照score从大到小排序
zscore key member 返回指定成员的分值
zrange key start stop [WITHSCORES] 返回有序集合中排名介于start和stop之间的成员,如果给定了可选的 WITHSCORES选项,则连带成员分值一并返回
zrevrange key start stop [WITHSCORES] 同上,结果按score逆序
zrangebyscore key min max [WITHSCORES] 返回分值介于min和max之间的成员
zremrangebyrank key start stop 删除集合中排名在start和stop之间的成员
zremrangebyscore key min max 删除集合中分值在min和max之间的成员

2.6 hash的有关命令

命令 操作
hset key field value 向散列key中添加一个键值对
hget key field 获取散列key中的一个键的值
hmset key field1 value1 [field2 value2 ...] 向散列key中添加一个或多个键值对
hmget key field1 [field2 ... ] 获取散列key中的一个或多个键的值
hdel key field1 [field2 ... ] 删除散列中的一个或多个键值对,返回成功删除的键值对数量
hlen key 返回散列包含的键值对数量
hincrby key field integer 给散列中指定field的值加上integer
hexists key field 测试指定field是否在散列中存在
hkeys key 返回散列中所有field
hvals key 返回散列中所有value
hgetall key 返回散列中所有键值对

2.7 其他命令

Redis还有许多其他的命令,如发布订阅相关的命令,排序命令,更完整的命令介绍可以查看Redis官网文档中文版地址

此外,Redis客户端还提供了 command 命令,可以用来查看命令数组。如:

command命令

特别推荐:Redis客户端还提供了 help 命令,可以查看数据结构的描述( help set ),查看某个命令的具体用法( help zadd ),以及通过 help @group 语法来查看某个命令组( help @set 查看set所有命令)。如:

help命令

此外,Redis客户端还提供了命令智能提示,可以提示用户该命令的具体格式,如,当键入 zadd 时,客户端的智能提示如下:

客户端的智能提示

单纯的记忆命令是没有意义的,应该着重去学习Redis数据结构的概念和含义,具体应用的时候配合使用 help 命令以及官方文档即可。而且Redis的命令基本都是自解释的,基本从字面上就能够了解到该命令的作用。习惯了之后甚至可以自己去猜测需要的命令。

======返回目录======

<<< 上一篇:Redis的安装与配置说明

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

推荐阅读更多精彩内容