转自:https://www.jianshu.com/p/2f4609e0ec6e
Redis的五种数据结构如下:
String:字符串Hash:字典List:列表Set:集合Sorted Set:有序集合下面分别从 原理、redis命令、JedisAPI三个方面简述这五种数据结构
Redis使用C语言编写,但是Redis的字符串并没有直接使用C语言传统的字符串,而是自己构建了一种名为简单动态字符串的抽象类型SDS,其本质是个 byte 数组,可以包含任何数据,是二进制安全的。
SDS与C字符串的区别如下:
常数复杂度获取字符串长度,因为SDS在len属性中记录了字符串本身的长度。 杜绝缓冲区溢出,SDS在执行拼接操作的时候,会预先分配好空间。减少修改字符串时带来的内存重分配次数SDS是二进制安全的,因为其内部就是存储一系列二进制数据兼容部分C字符串函数Redis字符串的操作命令和对应的api如下:
set [key] [value] JedisAPI:public String set(final String key, final String value) 功能:设置值setnx [key] [value] JedisAPI:public Long setnx(final String key, final String value) 功能:如果key存在,返回0并不生效修改setex [key] [time] [value] JedisAPI:public String setex(final String key, final int seconds, final String value) 功能:指定有效期为time秒setrange [key] n [string] JedisAPI:public Long setrange(final String key, final long offset, final String value) 功能:将key对应value第n位后面的字符替换成stringmset [key1] [value1] [key2] [value2] …… JedisAPI:public Long setnx(final String key, final String value) 功能:无msetnx JedisAPI:无 功能:类似setnx,设置多个值,,如果key存在,则返回0且修改不生效get [key] JedisAPI:public String get(final String key) 功能:获取key对应的值getset [key] [value] JedisAPI:public String getSet(final String key, final String value) 功能:设置key的值,并返回key的旧值getrange [key] n1 n2 JedisAPI:public String getrange(final String key, final long startOffset, final long endOffset) 功能:获取key对应值的索引位置从n1到n2的字符串mget [key1] [key2] [key3]…… JedisAPI:无 功能:一次获取多个key对应的值,如果不存在,则返回nilincr [key] JedisAPI:public Long incr(final String key) 功能:对key的值作加1操作,如果incr一个不存在的值,则对q赋值为1,如果key对应值不是int型则返回错误: -ERR value is not an integer or out of rangeincrby [key] [num] JedisAPI:public Long incrBy(final String key, final long integer) 功能:加指定值 ,key 不存在时候会设置 key,并认为原来的 value 是 0decr [key] JedisAPI:public Long decr(final String key) 功能:对key的值做的是减1操作,decr 一个不存在 key,则设置 key 为-1decrby [key] [num] JedisAPI:public Long decrBy(final String key, final long integer) 功能: 对key对应的value减去numappend [key] [string] JedisAPI:public Long append(final String key, final String value) 功能:将string追加到key对应的值尾,返回新字符串的长度strlen [key] JedisAPI:public Long strlen(final String key) 功能:读取key对应value的长度Redis使用哈希表作为字典的底层实现,每个字典都有两个哈希表,一个平时使用,另一个仅在进行rehash时使用
哈希表使用链表来解决键冲突问题,被分配到同一个索引上的多个键值对会连接成一个单向链表
Redis字典的操作命令和对应的api如下:
hset [object] [field] [value] JedisAPI:public Long hset(final String key, final String field, final String value) 功能:给object添加属性hsetnx JedisAPI:public Long hsetnx(final String key, final String field, final String value) 功能:类似hset,如果field已存在,则返回0且修改不生效hmset [object] [field1] [value1] [field2] [value2]…… JedisAPI:public String hmset(final String key, final Map<String, String> hash) 功能:同时设置多个值hget [object] [field] JedisAPI:public String hget(final String key, final String field) 功能:获取对象对应属性的值hmget [object] [field1] [field2] JedisAPI:public List<String> hmget(final String key, final String... fields) 功能:获取多个值hincrby [object] [field] JedisAPI:public Long hincrBy(final String key, final String field, final long value) 功能:num 给field对应值 + numhexists [object] [field] JedisAPI:public Boolean hexists(final String key, final String field) 功能:判断特定对象指定fiels是否存在hlen [object] JedisAPI: public Long hlen(final String key) 功能:返回对象属性数量hdel [object] [field] JedisAPI:public Long hdel(final String key, final String... field) 功能:删除object对应fieldhkeys [object] JedisAPI:public Set<String> hkeys(final String key) 功能:返回对象所有fieldhvals [object] JedisAPI:public List<String> hvals(final String key) 功能:返回对象所有field对应的valuehgetall [object] JedisAPI:public Map<String, String> hgetAll(final String key) 功能:返回对象所有field和valueRedis构建了自己的链表的实现,其特性如下:
双端:链表节点提供有prev和next对象,获取某个节点的前置节点和下一个节点的速度为O(1). 无环:表头节点prev对象和表尾节点next对象都指向NULL,链表的访问都是以NULL访问为终点.带有表头和表尾对象:通过list结构的head和tail,获取表头和表尾对象的速度为O(1).带有长度计数器:获取链表长度的直接读取len字段值.速度为O(1).多态:通过dup、free、match三个方法,实现链表的多态,保存不同类型的值Redis列表的操作命令和对应的api如下:
lpush/rpush [list] [value] JedisAPI:public Long lpush/rpush(final String key, final String... string) 功能:从头/尾部向list添加值,返回list长度lrange [list] start end JedisAPI:public List<String> lrange(final String key, final long start, final long end) 功能:返回list对应索引区间的值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的前面/后面插入value2lset [list] index ‘value’ JedisAPI:public String lset(final String key, final long index, final String value) 功能:在特定索引插入value,注意:如果index为负值,则从list尾部开始算起lrem [list] num 'value' JedisAPI:public Long lrem(final String key, final long count, final String value) 功能:从list中删除num个和value相同的值,若num>0,则从链头算起,若<0则从链尾算起,若=0则删除全部ltrim [list] start end JedisAPI:public String ltrim(final String key, final long start, final long end) 功能:仅保留list中索引从start到end的值lpop [list] JedisAPI:public String lpop(final String key) 功能:从头部删除元素,同时返回该元素rpop [list] JedisAPI:public String rpop(final String key) 功能:从尾部删除元素并返回rpoplpush [list1] [list2] JedisAPI:无 功能:从list1的尾部移除元素并添加到list2的头部,最后返回被移除的元素值,整个操作是原子的.如果list1是空或者不存在返回 nillindex [list] JedisAPI:public String lindex(final String key, final long index) 功能:index 返回list中index索引位置的元素llen [list] JedisAPI:public Long llen(final String key) 功能:返回list的长度Redis 集合是 string 类型的无序集合。set 元素最大可以包含(2 的 32 次方)个元素。set 是通过 hash table 实现的,hash table 会随着添加或者删除自动的调整大小。调整 hash table 大小时候需要同步(获取写锁)会阻塞其他读写操作。
Redis集合的操作命令和对应的api如下:
smembers [set] JedisAPI:public Set<String> smembers(final String key) 功能:查看set中的元素sadd [set] [value] JedisAPI:public Long sadd(final String key, final String... member) 功能:向set中插入value,成功插入返回1,插入set中已有的value则失败且返回0srem [set] [value] JedisAPI:删除set中对应的value,删除成功返回1,若不存在则返回0 功能:public Long srem(final String key, final String... member)spop [set] JedisAPI:public String spop(final String key) 功能:随机删除并返回set中的元素sdiff [set1] [set2] JedisAPI:无 功能:删除set1中在set2里也存在的元素,返回删除操作后的set1sdiffstore [set1] [set2] [set3] JedisAPI:无 功能:将sdiff [set2] [set3] 的结果保存在set1中sinter [set1] [set2] JedisAPI:无 功能:返回set1 set2共有元素sinterstore [set1] [set2] [set3] JedisAPI:无 功能:将sinter [set2] [set3] 结果保存在set1中sunion [set1] [set2] JedisAPI:无 功能:返回[set1] [set2]的并集sunionstore [set1] [set2] [set3] JedisAPI:无 功能:将[set2] [set3]的并集保存在[set1]中smove [set1] [set2] [value] JedisAPI:无 功能:将[set1] 的value移动到set2中,若value存在于set1,无论set2是否已存在,都(成功)返回1,不存在于set1则(失败)返回0scard [set] JedisAPI:public Long scard(final String key) 功能:返回set中的元素个数sismember [set] [value] JedisAPI:public Boolean sismember(final String key, final String member) 功能:判断value是否为set中的元素,是则返回1,否则返回0srandmember [set] JedisAPI:public String srandmember(final String key) 功能: 随机返回set中的一个元素有序集合(sorted set) 在set的基础上增加了一个标识属性,它可以在set添加或修改元素时指定,每次指定,set会自动按标识调整顺序,set的每一个元素都会关联一个double类型的score。使用时往往我们把要排序的字段作为score存储,对象id则作为元素存储
Redis有序集合的操作命令和对应的api如下:
zadd [zset] sco 'value' JedisAPI:public Long zadd(final String key, final double score, final String member) 功能:向zset中添加score为sco的value,如果value已存在,则仅修改score,同时返回0,否则返回1zrange/zrangebyscore [zset] start end (wisthscores) JedisAPI:public Set<String> zrange(final String key, final long start, final long end) 功能:返回zset中从索引start到end的元素,withscores可选是否同时显示元素对应的scorezrem [zset] 'value' JedisAPI:public Long zrem(final String key, final String... member) 功能: 删除zset中值为value的元素zincrby [zset] n 'value' JedisAPI:public Double zincrby(final String key, final double score, final String member) 功能:如果zset中存在value,则令其score加n,否则添加value,令其score为nzrank [zset] 'value' JedisAPI:public Long zrank(final String key, final String member) 功能:返回zset中值为value的元素排名(按score从小到大)zrevrank [zset] 'value' JedisAPI:public Long zrevrank(final String key, final String member) 功能:按score从大到小返回元素排名zrevrange [zset] start end JedisAPI:public Set<String> zrevrange(final String key, final long start, final long end) 功能:返回zset[end…start]zcount [zset] start end JedisAPI:public Long zcount(final String key, final double min, final double max) 功能:返回zset在指定区间的数量zcard [zset] JedisAPI:public Long zcard(final String key) 功能:返回zset中元素的个数zscore [zset] 'value' JedisAPI:public Double zscore(final String key, final String member) 功能:返回值为value的元素的scorezremrangebyrank [zset] start end JedisAPI:public Long zremrangeByRank(final String key, final long start, final long end) 功能:删除zset按score从小到大排序索引从start到end的元素。zremrangebyscore [zset] score1 score2 JedisAPI:public Long zremrangeByScore(final String key, final double start, final double end) 功能:删除zset中score在score1到score2之间的元素