《redis实战》笔记—— 数据结构及其命令

概述


redis 可以存储键与 5 种不同数据结构类型之间的映射,分别为 STRING(字符串), LIST(列表), SET(集合), HASH(散列), ZSET(有序集合),有些命令是对于这些数据结构是通用的,而有些只是对于特定数据结构的。


1. STRING

  • 字符串可以存储三种类型的值:

    • 字节串(byte string)
    • 整数
    • 浮点数
  • 如果一个存储在redis字符串中的值可以被看做十进制整数或者浮点数,那么redis便允许对该值进行如下增减操作;如果用户对一个不存在的建或一个保存了空串的键执行自增或自减操作,会被视为0处理;如果这个值不能解释成一个整数或者浮点数,执行以下增减操作会报错(Python调用之前先import redis, conn = redis.Redis()):

命令 redis用例和描述 Python redis库调用
incr incr key 将键存储的值加1 conn.incr('key')
decr decr key 将键存储的值减1 conn.decr('key')
incrby incrby key amount 将键存储的值加整数amount conn.incr('key', amount)
decrby decrby key amount 将键存储的值减整数amount conn.decr('key', amount)
incrbyfloat incrbyfloat key amount 将键存储的值加上浮点数 amount conn.incrbyfloat('key', amount)
没有decrbyfloat
  • 处理子串和二进制位的命令:
命令 redis用例和描述 Python redis库调用
append append key value将值value追加到给定的键 key当前存储的值的末尾 conn.append('key', 'value')
getrange(2.6之前为substr) getrange key start end 获取一个由偏移量start至end范围内所有字符组成的子串,包括start和end在内(索引以0开始) conn.getrange('key', start, end)
setrange setrange key offset value 将从偏移offset开始的子串设置为给定值 conn.setrange('key', offset, 'new-value')
位操作 getbit、setbit、bitcount、bitop

2. LIST

  • redis 的列表允许用户从序列的两端push或者pop元素, 获取列表元素,以及执行各种常见的列表操作。还可以用来存储任务信息、最近浏览过的文章或者常用联系人信息。

  • 常用列表命令如下:

命令 redis用例和概述 python redis 库调用
rpush rpush key vlaue [value ...] 将一个或多个值push进列表的右端 conn.rpush('key', 'value')
lpush lpush key value [value ...]...左端 conn.lpush('key', 'value')
rpop rpop key 移除并返回列表最右端的元素 conn.rpop('key')
lpop lpop key 移除并返回列表最左端的元素 conn.lpop('key')
lindex lindex key offset 返回列表中偏移量为offset的元素 conn.index('key', offset)
lrange lrange key start stop 返回列表中从start偏移量到end偏移量范围内的所有元素,包括start和end conn.lrange('key', start, stop)
ltrim ltrim key start stop 对列表进行修剪,只保留从start到end(包括start和end)之间的元素 conn.ltrim('key', start, stop)
  • 阻塞式pop及列表之间移动元素:
命令 redis用例和描述 Python redis 库调用
blpop blpop key[key...] timeout 从第一个非空列表中弹出位于最左端的元素,或者在timeout秒之内阻塞并等待可弹出的元素出现 conn.blpop(keys, timeout)
brpop brpop key[key...] timeout 从第一个非空列表中弹出位于最右端的元素,或者在timeout秒之内阻塞并等待可弹出的元素出现 conn.brpop(keys, timeout)
rpoplpush rpoplpush source-key dest-key 从source-key列表中pop出位于最右端的元素,然后将这个元素push进dest-key列表的最左端,并向用户返回这个元素 rpoplpush(source-key, dest-key)
brpoplpush brpoplpush source-key dest-key timeout 从source-key列表中弹出位于最右端的元素,然后将这个元素推入dest-key列表的最左端,并向用户返回这个元素:如果souce-key为空,那么在timeout秒之内阻塞并等待可弹出的元素出现 brpoplpush(source-key, dest-key, timeout)

方便理解阻塞式(block), 演示如下

阻塞式演示,左为redis-cli,右为python命令行

3. SET

  • Redis 的集合操作以无序的方式来存储多个各不相同的元素,用户可以快速地对集合必行添加元素操作,移除元素操作以及检查一个元素是否存在于集合里。

  • 常用集合命令

命令 redis用例和描述 Python redis库调用
sadd sadd key item [item...] 添加 conn.sadd(key, *items)
srem srem key itme [...] 删除 conn.srem(key, *items)
sismember sismember 检查元素item是否存在于集合key里 conn.sismember(key, item)
scard scard key 返回集合包含的元素的数量 conn.scard(key)
semebers smembers key 返回集合中所包含的所有元素 conn.smembers(key)
srandmember srandmember key [count]从集合里面随机地返回一个或多个元素,当count为正时,命令返回的随机元素不会重复,为负数的时候可能会重复 conn.srandmember(key, count=None)
spop spop key 随机地移除集合中的一个元素,并返回被移除的元素 conn.spop(key)
smove smove source-key dest-key item如果集合source-key包含元素item,那么从集合source-key中移除元素item,并将元素item添加到集合dest-key中;如果item被成功移除,那么命令返回1,否则返回0 conn.smove(source-key dest-key item)
  • 用于组合和处理多个集合的redis命令
