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位后面的字符替换成string -
mset [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对应的值,如果不存在,则返回nil -
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 -
incrby [key] [num]
JedisAPI:public Long incrBy(final String key, final long integer)
功能:加指定值 ,key 不存在时候会设置 key,并认为原来的 value 是 0 -
decr [key]
JedisAPI:public Long decr(final String key)
功能:对key的值做的是减1操作,decr 一个不存在 key,则设置 key 为-1 -
decrby [key] [num]
JedisAPI:public Long decrBy(final String key, final long integer)
功能: 对key对应的value减去num -
append [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对应值 + num -
hexists [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对应field -
hkeys [object]
JedisAPI:public Set<String> hkeys(final String key)
功能:返回对象所有field -
hvals [object]
JedisAPI:public List<String> hvals(final String key)
功能:返回对象所有field对应的value -
hgetall [object]
JedisAPI:public Map<String, String> hgetAll(final String key)
功能:返回对象所有field和value
三、列表
Redis构建了自己的链表的实现,其特性如下:
- 双端:链表节点提供有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的前面/后面插入value2 -
lset [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是空或者不存在返回 nil -
lindex [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则失败且返回0 -
srem [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里也存在的元素,返回删除操作后的set1 -
sdiffstore [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则(失败)返回0 -
scard [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,否则返回0 -
srandmember [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,否则返回1 -
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 -
zrem [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为n -
zrank [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的元素的score -
zremrangebyrank [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之间的元素