Redis支持的五种常见数据结构

strings字符串
  • APPEND key value
    如果key存在,并且值为字符串,name这个命令会把value追加到原来的(value)结尾;
    如果key不存在,那么这个命令将创建一个空字符串的key,再执行追加操作。(类似set操作)
redis>append user:1 user1
(integer) 14 返回的值时追加字符串值(value)的长度
  • BITCOUNT key [start end]
    统计字符串被设置为1的bit数
    内存计算:单位换算8BIT = 1B;1024B = 1MB
    start表示开始位置 1 byte = 8bit
    end表示结束位置 1byte = 8bit
bitcount key 0 0
统计key的字符串被设置的二进制位1的bit数0~7位置
bitcount key 0 1
0~15位置上bit为1的个数
bitcount key 1 1
8~15位置上bit为1的个数
依此类推..
  • GETBIT key offset
    返回key对应的string在offset位置处的bit值;
    当offset超出字符串长度的位置时,使用0bit进行填充,返回0;
    当key不存在,offset返回的值为0

  • SETBIT key offset value
    设置或者清空key的value值,在offset位置处的bit值;
    value只能是0/1;
    返回值:offset位置处旧的值

  • DECR key (记忆法则:decrease-减少)
    对key对应的数值做减1操作;
    如果key不存在,操作时key的值被置为0;
    如果key的value类型报错,就返回错误;
    返回结果:减少之后的value值;

  • DECRBY key decrement
    将key对应的数值减少decrement。
    如果key不存在,操作时候key的值会被置为0;
    如果key的value类型错误,就返回错误;
    返回结果:减少之后的value值;

  • GET key
    返回key的value。
    如果key不存在,返回特殊值nil;
    如果 key的value不是string,就返回错误;

  • GETRANGE key start end (记忆法则:range-范围)
    返回key对应的value字符串,范围由start和end决定;
    start:0表示索引为0,正数索引从1开始,负数表示从最后一位开始
    end:-1表示结束位置到右边末尾

  • GETSET key value
    将key的值设置为value;
    返回结果是旧的key对应的value值;

  • INCR key (记忆法则:increase-增加)
    将对应的key的值执行原子加1操作;
    返回结果,value加1后的值

  • INCRBY key increment
    将对应的key执行原子增加一个increment值
    返回结果,value加increment的结果

  • INCRBYFLOAT key increment
    执行原子增加一个浮点数

  • MGET key [key...] ("[]"括号中的为可选项)
    获取所有key的值

  • MSET key value [key value...]
    设置多个key value的值

  • MSETNX key value [key value...]
    设置多个key value,当key存在,则set不成功
    当key不存在,则set成功

  • PSETEX key milliseconds value
    设置key value的值并且设置过期时间;
    milliseconds 以毫秒为单位

  • SET key value [EX seconds] [PX milliseconds] [NX|XX]
    设置key value的值

  • SETEX key seconds value
    设置key-value并设置过期时间(单位秒)

  • SETNX key value
    设置key value值,当key不存在时设置成功

  • STRLEN key
    获取key的指定长度

模拟打卡案例

