1、Redis的五种数据结构

Redis的五种数据结构如下:

  1. String:字符串
  2. Hash:字典
  3. List:列表
  4. Set:集合
  5. Sorted Set:有序集合

下面分别从 原理、redis命令、JedisAPI三个方面简述这五种数据结构

一、字符串

Redis使用C语言编写,但是Redis的字符串并没有直接使用C语言传统的字符串,而是自己构建了一种名为简单动态字符串的抽象类型SDS,其本质是个 byte 数组,可以包含任何数据,是二进制安全的。

SDS与C字符串的区别如下:

  1. 常数复杂度获取字符串长度,因为SDS在len属性中记录了字符串本身的长度。
  1. 杜绝缓冲区溢出,SDS在执行拼接操作的时候,会预先分配好空间。
  2. 减少修改字符串时带来的内存重分配次数
  3. SDS是二进制安全的,因为其内部就是存储一系列二进制数据
  4. 兼容部分C字符串函数

Redis字符串的操作命令和对应的api如下:

  1. set [key] [value]
    JedisAPI:public String set(final String key, final String value)
    功能:设置值
  2. setnx [key] [value]
    JedisAPI:public Long setnx(final String key, final String value)
    功能:如果key存在,返回0并不生效修改
  3. setex [key] [time] [value]
    JedisAPI:public String setex(final String key, final int seconds, final String value)
    功能:指定有效期为time秒
  4. setrange [key] n [string]
    JedisAPI:public Long setrange(final String key, final long offset, final String value)
    功能:将key对应value第n位后面的字符替换成string
  5. mset [key1] [value1] [key2] [value2] ……
    JedisAPI:public Long setnx(final String key, final String value)
    功能:无
  6. msetnx
    JedisAPI:无
    功能:类似setnx,设置多个值,,如果key存在,则返回0且修改不生效
  7. get [key]
    JedisAPI:public String get(final String key)
    功能:获取key对应的值
  8. getset [key] [value]
    JedisAPI:public String getSet(final String key, final String value)
    功能:设置key的值,并返回key的旧值
  9. getrange [key] n1 n2
    JedisAPI:public String getrange(final String key, final long startOffset, final long endOffset)
    功能:获取key对应值的索引位置从n1到n2的字符串
  10. mget [key1] [key2] [key3]……
    JedisAPI:无
    功能:一次获取多个key对应的值,如果不存在,则返回nil
  11. incr [key]
    JedisAPI:public Long incr(final String key)
    功能:对key的值作加1操作,如果incr一个不存在的值,则对q赋值为1,如果key对应值不是int型则返回错误: -ERR value is not an integer or out of range
  12. incrby [key] [num]
    JedisAPI:public Long incrBy(final String key, final long integer)
    功能:加指定值 ,key 不存在时候会设置 key,并认为原来的 value 是 0
  13. decr [key]
    JedisAPI:public Long decr(final String key)
    功能:对key的值做的是减1操作,decr 一个不存在 key,则设置 key 为-1
  14. decrby [key] [num]
    JedisAPI:public Long decrBy(final String key, final long integer)
    功能: 对key对应的value减去num
  15. append [key] [string]
    JedisAPI:public Long append(final String key, final String value)
    功能:将string追加到key对应的值尾,返回新字符串的长度
  16. strlen [key]
    JedisAPI:public Long strlen(final String key)
    功能:读取key对应value的长度

二、字典

Redis使用哈希表作为字典的底层实现,每个字典都有两个哈希表,一个平时使用,另一个仅在进行rehash时使用

哈希表使用链表来解决键冲突问题,被分配到同一个索引上的多个键值对会连接成一个单向链表

Redis字典的操作命令和对应的api如下:

  1. hset [object] [field] [value]
    JedisAPI:public Long hset(final String key, final String field, final String value)
    功能:给object添加属性
  2. hsetnx
    JedisAPI:public Long hsetnx(final String key, final String field, final String value)
    功能:类似hset,如果field已存在,则返回0且修改不生效
  3. hmset [object] [field1] [value1] [field2] [value2]……
    JedisAPI:public String hmset(final String key, final Map<String, String> hash)
    功能:同时设置多个值
  4. hget [object] [field]
    JedisAPI:public String hget(final String key, final String field)
    功能:获取对象对应属性的值
  5. hmget [object] [field1] [field2]
    JedisAPI:public List<String> hmget(final String key, final String... fields)
    功能:获取多个值
  6. hincrby [object] [field]
    JedisAPI:public Long hincrBy(final String key, final String field, final long value)
    功能:num 给field对应值 + num
  7. hexists [object] [field]
    JedisAPI:public Boolean hexists(final String key, final String field)
    功能:判断特定对象指定fiels是否存在
  8. hlen [object]
    JedisAPI: public Long hlen(final String key)
    功能:返回对象属性数量
  9. hdel [object] [field]
    JedisAPI:public Long hdel(final String key, final String... field)
    功能:删除object对应field
  10. hkeys [object]
    JedisAPI:public Set<String> hkeys(final String key)
    功能:返回对象所有field
  11. hvals [object]
    JedisAPI:public List<String> hvals(final String key)
    功能:返回对象所有field对应的value
  12. hgetall [object]
    JedisAPI:public Map<String, String> hgetAll(final String key)
    功能:返回对象所有field和value

三、列表

