![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Redis
文章平均质量分 78
Redis学习
韩某人的个人笔记
这个作者很懒,什么都没留下…
展开
-
Redis-单机数据库的实现-数据库
Redis服务器将所有的数据库都保存在服务器状态redisServer结构的db数组中db数组的每一项都是redisDB结构上图片数据库这么多怎么切换?SELECT 数字数据库键空间–以前老见到,就是不理解,现在?哼哼结构typedef struct redisDb { // ... // 数据库键空间,保存着数据库中的所有键值对 dict *dict; // ...} redisDb;举个例子redis> SET message "hello原创 2021-12-21 21:25:15 · 203 阅读 · 0 评论 -
Redis-数据结构与对象-对象
在前面的数个章节里, 我们陆续介绍了 Redis 用到的所有主要数据结构, 比如简单动态字符串(SDS)、双端链表、字典、压缩列表、整数集合, 等等。Redis 并没有直接使用这些数据结构来实现键值对数据库, 而是基于这些数据结构创建了一个对象系统, 这个系统包含字符串对象、列表对象、哈希对象、集合对象和有序集合对象这五种类型的对象, 每种对象都用到了至少一种我们前面所介绍的数据结构。我们可以针对不同的使用场景, 为对象设置多种不同的数据结构实现, 从而优化对象在不同场景下的使用效率。除此之外, Re原创 2021-12-21 20:41:22 · 102 阅读 · 0 评论 -
Redis-数据结构与对象-整数集合
整数集合(intset)是集合键的底层实现之一: 当一个集合只包含整数值元素, 并且这个集合的元素数量不多时, Redis 就会使用整数集合作为集合键的底层实现。wtf ?好麻烦intset 结构表示一个整数集合typedef struct intset { // 编码方式 uint32_t encoding; // 集合包含的元素数量 uint32_t length; // 保存元素的数组 int8_t contents[];} intset原创 2021-12-21 19:11:02 · 68 阅读 · 0 评论 -
Redis-数据结构与对象-跳跃表
跳跃表(skiplist)是一种有序数据结构, 它通过在每个节点中维持多个指向其他节点的指针, 从而达到快速访问节点的目的。跳跃表支持平均 O(\log N) 最坏 O(N) 复杂度的节点查找, 还可以通过顺序性操作来批量处理节点。在大部分情况下, 跳跃表的效率可以和平衡树相媲美, 并且因为跳跃表的实现比平衡树要来得更为简单, 所以有不少程序都使用跳跃表来代替平衡树。Redis 使用跳跃表作为有序集合键的底层实现之一: 如果一个有序集合包含的元素数量比较多, 又或者有序集合中元素的成员(member)原创 2021-12-21 18:55:13 · 455 阅读 · 0 评论 -
Redis-数据结构与对象-字典
字典,emmm,怎么说呢,不是很能理解,我想想哈,一种用于保存键值对的抽象数据结构。Redis数据库底层就是字典实现的,毕竟key-value嘛,对数据库的增删改查操作也是构建在字典之上的。比如redis> SET msg "hello world"OK什么?这不是SDS吗?对,是SDS,但是他们之间的关系呢?key-msg value-" hw ",这个总要保存在字典里吧。怎么实现?Redis 的字典使用哈希表作为底层实现, 一个哈希表里面可以有多个哈希表节点, 而每个哈希表节点就保原创 2021-12-21 17:37:50 · 541 阅读 · 0 评论 -
Redis-数据结构与对象-链表
链表提供了高效的节点重排能力, 以及顺序性的节点访问方式, 并且可以通过增删节点来灵活地调整链表的长度,因为 Redis 使用的 C 语言并没有内置这种数据结构, 所以 Redis 构建了自己的链表实现。链表?emmm,经常做算法题的话简直不能在熟悉了一个Node节点,节点里面有属性,前置节点,后置节点代码typedef struct listNode { // 前置节点 struct listNode *prev; // 后置节点 struct listNode原创 2021-12-21 16:41:12 · 290 阅读 · 0 评论 -
Redis--数据结构与对象-简单动态字符串
redis> SET msg "hello world"OK客户端执行这个命令然后发生什么??Redis 将在数据库中创建了一个新的键值对, 其中:键值对的键是一个字符串对象, 对象的底层实现是一个保存着字符串 “msg” 的 SDS 。键值对的值也是一个字符串对象, 对象的底层实现是一个保存着字符串 “hello world” 的 SDS 。SDS?What is it?官方一点的回答Redis 没有直接使用 C 语言传统的字符串表示(以空字符结尾的字符数组,以下简称 C 字符串)原创 2021-12-21 16:05:12 · 212 阅读 · 0 评论 -
Redis--过期键的删除策略,淘汰策略
众所周知Redis是一个key-value数据库,还经常被当作缓存,当热点数据过期了怎么办?答:删除呗。。怎么删除,删除哪些数据??答:两种删除方式惰性过期:只有当访问一个key时,才会判断该key是否过期,过期则清除,该策略可以最大化的节省CPU资源,却对内存非常不友好。极端情况可能出现大量的过期key没有再次被访问,从而不会被清除,占用大量内存。定时删除在设置键的过期时间的同时,创建一个定时器(timer),让定时器在键的过期时间来临时,立即执行对键的删除操作。对内存是最友好的,保证原创 2021-12-06 16:43:51 · 109 阅读 · 0 评论 -
Redis--持久化
Redis持久化Redis是内存数据库,如果不将内存中的数据库状态保存到磁盘,那么一旦服务器进程退出,服务器中的数据状态也会消失,所以Redis提供了持久化功能1 RDB是什么?原理是redis会单独创建(fork)一个与当前进程一模一样的子进程来进行持久化,这个子进程的所有数据都和原进程一模一样,会先将数据写道一个临时文件中(.rdb),带持久化结束了,再用这个临时文件替换上次持久化,整个过程,主进程不进行任何的io操作,这就确保了极高的性能。配置参数redis.conf配置文件中save原创 2021-12-06 16:27:07 · 928 阅读 · 0 评论 -
Redis--为什么你能这么快?
Redis快速的原因1.redis是基于内存的,内存的读写速度非常快;2.redis是单线程的,省去了很多上下文切换线程的时间;3.redis使用多路复用技术,可以处理并发的连接。非阻塞IO 内部实现采用epoll,采用了epoll+自己实现的简单的事件框架。epoll中的读、写、关闭、连接都转化成了事件,然后利用epoll的多路复用特性,绝不在io上浪费一点时间。为什么Redis是单线程的官方答案因为Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大原创 2021-12-06 12:58:27 · 85 阅读 · 0 评论