1.redis是什么
redis是互联网技术领域使用最为广泛的存储中间件,[Remote Dictionary Service]->[远程字典服务],国内外很多大型互联网公司都在使用redis,如Twitter、GitHub、腾讯、阿里、华为等。redis已经成为当下中高级后端开发者绕不开的必备技能。
redis能用来做什么?很多人第一个想到的就是“缓存”,没错,确实是。再然后呢?“分布式锁”,再后来呢,不知道了,确实是不知道了,接下来便来系统的学习理解redis背后的原理和实践经验吧。
2.redis可以做什么?
来源:《redis深度历险核心原理和应用实践》
如掘金技术社区的帖子模块为实例:
①记录帖子的点赞数、评论数和点击数(hash)
②记录用户的帖子ID列表(排序),便于快速显示用户的帖子列表(zset)
③记录帖子的标题、摘要、作者和封面信息,用于列表页展示(hash)
④记录帖子的点赞用户ID列表,评论ID列表,用于显示和去重计数(zset)
⑤缓存近期热帖内容,帖子内容空间占用比较大(hash)
⑥记录帖子的相关文章ID,根据内容推荐相关帖子(list)
⑦记录热榜帖子ID列表,总热榜和分类热榜(zset)
⑧缓存用户行为历史,进行恶意行为过滤(zset,hash)
等等
3.redis基础数据结构
分别是string(字符串)、list(列表)、set(集合)、hash(哈希)和zset(有序集合)
redis所有的数据结构都是以唯一的key字符串作为名称,然后通过这个唯一key值来获取相应的value数据。不同类型的数据结构的差异就在于value的结构不一样。
可以对key设置过期时间,到点自动删除,这个功能常用来控制缓存的失效时间。
①字符串是由多个字节组成,每个字节又是由8个bit组成,如此便可以将一个字符串看成很多bit的组合,这便是bitmap[位图]数据结构
②list相当于是链表而不是数组,意味着插入和删除都是O(1)而索引时间复杂度是O(n),index操作相当于Java里面的get(int index),可以表示负数,index = -1表示倒数第一个元素,index=-2表示倒数第二个元素。
再深入一点,会发现redis底层存储的还不是一个简单的linkedlist,而是快速链表quicklist。首先在列表元素较少的情况下会使用一块连续的内存存储,这个结构是ziplist,也就是压缩列表,它将所有的元素紧挨着一起存储,分配的是一块连续的内存。当数据量比较多的时候才会改成quicklist。之后再说(将链表和ziplist组合起来)
③hash(字典),相当于hashmap,无序字典。内部实现是数据+链表。在rehash的时候和Java的hashmap不一样,Java一次性全部rehash,而redis采用了渐进式rehash策略:保留新旧两个hash结构,查询时会同时查询两个hash结构,然后在后续的定时任务中以及hash的子指令中,循序渐进地将旧hash的内容一点点迁移到新的hash中。
④set(集合),相当于hashset,内部键值对是无序且唯一的。
⑤zset(有序列表),类似于Java的SortedSet和HashMap的结合体。内部实现是【跳表】。
zset可以用来存粉丝列表,value值是粉丝的用户ID,score是关注时间,我们可以对粉丝列表按关注时间进行排序。
跳表类似于层级制,每隔几个元素跳出一个代表,将这几个代表使用另外一级指针穿起来。然后在这些代表里再挑出一些二级代表,串起来。
hash、set和zset移除了最后一个元素之后,该数据结构自动被删除,内存被回收。
容器型数据结构的通用规则(list、set、hash、zset)
1.create if not exists
2.drop if no elements
过期时间:redis所有的数据结构都可以设置过期时间,时间到了,redis会自动删除对应的对象。