redis> setbit user:1 0 1      用户1  第一天  打卡
redis> setbit user:1 1 1      用户1  第二天  打卡
redis> setbit user:1 2 1      用户1  第三天  打卡
redis> setbit user:1 3 1      用户1  第四天  打卡
redis> setbit user:1 4 0      用户1  第五天  未打卡
redis> getbit user:1 0        获取用户1  第一天   是否打卡=打卡
redis> getbit user:1 4        获取用户1  第五天   是否打卡=未打卡
redis> bitcount user:1        获取用户1  总打卡次数   4次
redis> bitcount user:1 0 0    获取用户1  1~8天  是否打卡总次数  4次
redis> bitcount user:1 1 1    获取用户1  8~16天  是否打卡总次数 0次 
lists列表
  • LPUSH key value [value ...]
    将所有指定的值插入到存储于key的列表的头部;
    如果key不存在,push操作前会创建一个空列表;
    注意多个value值依次按顺序插入列表的头部中;
    返回值:在push操作后的list长度

  • RPUSH key value [value ...]
    将所有指定的值插入到存储于key的列表的尾部;
    如果key不存在,push操作前会创建一个空列表;
    注意多个value值依次按顺序插入列表的尾部中;
    返回值:在push操作后的list长度

  • LRANGE key start stop
    返回存储在key的列表中指定范围内的元素;
    start和stop偏移基于0下标,第一个元素下标为0,第二个元素下标为1,以此类推;
    偏移可以为负数,最后一个元素下标为-1,倒数第二个元素小标为-2,以此类推;
    返回值:指定范围里的列表元素

  • LTRIM key start stop
    剪切一个已经存在的list,这样list就会只包含指定范围的指定元素;
    start和stop索引从0开始,范围包含start和stop的索引值;

  • LLEN key
    返回key中的list的长度;
    如果key不存在,那么就被看做空list,返回长度0;
    如果key不是一个list,返回错误;

  • LPOP key
    从key对应的list列表头部移除第一个元素;
    返回值:被移除的元素的值;

  • RPOP key
    从key对应的list列表尾部移除第一个元素;
    返回值:被移除的元素的值;

  • BLPOP key [key ...] timeout
    阻塞式从key对应的list列表中头部删除第一个元素;
    timeout:0表示一直等待,整数1~无穷大以为单位等待;
    返回结果:删除的列表key,及key对应列表中被删除的的元素值;
    阻塞时间只有等待才会返回阻塞时间;

  • BRPOP key [key ...] timeout
    阻塞式从key对应的list列表中尾部删除第一个元素;

  • BRPOPLPUSH source destination timeout
    阻塞式弹出一个列表的值,并将这个值推到另一个列表中;
    source:表示要从那个key对应的列表中尾部删除一个元素;
    destination:表示从那个key对应的列表中头部插入一个source中被删除的元素;
    timeout:预期的超时时间;

  • LINDEX key index
    获取一个元素,通过index索引获取对应位置元素值;

  • LINSERT key before|after pivot value
    将value的值插入到key对应的列表元素pivot的before|after;
    返回值:经过插入操作后的list的长度值;

  • LREM key count value
    移除key列表中value的值;
    count > 0:从头部往尾部移除count个value的元素
    count < 0:从未往头部移除值为count个value的元素
    count = 0:移除所有值为value的元素

  • LSET key index value
    给key对应的list列表的index位置设置value值;

  • RPOPLPUSH source destination
    移除source列表尾部第一个元素,并将移除的值添加到destination列表的头部的第一个元素;

点赞帖子案例

redis> set user:1:post:1 'hello redis' 创建用户1 帖子1 内容
redis> lpush post:1:good 'friend1'     帖子1 被好友1 点赞
redis> lpush post:1:good 'friend2'     帖子1 被好友2 点赞
redis> lpush post:1:good 'friend3'     帖子1 被好友3 点赞
redis> llen post:1:good                帖子1 被点赞次数
redis> lrange post:1:good 0 2          帖子1 被那些好友点赞 start stop控制范围

回帖案例

redis> set user:1:post:2 'wohenshuai'   创建一个帖子2
redis> set postreply:1 'nonono'         创建一个回帖1
redis> set postreply:2 'hehe'           创建一个回帖2
redis> lpush post:2:replies 1           回帖1 和 帖子2关联
redis> lpush post:2:replies 2           回帖2 和 帖子2关联
redis> lrange post:2:replies 0 -1       查看帖子2的回帖
redis> get postreply:1                  查看回帖1 内容
redis> get postreply:2                  查看回帖2 内容
sets集合
  • SADD key member [member]
    添加一个或多个指定的member元素的集合到key中;
    如果member有重复的值,那么如果存入一个,另外的直接被忽略;
    返回值是新添加到集合中的元素个数,不包括重复已存在的;

  • SREM key member [member ...]
    在key集合中移除指定的元素
    返回值:在key集合中被移除的元素个数

  • SISMEMBER key member
    判断member值在key集合中是否存在;
    返回值:存在/不存在 返回1/返回0

  • SMEMBERS key
    获取key集合中所有的元素;
    返回值:key集合中所有的元素,以list方式返回;

  • SCARD key (记忆法则:cardinal-基数)
    获取key集合的存储的基数(集合元素的数量)

  • SRANDMEMBER key [count]
    随机返回key集合中count个元素

  • SUNION key [key ...]
    返回给定的多个集合的并集中的所有元素;

  • SINTER key [key ...] (记忆法则:intersection-交集)
    返回指定所有的集合的元素的交集

  • SINTERSTORE destination key [key ...] (记忆法则:intersection-交集;store-存储)
    获取key集合的元素交集,并将交集的元素存储到destination集合中;

  • SDIFF key [key ...]
    返回一个集合与给定集合没有的元素

  • SDIFFSTORE destination key [key ...]
    第一个集合中去除后面集合中的元素,并返回一个新的集合;
    将新的集合元素存储到destination集合元素中

抽奖案例

