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之间的元素
    原文作者:yannhuang
    原文地址: https://www.jianshu.com/p/2f4609e0ec6e
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