命令 redis用例和描述 Python redis库调用
sdiff sdiff key [keys...]返回那些存在于第一个集合、但不存在与其他集合中的元素( conn.sdiff(key, *keys)
sdiffstore sdiffstore dest-key key [keys...]将那些存在于第一个集合但并不存在与其他集合中的元素存储到dest-key键里面 conn.sdiffstore(dest-key, key, *keys)
sinter sinter key [keys...]返回那些同时存在于所有集合中的元素( conn.sinter(key, *keys)
sinterstore sinterstore dest-key key [keys...]交&存储 conn.sinterstore(dest-key, key, *keys)
sunion sunion key [keys...] conn.sunion(key, *keys)
sunionstore sunionstore dest-key key [keys...] 并&存储 conn.sunionstore(dest-key, key, *keys)

4. HASH

  • Redis的散列可以让用户将多个键值对存储到一个Redis键里面。从功能上来说,Redis为散列值提供了一些与字符串值相同的特性,是的散列非常适用于将一些相关数据存储在一起。因此可以吧这种数据聚集看做是关系数据库中行,或者文档数据库中的文档。

  • 用于添加和删除键值对的散列操作

命令 redis用例和描述 Python redis 库调用
hmget hmget key-name key [keys...] 从散列里面获取一个或者多个键的值 hmget(key-name, key [keys...])
hmset hmset key-name key value [keys values ...]为散列里的一个或多个键设置值 hmset(key-name, dict(key=value))
hdel hdel key-name key [keys ...]删除散列里面的一个或多个键值对,返回删除的数量 conn.hdel(key-name, key, [keys...])
hlen hlen key-name 返回散列包含的键值对数量 conn.hlen(key-name)
  • Redis 散列的更高级特性
命令 redis用例和描述 Python redis库调用
hexists hexists key-name key检查给定键是否存在于散列中 conn.hexists('key-name', 'key')
hkeys hkeys key-name 获取散列的所有键 conn.hkeys('key-name')
hvals hvals key-name 获取散列包含的所有值 conn.hvals('key-name')
hgetall hgetall key-name 获取散列包含的所有键值对 conn.hgetall('key-name')
hincrby hincrby key-name key increment 将键key保存的值加上整数increment, 对散列中一个不存在的键执行自增操作时会将键的值当做0来处理 conn.hincrby('key-name', 'key', increment)
hincrbyfloat hincrbyfloat key-name key increment 将键key保存的值加上浮点数increment,若 不存在当做0来处理 conn.hincrbyfloat('key-name', 'key', increment)

-hgetallvs hkeys&hget : 如果散列包含的值非常大,那么用户可以先使用hkeys 取出散列包含的所有键, 然后再使用 hget一个接一个地取出键的值,从而避免因为一次获取多个大体积的值而导致服务器阻塞


5. ZSET

  • 与散列存储键值对类似,有序集合ZSET存储着成员(member)与其分值(score)之间的映射,并提供了分值处理命令,以及根据分值大小有序地获取(fetch) 或扫描(scan) 成员和分值的命令。
命令 redis用例和描述 python redis 库调用
zadd zadd key-name score member [score member ...] 将带有给点分值的成员添加到有序集合里面 conn.zadd('key-name', 'member1', 'score1', 'member2', 'score2') 与redis标准的先输入score后输入member的做法相反
zrem zrem key-name member [member...] 从有序集合里面移除给定的成员,并返回被移除成员的数量 conn.zrem('key-name', 'member')
zcard zcard key-name 返回有序集合包含的成员数量 conn.zcard('key-name')
zincrby zincrby key-name increment member 将member成员的分值加上increment conn.zincrby('key-name', 'member', increment)
zcount zcount key-name min max 返回分值介于min 和 max 之间的成员数量 conn.zcount('key-name', min, max) 获取成员的排名(以0开始)
zrank zrank key-name member 返回成员member 在有序集合中的排名 conn.zrank('key-name', 'member')
zscore zscore key-name member 返回成员member的分值 conn.zscore('key-name', 'member')
zrange zrange key-name start stop [withscores] 返回有序集合中排名介于start和stop之间的成员,如果给定了可选的withscore选项,那么命令会将成员的分值也一并返回 conn.zrange('key-name', start, stop, withscores=True)
zrangebyscore zrangebyscore key min max [withscores] [limit offset count] 获取有序集合中分值介于min和max 之间的所有成员
  • 有序集合的范围型数据获取、删除命令,并集交集命令
描述 命令
逆序命令(从大到小) zrevrank、zrevrange、zrevrangebyscore
删除操作 zremrangebyrank、zremrangebyscore
交并运算 1. zinterstore:zinterstore dest-key key-count key [key ...] [weights weight [weight ...]] [aggregate sum、min、max]
2.zunionstore:zunionstore dest-key key-count key [key ...] [weights weight [weight ...]] [aggregate sum、min、max]
  • 交集和并集运算默认使用聚合函数sum,可以通过 aggregate= sum/min/max 来指定三种不同的聚合函数,通过可选的weights参数来决定个子集合的权重。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容