摘要:本文内容: 1.Redis服务器保存数据库的方法 2.客户端切换数据库的方法 3.数据库保存键值对的方法 4.数据库的添加,删除,查看,更新操作的实现方法 5.服务器保存键的过期时间的方法 6.服务器自动删除过期键的方法 7.服务器的复制模式 8.数据库通知功能的实现方法 1.服务器中的数据库 1. 阅读全文
posted @ 2019-08-19 21:11 Y先森0.0 阅读(408) 评论(0) 推荐(0) 编辑
摘要:要想了解redis底层的内存管理是如何进行的,直接看源码绝对是一个很好的选择 下面是我添加了详细注释的源码,需要注意的是,为了便于源码分析,我把redis为了弥补平台差异的那部分代码删了,只需要知道有这个东西便好 下面我会贴上两份源码:一份是我自己的,有删减添加了注释的,一部分是原生的,可以做个参考 阅读全文
posted @ 2019-08-15 18:38 Y先森0.0 阅读(189) 评论(0) 推荐(0) 编辑
摘要:背景知识: Redis并没有直接使用sds,双端链表,字典,压缩列表,跳表等这些数据结构来直接实现键值对数据库,而是基于这些对象创建了一个对象系统,这个对象系统包含5个对象:字符串对象,列表对象,哈希对象,集合对象和有序集合对象,字符串对象是唯一会被其他四种对象嵌套的对象 1.我们可以针对不同的使用 阅读全文
posted @ 2019-07-28 13:40 Y先森0.0 阅读(178) 评论(0) 推荐(0) 编辑
摘要:一.压缩列表ziplist在redis中的应用 1.做列表键 当一个列表键只包含少量列表项,并且每个列表项要么是小整数,要么是短字符串,那么redis会使用压缩列表作为列表键的底层实现 2.哈希键 当一个哈希键只包含少量的键值对,并且每个键值对的键和值要么是小整数,要么是短字符串,那么redis会使 阅读全文
posted @ 2019-07-27 09:55 Y先森0.0 阅读(523) 评论(0) 推荐(0) 编辑
摘要:1.整数集合:整数的集合,升序排序,无重复元素 2.整数集合intset是集合键的底层实现之一,当一个集合只包含整数值的元素,并且这个集合的元素数量不多时,redis会使用整数集合作为集合键的底层实现 3.intset可通过属性自定义编码方式(int16_t/int32_t/int64_t) 4.当 阅读全文
posted @ 2019-07-26 11:24 Y先森0.0 阅读(156) 评论(0) 推荐(0) 编辑
摘要:跳跃表的定义 跳跃表是一种有序数据结构,它通过在每个结点中维持多个指向其他结点的指针,从而达到快速访问其他结点的目的 跳跃表的结构 关于跳跃表的学习请参考:https://www.jianshu.com/p/ac351674d8eb?utm_campaign=maleskine&utm_conten 阅读全文
posted @ 2019-07-24 15:36 Y先森0.0 阅读(355) 评论(0) 推荐(0) 编辑
摘要:字典,又叫映射,是一种用于保存键值对的抽象数据结构 划重点:抽象数据结构 Redisd字典使用哈希表作为底层实现,一个哈希表里面可以有多个哈希表结点,而每个哈希表结点就保存了字典中的一个键值对 一.哈希表结构 table数组:存放键值对结点 size:哈希表大小,无符号long型 sizemark: 阅读全文
posted @ 2019-04-25 09:16 Y先森0.0 阅读(594) 评论(0) 推荐(0) 编辑
摘要:Redis底层链表的源码分析: 一.链表结点的结构(单个结点): 该链表为双向链表,由多个listNode结点组成的链表结构图如下: 二.双端链表的结构: 这种链表的封装实现方法可以说说极具特色了,由lsit结构和listNode结点组成的链表结构图如下: 其中封装了3个内置函数 1.dup函数:复 阅读全文
posted @ 2019-04-20 21:46 Y先森0.0 阅读(428) 评论(0) 推荐(0) 编辑
摘要:一.SDS的简单介绍 SDS:简单动态字符串(simple dynamic string) 1)SDS是Redis默认的字符表示,比如包含字符串值的键值对都是在底层由SDS实现的 2)SDS用来保存数据库中的字符串值 3)SDS被用作缓冲区:比如AOF模块的AOF缓冲区,以及客户端状态中的输入缓冲区 阅读全文
posted @ 2019-04-20 10:53 Y先森0.0 阅读(1800) 评论(0) 推荐(0) 编辑
摘要:fetch.go// fetch 输出从url获取的内容package mainimport ( "fmt" "io/ioutil" "net/http" "os")func main() { // 获取屏幕输入的URL for _, url := range os.Args[1:] { resp, err := http.Get(url)// 请求url,获得响应 if (err != ni... 阅读全文
posted @ 2020-03-26 16:52 Y先森0.0 阅读(132) 评论(0) 推荐(0) 编辑
摘要:位置:nginx/src/core/ngx_string.h中typedef struct { size_t len; u_char *data;} ngx_str_t;data指针指向字符串的起始地址len表示字符串的有效长度注意:data指针指向的字符串不会以\0结尾,所以使用时必须根据长度len来使用data成员这样定义的好处是什么?首先,通过储存字符串长度,可... 阅读全文
posted @ 2020-03-25 17:50 Y先森0.0 阅读(207) 评论(0) 推荐(0) 编辑
摘要:位置:nginx/src/core/nginx_config.htypedef intptr_t ngx_int_t;typedef uintptr_t ngx_uint_t;intptr_t和uintptr_t在linux平台的/usr/include/stdint.h头文件中可以找到/* Types for `void *' pointers. */#if __WO... 阅读全文
posted @ 2020-03-25 15:55 Y先森0.0 阅读(212) 评论(0) 推荐(0) 编辑
摘要:目标:通过对nginx.conf文件的配置,对某些ip进行并发限制解决方案:采用nginx内置的limit_conn_zone模块1.当没有进行任何限制时nginx.conf配置文件内容如下:user www www;worker_processes 2; #设置值和CPU核心数一致error_log /usr/local/webserver/nginx/logs/nginx_error.log ... 阅读全文
posted @ 2020-03-23 17:09 Y先森0.0 阅读(445) 评论(0) 推荐(0) 编辑
摘要:1)C++允许内置数据类型之间进行隐式转换,比如char转int,int转double,对于内置数据类型的转换有详细的规则,但不管怎么样,这些都是语言提供的,相对安全,而且我们无法更改对于自定义类的类型,其隐式类型可以通过带单一自变量的构造函数和隐式类型转换操作符来实现2)单一自变量构造函数:指能够以单一自变量成功调用的构造函数,该构造函数可能只有一个参数,也可能有多个参数,并且除了第一个参数外其... 阅读全文
posted @ 2019-10-29 15:28 Y先森0.0 阅读(99) 评论(0) 推荐(1) 编辑
摘要:1)default constructor:在没有任何外来信息的情况下将对象初始化2)但是有些对象如果没有外来信息,就没有办法完成初始化动作,那么这些对象,就没有必要提供default constructor3)如果一个类缺乏default constructor,那么使用这个类的时候会存在一定的限制限制1:产生数组的时候,没有任何一个方法可以为数组中的对象指定constructor自变量。Equ... 阅读全文
posted @ 2019-10-29 10:13 Y先森0.0 阅读(138) 评论(0) 推荐(0) 编辑
摘要:1.在数组与多态混用的情况下,数组元素的访问会出现不可预期的结果(因为数组元素的访问会使用到下标运算)将一个子类对象数组传递给一个父类对象数组声明的函数,编译器会允许这个行为,但是由于子类对象和父类对象的内存结构不同,会导致运行结果异常,因为在这种情况下,编译器仍然假设每一个元素的大小是父类对象元素的大小,但此时实际上每一个元素的大小是子类对象元素的大小#includeusing namespac... 阅读全文
posted @ 2019-10-27 15:51 Y先森0.0 阅读(94) 评论(0) 推荐(0) 编辑
摘要:VS中的程序有两种编译模式:Debug模式和Release模式。Debug通常称为调试版本,通过一系列编译选项的配合,编译结果通常包含调试信息,而且不做任何优化,以为开发人员提供强大的应用程序调试能力。Release通常称为发布版本,是为用户使用的,一般客户不允许在发布版本上进行调试,所以不保存调试信息,同时它往往进行了各种优化,以期达到代码最小和速度最优,为用户的使用提供便利。Debug程序通常... 阅读全文
posted @ 2019-10-18 10:24 Y先森0.0 阅读(962) 评论(0) 推荐(0) 编辑
摘要:C的转型方式存在以下两个缺点:1)几乎允许你将任何类型转化为任何类型,不能精确的指明转型意图,这样很不安全如将一个pointer-to-base-class-object转型为一个pointer-to-derived-class-object(改变一个对象的类型)和将一个pointer-to-const-object转型为一个pointer-to-non-const-object(改变对象的常量性... 阅读全文
posted @ 2019-10-17 18:27 Y先森0.0 阅读(76) 评论(0) 推荐(0) 编辑
摘要:1)操作符的差别 指针使用“*”和“->”操作符,而引用使用“.”操作符2)初始化的差别 有空指针,但是没有空引用,和const对象一样,引用一旦定义就必须和对象绑定(当然char* pc=0;char& rc=*pc;也合法但无意义)由此造成的影响: 2.1)对于指针的向下转型,如果失败则返回空指针,但由于没有空引用的说法,所以对于引用的向下转型如果失败则会抛异常 2.2)由于引用不能为... 阅读全文
posted @ 2019-10-17 10:42 Y先森0.0 阅读(69) 评论(0) 推荐(0) 编辑
Live2D