初始化抽奖用户池:
redis>sadd luckdraws 'stef1' 'stef2' 'stef3' 'stef4' 'stef5' 'stef6' 'stef7' 'stef8' 'stef9' 'stef10' 'stef11' 'stef12'
redis>srandmember luckdraws 3          抽3个三等奖
redis>srem 'stef5' 'stef4' 'stef11'    移除中三等奖用户
redis>srandmember luckdraws 2          抽2个二等奖
redis>srem luckdraws 'stef9' 'stef7'   移除中二等奖用户
redis>srandmember luckdraws 1          抽1个一等奖

好友推荐可能认识的人案例

初始化好友用户组
redis>sadd user:1:friends 'user:2' 'user:3' 'user:5'
redis>sadd user:2:friends 'user:1' 'user:3' 'user:6'
redis>sadd user:3:friends 'user:1' 'user:7' 'user:8'
给user1推荐可能认识的好友
redis>sunionstore user:1:groups user:1:friends user:2:friends user:3:friends     对用户好友组进行组合
redis>sdiffstore ret:users user:1:groups user:1:friends   去除用户1中已经存在的好友
redis>srem ret:users 'user:1'     推荐好友中删除用户1自己
redis>srandmember ret:users 2     推荐好友中随机推荐2个给用户1
sorted sets有序集

SET是一种非常方法的结构,但是数据无序,redis提供了一个sorted set,每一个添加的值都有一个对应的分数,可以通过这个分数进行排序

  • ZADD key [NX|XX] [CH] [INCR] score member [score member ...]
    添加到有序的set集合,key集合存储分数和成员;
    NX:不更新存在的成员,只添加新成员;
    XX:仅仅更新存在的成员,不添加新成员;
    CH:修改返回值为发生变化的成员总数,原始的返回新添加成员的总数。
    INCR:当ZADD指定这个选项时,成员的操作就等同zincrby命令,并对成员的分数进行递增操作;
  • ZRANGE key start stop [withscores]
    指定全包含的区间start和stop的key的集合元素,配置withscores,返回的集合包含分数;

  • ZCOUNT key min max
    获取指定key集合分数范围在min~max内的成员数量;

  • ZRANK key member
    获取指定key集合成员中的排列等级(排列的索引)

  • ZREVRANGE key start stop [WITHSCORES]
    获取指定范围区间start~stop在key集合元素中的成员,并且分数以递减方式进行排序的元素列表;
    配置withscores参数,列表中带有分数参数;

  • ZINCRBY key increment member
    设置key集合中member成员增加increment评分值;

游戏天梯排名

redis> zadd ladder 100 'stefE' 99 'stefA' 98 'stefB' 97 'stefD' 96 'stefC'        添加初始化天梯排名
redis> zrevrank ladder stefA        查询stefA在天梯的排名
redis> zrevrange ladder 0 2        查询天梯前三名
redis> zincrby ladder 20 'stefB'        stefB增加20等级
hashes散列

hashes可以理解为一个map,这个map由一对一的字段和值组成;
一般可以使用hashes来保存一个对象;

  • HSET key field value
    给key设置一个field和value的键值对;
    返回值:
    1:field是一个新的字段;
    0:field原来在map里面已经存在;

  • HGET key field
    获取key的map中的该字段所关联的值

  • HMSET key field value [field value]
    设置key的map中的多个字段和值;

  • HMGET key field [field ...]
    获取key的map中的多个field字段的值;

  • HGETALL key
    获取key的map中的所有的字段和值;
    返回值:字段名和值的list集合;

  • HINCRBY key field increment
    给指定的key的map的指定field字段的值增加increment;

  • HKEYS key
    获取指定key中的字段的名称的list集合;

  • HDEL key field [field ...]
    删除指定key的map中的指定的field字段(包含字段的值)

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

推荐阅读更多精彩内容

  • Redis的五种数据结构如下: String:字符串 Hash:字典 List:列表 Set:集合 Sorted ...
    yannhuang阅读 5,125评论 0 2
  • 本文主要介绍 Redis 常用的基本操作命令和数据类型操作命令,也就是 Redis 的基本使用。通过学习本文,应该...
    江城子Leon阅读 554评论 0 0
  • Key(键) 1. DEL 时间复杂度:O(N), N 为被删除的 key 的数量。删除单个字符串类型的 key...
    one_zheng阅读 534评论 0 0
  • 下了高速,罗芸竟不知朝哪个方向了,近十年没有回湖县了,湖县已经变得不再是罗芸记忆里的模样了。 那年父母几乎花光了所...
    筱苇vivi阅读 115评论 0 0
  • 夕阳西下白鹭归 浅摇羽扇念卿回 落红流水愁相对 杨柳青青碧波碎 黄花知倦蝶厌飞 怀旧愿为陈香醉
    秋之枫叶阅读 242评论 0 0