目录
String
概述:
数据结构:
操作:
List(Redis列表)
简介
数据结构
基本操作:
Set(Redis集合)
简介
数据结构
命令
Hash(Redis哈希)
简介
数据结构
命令
Zset(redis有序集合)
简介
数据结构
跳跃表/跳表(会有单独博客讲解)
命令操作
String
概述:
String是二进制安全的(基本数据类型),(只要用能用二进制表示,都能存),比如jpg图片,或者序列化后的对象,一个string的value最大只能存512M大小的内容。
数据结构:
String的数据结构为简单动态字符串。是可以修改的字符串,内部结构实现上类似于Java的ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配。
如图中所示,内部为当前字符串实际分配的空间capacity -般要高于实际字符串长度len。当字符串长度小于1M时,扩容都是加倍现有的空间,如果超过1M,扩容时一次只会多扩1M的空间。需要注意的是字符串最大长度为512M。
操作:
存储操作:set
重复set统一个key的值会覆盖之前的值。
取值操作: get
追加值:append
在原value上增加内容
不覆盖添加:set
如果已经存在key不允许覆盖,返回0,如果不存在key,添加对应键值对。
数字自增 incr < key>
将储存的数字值自增1,只能对数字值操作,如果为空,新增为1
数字自减decr
将储存的数字值自减1
数字自增 incrby < key> <步长>
将数字增加指定步长
数字减少 decrby < key> <步长>
将数字增加指定步长
注意:incr decr incrby decrby 都是原子操作,这个原子操作在redis中指的是不会被线程调动机制打断。
mset
mget
msetnx
y以上命令原子性,有一个失败则都失败。
setex
getset
List(Redis列表)
简介
单键多值,Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
数据结构
它的底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节
点性能会较差。
他使用的是一种quickList链表,他的特点是
会在表的元素较少的情况下会使用一块连续的内存存储,结构是zipList,也就是压缩链表。他将所有的链表挨着存储,分配的是连续的内存。
只有当元素多的时候会改成quicklist,因为普通的链表需要的附加指针空间太大,会比较浪费空间。比如这个列表里存的只是int类型的数据,结构上还需要两个额外的指针prev和next。quicklist就是把多个ziplist用双向链表形式连接起来。如图:
这样极满足了快速插入和删除的性能,又不会出现太大的空间冗余。
基本操作:
lpush/rpush
lrange
lpop/rpop
值在键在,值光键亡。。
rpoplpush
lindex
llein
linsert
Irem
lset
linsert
Irem
lset
Set(Redis集合)
简介
Redis set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的。还有就是提供了判断是否包含此元素,和java里的功能很相像。Redis的Set是string类型的无序集合。它底层其实是一个value为null的hash表,所以添加,删除,查找的复杂度都是0(1)。
数据结构set的数据结构是dic字典,字典使用hash表实现的,Java中HashSet的内部实现使用的是HashMap ,只不过所有的value都指向同一个对象。Redis的set结构也是一样,它的内部也使用hash结构,所有的value都指向同一个内部值。
命令
sadd
smembers
sismember
scard
spop
sinter
sunion
sdiff
smove
srem
srandmember
Hash(Redis哈希) 简介
redis hash 是一个键对值集合。是一个String类型的filed 和value的映射表,hash特别适合用于存储对象。类似与java里边的Map
数据结构
Hash类型对应的数据结构是两种: ziplist (压缩列表),hashtable (哈希表)。当
field-value长度较短且个数较少时,使用ziplist, 否则使用hashtable. 。
hset
hget
hmset
hexists
hkeys
hvals
hincrby
hsetnx
field不存在
Zset(redis有序集合) 简介
Redis有序集合zset与普通集合set非常相似,是一个没有重复元素的字符串集合。不同之处是有序集合的每个成员都关联了一个评分( score) ,这个评分( score )被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的 ,但是评分可以是重复了。因为元素是有序的,所以你也可以很快的根据评分( score )或者次序( position )来获取一个范围的元素。访问有序集合的中间元素也是非常快的,因此你能够使用有序集合作为一个没有重复成员的智能列表。
数据结构SortedSet (zset)是Redis提供的一个非常特别的数据结构, 一方面它等价于Java的数据结构Map
zset底层使用了两个数据结构。
(1) hash , hash的作用就是关联元素value和权重score ,保障元素value的唯一性,可以通过元素value找到相应的score值。
(2)跳跃表,跳跃表的目的在于给元素value排序,根据score的范围获取元素列表。
跳跃表/跳表(会有单独博客讲解)
简介:有序集合在生活中比较常见,例如根据成绩对学生排名,根据得分对玩家排名等。对于有序集合的底层实现,可以用数组、平衡树、链表等。数组不便元素的插入、删除;平衡树或红黑树虽然效率高但结构复杂;链表查询需要遍历所有效率低。Redis采用的是跳跃表。跳跃表效率堪比红黑树,实现远比红黑树简单。
命令操作
zadd
zrange
带WITHSCORES ,可以让分数-起和值返回到结果集。
zrangebyscore key [withscores] [imit offset count] 返回有序集key中,所有score 值介于min和max之间(包括等于min或max )的成员,有序集成员按score值递增(从小到大)次序排列。。
zrevrangebyscore key [withscores] [imit offset count] 同上,改为从大到小排列。
zincrby
zrem
zcount
zrank



