自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(20)
  • 问答 (1)
  • 收藏
  • 关注

原创 实践中验证了spring的单例并不确保线程安全

业务背景:前端传参,通过服务器处理之后,使用feign调用第三方接口,将处理之后的参数传给第三方,第三方返回结果 问题发现:通过分析生产环境的日志,发现同一时刻,不同操作员进行同一操作,原本应该不同的参数(比如操作员id),在传递给第三方时,变成一样的了(并发) 问题解决1:增加相关log打印,发现前端传参没有问题 问题解决2:发现在后端处理过程中只有一个公共对象...

2019-04-12 11:05:29 201

原创 spring cloud框架中使用Feign的重试问题

背景:使用spring cloud框架,在服务A调用服务B时,使用了Feign来进行http调用;Feign使用openfeign\feign-core-10.1.0.jar问题:服务A触发请求一次,服务B收到多次重复请求,造成数据错误过程:查看服务A日志,日志显示,只触发请求一次 查看服务B日志,日志显示,多条重复请求 抓包,发现服务A——>服务B过程中数据包出现多次(重试...

2019-03-06 17:58:51 2017

原创 redis——客户端

来看看客户端的数据结构:typedef struct client { uint64_t id; /* 客户端id */ int fd; /* socket。fd=-1时表示伪客户端 */ redisDb *db; /* 当前的数据库 */ robj *name; ...

2018-09-07 14:32:39 264

原创 redis——事件

redis服务器是一个事件驱动程序,分为两种事件:文件事件和时间事件。时间事件比如AOF写入与同步。在服务器启动时,会触发事件驱动,这里直接来看看实现:int main(int argc, char **argv) { //... aeSetBeforeSleepProc(server.el,beforeSleep); aeSetAfterSleepProc(se...

2018-09-06 17:32:36 332

原创 redis——AOF持久化

redis除了提供RDB持久化之外还提供AOF持久化(append only file),从名字可以看出,这个文件的写入方式是append,即,追加,追加的内容就是每次客户端输入的写命令,例如:来看看在输入这一条命令之后生成的appendonly.aof文件:*2$6SELECT$10*3$3SET$3msg$11hello world这其中除了我们输入的写...

2018-09-06 12:11:27 609

原创 redis——RDF持久化

redis是内存数据库,如果数据没有写入磁盘,一旦服务器挂掉或者进程退出,那么数据也就不见了。redis通过将数据保存到一个RDB文件中来实现持久化。RDB文件是一个经过压缩的二进制文件,保存在硬盘上,这样即便是服务器挂掉或者进程退出,数据也不会丢失。在服务器启动时会载入RDB文件。先来看看创建RDB文件redis提供了两种命令来创建RDB文件:SAVE命令和BGSAVE命令。...

2018-09-04 16:54:46 1089

原创 redis数据库(CRUD)

在server.h中定义了redisServer结构,下面截取其中和数据库有关的两个部分struct redisServer { redisDb *db; /* 数据库数组,所有的数据库都存放在这里 */ int dbnum; /* 数据库总数 */ //...};可以看到,数据库是存放在redisDb结构的数组里的,下面是redisDb的结构/* 数据库...

2018-09-04 14:18:26 756

原创 redis数据结构——快速列表

quicklist.c - A doubly linked list of ziplists通过上面这句话可以了解到,快速列表是由双向压缩链表实现的。先来看看quicklist的结构:typedef struct quicklist { quicklistNode *head; /* 指向头结点 */ quicklistNode *tail; ...

2018-09-03 13:57:40 341

原创 redis数据结构——对象——string对象

首先来看几个例子例1:保存一个long类型的整数值例2:保存一个长度大于32bit的字符串例3:保存一个长度小于等于32bit的字符串以上3个例子,value对象都是string对象,但是它们所对应的encoding各不相同,分别是 “int” 、“raw ”、“embstr”。它们对应的redisOject存储也不相同。下面分别来看看。(这里是看value的存储)...

2018-09-03 11:48:15 285

原创 redis数据结构——对象

redis中的string、hash、list、set、sorted set 都是对象。这五种对象分别由上几篇说到的数据结构实现。与java类似的,在java中有object作为所有对象的基类,指代一切对象;redis中也有redisObject作为以上五种对象的基类。以下是redisObject的结构typedef struct redisObject { unsigned...

2018-09-03 10:49:36 248

原创 redis数据结构——压缩列表

但凡是名称中有“压缩”两个字的,都是为了节约内存。压缩列表也不例外。以下是压缩列表的结构图zlbytes zltail zllen entry1 entry2 ... entryN zlend 说明:属性 类型 长度 用途 zlbytes unit32_t 4bit 记录整个ziplist占用的内存字...

2018-09-02 22:42:57 546

原创 redis中整数聚合的add操作

以下是inset的add操作intset *intsetAdd(intset *is, int64_t value, uint8_t *success) { /* value的字节数 */ uint8_t valenc = _intsetValueEncoding(value); uint32_t pos; if (success) *success = 1;...

2018-09-02 21:50:18 1907

原创 redis数据结构——整数集合

顾名思义,集合中只存在整数,以下是整数集合的结构typedef struct intset { /* 编码方式 */ uint32_t encoding; /* 长度 */ uint32_t length; /* 内容数组 */ int8_t contents[];} intset;在contents数组中,元素按照从小到大的顺序排列...

2018-09-02 21:18:15 220

原创 redis数据结构——跳跃表

跳跃表是一种有序的数据结构,它的平均时间复杂度是O(logN),它通过在一个节点中维护多个指向其他节点的指针,达到快速查找和访问其他节点的目的。在redis中跳跃表只用在实现sorted set和集群节点中。下面来看看跳跃表的结构typedef struct zskiplist { /* 节点指针,分别指向头节点和尾节点 */ struct zskiplistNode *...

2018-09-02 21:07:50 554

原创 redis中字典的add操作(hash算法、rehash)

下面先来看看dict中的dictAdd方法:/* * 三个参数:字典指针、键、值 */int dictAdd(dict *d, void *key, void *val){ /* 新建节点,entry=null */ dictEntry *entry = dictAddRaw(d,key,NULL); /* 如果entry不为null,返回1 */ i...

2018-09-02 20:31:43 1705

原创 redis数据结构——字典

redis的字典底层实现是hash表,用来存储K-V对,其中K是唯一的。了解java中hashmap的话,那么字典就很好理解了,完全可以参照hashmap的结构。下面是hash表的结构:typedef struct dictht { dictEntry **table; /* hash表数组 */ unsigned long size; /* hash表大小 */ ...

2018-08-31 21:34:47 436

原创 redis数据结构——链表

以下是链表的结构:typedef struct list { listNode *head; /* 头指针 */ listNode *tail; /* 尾指针 */ void *(*dup)(void *ptr); /* 节点复制函数 */ void (*free)(void *ptr); /* 节点释放函数 */ int (*match)(void ...

2018-08-30 22:46:43 193

原创 redis中SDS与C语言中字符串的对比

redis并没有直接重用C语言中的字符串,而是自己定义了一个SDS(SDS结构在另一篇文章中)。在存储时,SDS中的buf数组沿用了C语言以空字符串结尾的惯例,方便重用一部分C语言的函数库。那么为什么redis要自己定义一个SDS结构呢?在C语言中,字符串不会记录自己的长度,如果要获取一个字符串的长度,需要遍历整个字符串,并且计数,直到遇见空字符‘\0’为止,此时时间复杂度为O(n)。而S...

2018-08-30 22:29:46 650 1

原创 redis数据结构——SDS

在使用中,redis有五种对象:String、Hash、List、Set、Sorted Set那么他们在底层是怎么实现的呢?最近阅读了《Redis设计与实现》一书,参考此书阅读了Redis源码,现在记录在此。在redis中有以下几种数据结构:SDS、链表、字典、跳跃表、整数集合、压缩列表,它们在不同的条件下实现了redis的五种对象。在这一篇中,记录SDS相关内容。源码来自redis-...

2018-08-30 21:39:52 185

原创 springboot自定义servlet和servlet中的@Autowired问题

今天的需求是外部系统post本系统url,本系统对request进行解析,再response。系统框架是spring cloud。决定用servlet来过滤post请求。spring boot 可以直接在入口类里增加@ServletComponentScan这个注解来实现启动时的servlet加载,如果入口类和自定义servlet类不在同一个包下,需要指定加载时扫描的包路径:@ServletCo...

2018-03-15 18:19:01 1768

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除