Redis(Remote Dictionary Service 远程字典服务)
基础数据结构
Redis所有数据结构都以唯一的key字符作为名称,然后通过这一唯一key值来获取相应的value数据。不同类型的数据结构差异就在于value的结构不一样。
1.String
字符串String是Redis最简单的数据结构,内部结构就是一个字符数组,常见用途就是用来缓存JSON序列化之后的用户信息等数据,取出数据则需要反序列化。Redis的字符串是动态字符串,
是可以修改的,内部结构类似于ArrayList,采用预分配冗余空间的方式减少内存的频繁分配。扩容:当字符串长度小于1MB时,扩容为当前的2倍,如果字符串长度超过1MB时,则扩容一次
只会多扩1MB的空间。
2.list
Redis的列表相当于Linkedlist,是一个链表的结构,这意味着它的插入和删除操作非常快,时间复杂度为O·(1),但是索引定位很慢,时间复杂度最坏为O(n)。
列表中的每个元素都使用双向指针顺序,可以同时支持前向后向遍历,其实它的底层存储并不只是一个单纯的linkedlist,而是一个快速链表的(quicklist)的结构。
业务场景:
队列(先进先出,常用于消息排队和异步逻辑处理,它可以确保元素的访问顺序性)
通过rpush和lpop实现,右进左出
栈(先进后出)
通过rpush和rpop实现,右进右出
3.hash
相当于HashMap,是一个无序结构,在实现结构上也是一个数据+链表的二维结构,不过Redis的值只能是字符串,并且他扩容时候的rehash方式是一个渐进式rehash策略,
它在rehash的同时,保留新旧两个hash结构,查询会同时查询两个hash结构,然后在后续的定时任务以及hash操作指令中,循序渐进的将旧的hash内容一点点迁移到新的
hash结构中。
4.set
相当于HashSet,它内部的键值对是无序的、唯一的。它的内部实现相当于一个特殊的hash,其中所有的value都是一个值null,当集合中最后一个元素被移除之后,数据结构
被自动删除,内存被回收。set结构有去重功能,可以保证用户的唯一性,可以实现一些如保证一个用户不会被选中两次的业务场景。
5.zset
类似于SortedSet和HashMap一方面它是一个set,保证内部value的唯一性,另一方面它可以给每个value赋予一个score,代表它的排序权重,内部是以跳跃列表的数据结构
来实现的。
常见业务场景比如通过value存储用户ID,score是用户评分,可以通过评分排序来得到用户排名。