Redis构建了自己的链表的实现,其特性如下:

  1. 双端:链表节点提供有prev和next对象,获取某个节点的前置节点和下一个节点的速度为O(1).
  1. 无环:表头节点prev对象和表尾节点next对象都指向NULL,链表的访问都是以NULL访问为终点.
  2. 带有表头和表尾对象:通过list结构的head和tail,获取表头和表尾对象的速度为O(1).
  3. 带有长度计数器:获取链表长度的直接读取len字段值.速度为O(1).
  4. 多态:通过dup、free、match三个方法,实现链表的多态,保存不同类型的值

Redis列表的操作命令和对应的api如下:

  1. lpush/rpush [list] [value]
    JedisAPI:public Long lpush/rpush(final String key, final String... string)
    功能:从头/尾部向list添加值,返回list长度
  2. lrange [list] start end
    JedisAPI:public List<String> lrange(final String key, final long start, final long end)
    功能:返回list对应索引区间的值
  3. linsert [list] [before/after] 'value1' 'value2'
    JedisAPI:public Long linsert(final String key, final LIST_POSITION where, final String pivot, final String value)
    功能:在list的value1的前面/后面插入value2
  4. lset [list] index ‘value’
    JedisAPI:public String lset(final String key, final long index, final String value)
    功能:在特定索引插入value,注意:如果index为负值,则从list尾部开始算起
  5. lrem [list] num 'value'
    JedisAPI:public Long lrem(final String key, final long count, final String value)
    功能:从list中删除num个和value相同的值,若num>0,则从链头算起,若<0则从链尾算起,若=0则删除全部
  6. ltrim [list] start end
    JedisAPI:public String ltrim(final String key, final long start, final long end)
    功能:仅保留list中索引从start到end的值
  7. lpop [list]
    JedisAPI:public String lpop(final String key)
    功能:从头部删除元素,同时返回该元素
  8. rpop [list]
    JedisAPI:public String rpop(final String key)
    功能:从尾部删除元素并返回
  9. rpoplpush [list1] [list2]
    JedisAPI:无
    功能:从list1的尾部移除元素并添加到list2的头部,最后返回被移除的元素值,整个操作是原子的.如果list1是空或者不存在返回 nil
  10. lindex [list]
    JedisAPI:public String lindex(final String key, final long index)
    功能:index 返回list中index索引位置的元素
  11. llen [list]
    JedisAPI:public Long llen(final String key)
    功能:返回list的长度

四、集合

Redis 集合是 string 类型的无序集合。set 元素最大可以包含(2 的 32 次方)个元素。set 是通过 hash table 实现的,hash table 会随着添加或者删除自动的调整大小。调整 hash table 大小时候需要同步(获取写锁)会阻塞其他读写操作。

Redis集合的操作命令和对应的api如下:

  1. smembers [set]
    JedisAPI:public Set<String> smembers(final String key)
    功能:查看set中的元素
  2. sadd [set] [value]
    JedisAPI:public Long sadd(final String key, final String... member)
    功能:向set中插入value,成功插入返回1,插入set中已有的value则失败且返回0
  3. srem [set] [value]
    JedisAPI:删除set中对应的value,删除成功返回1,若不存在则返回0
    功能:public Long srem(final String key, final String... member)
  4. spop [set]
    JedisAPI:public String spop(final String key)
    功能:随机删除并返回set中的元素
  5. sdiff [set1] [set2]
    JedisAPI:无
    功能:删除set1中在set2里也存在的元素,返回删除操作后的set1
  6. sdiffstore [set1] [set2] [set3]
    JedisAPI:无
    功能:将sdiff [set2] [set3] 的结果保存在set1中
  7. sinter [set1] [set2]
    JedisAPI:无
    功能:返回set1 set2共有元素
  8. sinterstore [set1] [set2] [set3]
    JedisAPI:无
    功能:将sinter [set2] [set3] 结果保存在set1中
  9. sunion [set1] [set2]
    JedisAPI:无
    功能:返回[set1] [set2]的并集
  10. sunionstore [set1] [set2] [set3]
    JedisAPI:无
    功能:将[set2] [set3]的并集保存在[set1]中
  11. smove [set1] [set2] [value]
    JedisAPI:无
    功能:将[set1] 的value移动到set2中,若value存在于set1,无论set2是否已存在,都(成功)返回1,不存在于set1则(失败)返回0
  12. scard [set]
    JedisAPI:public Long scard(final String key)
    功能:返回set中的元素个数
  13. sismember [set] [value]
    JedisAPI:public Boolean sismember(final String key, final String member)
    功能:判断value是否为set中的元素,是则返回1,否则返回0
  14. srandmember [set]
    JedisAPI:public String srandmember(final String key)
    功能: 随机返回set中的一个元素

五、有序集合

有序集合(sorted set) 在set的基础上增加了一个标识属性,它可以在set添加或修改元素时指定,每次指定,set会自动按标识调整顺序,set的每一个元素都会关联一个double类型的score。使用时往往我们把要排序的字段作为score存储,对象id则作为元素存储

Redis有序集合的操作命令和对应的api如下:

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

推荐阅读更多精彩内容

  • Redis 数据结构简介 Redis 可以存储键与5种不同数据结构类型之间的映射,这5种数据结构类型分别为Stri...
    DreamerRzc阅读 236,689评论 26 273
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,580评论 18 139
  • 一、基本数据类型 注释 单行注释:// 区域注释:/* */ 文档注释:/** */ 数值 对于byte类型而言...
    龙猫小爷阅读 4,253评论 0 16
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,560评论 18 399
  • 网购的一套练字工具到了。这次的是一套可以无限次使用,专用的笔写过后几分钟以后就会了无痕迹,重复使用就算是做到环保了...
    晓晓的窝阅读 485评论 1 3