转载

redis初探

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
正文到此结束
Loading...