Redis 的业务应用范围非常广泛,让我们梳理一下,看看 Red is 可以用在哪些
地方。
1. 记录帖子的点赞数、评论数和点击数( hash )。
2 . 记录用户的帖子 ID 列表(排序〉,便于快速显示用户的帖子列表( zset )。
3. 记录帖子的标题、摘要、作者和封面信息 , 用于列表页展示( hash )。
4 . 记录帖子的点赞用户 ID 列表,评论 ID 列表,用于显示和去重计数( zset )。
5 . 缓存近期热帖内容(帖子内窑的空间占用比较大〉,减少数据库压力( hash )。
6 . 记录帖子的相关文章 ID ,根据内容推荐相关帖子 Clist )。
7 . 如果帖子 ID 是整数自增的,可以使用 Redi s 来分配帖子 ID C 计数器)。
8. 收藏集和帖子之间的关系( z
s et )。
9 . 记录热榜帖子 ID 列表、总、热榜和分类热榜( zset )。
10. 缓存用户行为历史,过滤恶意行为( z set 、 hash )。
Redis 有 5 种基础数据结构,分别为 : string C 字符串) 、 list (列表〉 、 hash (字典〉 、
set C 集合)和 zset C 有序集合〉
string需要注意的是字符串最大长度为 512MB ,字符串由多个字节组成,每个字节又由 8 个 bit 组成,如此便可以将一个字符串看成很多bit 的组合,这便是 bitmap (位图)数据结构
list(列表)
Redis 的列表相当于 Java 语言里面的 LinkedList , 注意它是链表而不是数组。这意味着list 的插入和删除操作非常快,时间复杂度为 0(1 ),但是索引定位很慢,时间复杂度为O(n),歹lj表中的每个元素都使用双向指针顺序,串起来可以同时支持前向后向遍历 。当列表弹出了最后一个元素之后,该数据结构被自动删除,内存被回收。Redis 的列表结构常用来做异步队列使用 。 将需要延后处理的任务结构体序列化成字符串,塞进Redis 的列表,另 个线程从这个列表中轮询数据进行处理。
【右边进左边出:队列】
队列是先进先出的数据结构,常用于消息排队和异步逻辑处理,它会确保元素的访问顺序性。rpush books python java golang lpop(先进先出) rpop(先进后出)
慢操作
lindex 相当于 Java 链表的 get(int index) 方法,它需要对链表进行遍历,性能随着参数 index 增大而变差。ltrim有两个参数start_index和end_index定义了一个区间,在这个区间的值,ltrim要保留,区间之外的则统统删除。lrange获取所有元素,O(n)慎用
快速链表
redis底层存储不是一个简单的linkedlist,而是称之为“快速链表”(quicklist)的一个结构。
hash相当于java中的hashmap 数组+链表的数据结构
set(集合)相当于java中的hashset,内部的键值对是无序的、唯一的,内部实现相当于一个特殊的字典,字典中所有的value都是一个值NULL,当集合中的最后一个元素被移除之后,数据结构被自动删除,内存被回收,set结构可以用来 存储在某活动中中奖的用户ID,因为你有去重功能,可以保证同一个用户不会中奖两次。
语法 sadd books java ,smembers books , sismember books java ,scard books, spop books
zset(有序列表)
类似于java的sortedset和hashmap的结合体,一方面是一个set,保证了内部value的唯一性,另一方面可以给每个valuee赋予一个score,代表这个value的排序权重。内部实现用的是一种叫做“跳跃列表”的数据结构。
zset 中最后一个 value 被移除后,数据结构被自动删除 ,内存被回收 。
zset 可以用来存储粉丝列表, value 值是粉丝的用户 ID, score 是关注时间。我们可以对粉丝列表按关注时间进行排序。
zset 还可以用来存储学生的成绩, value 值是学生的 ID, score 是他的考试成绩。我们对成绩按分数进行排序就可以得到他的名次。
容器行数据结构的通用规则
list 、 set 、 hash 、 zset 这四种数据结构是容器型数据结构,它们共享下面两条通
用规则。
1. create if not exists:如果容器不存在,那就创建一个,再进行操作。比如rpush 操作刚开始是没有列表的, Redis 就会自动创建一个,然后再 rpush 进去新元素。
2. drop if no elements:如果容器里的元素没有了,那么立即删除容器,释放内存。这意昧着!pop 操作到最后一个元素,列表就消失了。
过期时间
Redis 所有的数据结构都可以设置过期时间,时间到了, Redis 会自动删除相应的对象。需要注意的是,过期是以对象为单位的,比如一个 hash 结构的过期是整个hash 对象的过期,而不是其中的某个子 key 的过期。还有一个需要特别注意的地方,如果一个字符串已经设置了过期时间,然后你调用 set 方法修改了它,它的过期时间会消失。
原文 https://studygolang.com/articles/22947