自定义博客皮肤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 326

原创 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 2293

原创 redis——客户端

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

2018-09-07 14:32:39 371

原创 redis——事件

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

2018-09-06 17:32:36 525

原创 redis——AOF持久化

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

2018-09-06 12:11:27 782

原创 redis——RDF持久化

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

2018-09-04 16:54:46 1327

原创 redis数据库(CRUD)

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

2018-09-04 14:18:26 1045

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

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

2018-09-03 13:57:40 562

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

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

2018-09-03 11:48:15 373

原创 redis数据结构——对象

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

2018-09-03 10:49:36 367

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

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

2018-09-02 22:42:57 689

原创 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 2062

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

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

2018-09-02 21:18:15 313

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

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

2018-09-02 21:07:50 745

原创 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 2059

原创 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 573

原创 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 312

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

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

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

原创 redis数据结构——SDS

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

2018-08-30 21:39:52 308

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

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

2018-03-15 18:19:01 1974

空空如也

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

TA关注的人

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