文章列表

1.4k 1 分钟

假设有以下表结构: CREATE TABLE test ( id INT NOT NULL, last_name CHAR(30) NOT NULL, first_name CHAR(30) NOT NULL, PRIMARY KEY (id), INDEX name (last_name,first_name) ); 索引 name 是 last_name 列和 first_name 列组合的索引,该索引既可以用于查询 last_name 和 first_name 的组合条件,也可以用于单独查询 last_name。 SELECT * FROM test WHERE...
1.6k 1 分钟

EXPLAIN 语句提供有关 MySQL 如何执行语句的信息,适用于 SELECT 、 DELETE 、 INSERT 、 REPLACE 和 UPDATE 语句。 执行后返回以下信息: Column 柱子 JSON Name JSON 名称 Meaning 意义 id select_id The SELECT identifier SELECT 标识符 select_type None 没有任何 The SELECT type SELECT 类型 table table_name The table for the output row <br>...
4.4k 4 分钟

顾名思义,整数集合,Set 的底层数据结构实现之一,另外一种实现是 hashtable。 实际上 intset 是一个有序数组,通过二分查找快速判断一个元素是否属于这个集合,但是为了保证有序性,插入的时候也会先二分查找找到对应的插入位置,将插入位置之后的元素统一向后移动一个位置,redis 使用了该结构来降低内存使用率,时间换空间。 # intset 的结构 typedef struct intset { uint32_t encoding; uint32_t length; int8_t contents[]; }...
3.8k 3 分钟

跳跃表(skiplist)是一种随机化的数据, 由 William Pugh 在论文《Skip lists: a probabilistic alternative to balanced trees》中提出, 跳跃表以有序的方式在层次化的链表中保存元素, 效率和平衡树媲美 —— 查找、删除、添加等操作都可以在对数期望时间下完成, 并且比起平衡树来说, 跳跃表的实现要简单直观得多。 # redis 中的 skiplist 结构 /* ZSETs use a specialized version of Skiplists */ typedef struct zskiplistNode...
3.5k 3 分钟

文章以 redis 5.0 版本的源码作为基础,高版本可能有所不同 redis 中的 dict 其实与 java 中的 map 实现大差不差,都是基于哈希表实现,使用拉链法解决哈希冲突的问题,在达到装载因子预订值时自动扩展内存(重哈希)。 # dict 的结构 dict 总体结构图: typedef struct dict { dictType *type; void *privdata; dictht ht[2]; long rehashidx; /* rehashing not in progress if rehashidx == -1 */ unsigned...
3k 3 分钟

# 描述: redis 官方描述 (ziplist.c): ziplist 是一种特殊编码的双链表,设计上非常节省内存。它既能存储字符串,也能存储整数值,其中整数被编码为实际整数,而不是一系列字符。它允许以 O (1) 的时间在列表的两边进行推送和弹出操作。不过,由于每次操作都需要重新分配 ziplist 使用的内存,因此实际复杂度与 ziplist 使用的内存量有关。 # Ziplist 的结构 ziplist 的一般布局如下: <zlbytes> <zltail> <zllen>...
1.1k 1 分钟

# 起因 排查一个 N 多年前的项目的 bug,听描述就是微信公众号推送消息的代码有问题,不过之前没对接过,说实话还不知道具体流程,死马当活马医了。 # BUG1 先进服务器看下日志,直接就看到一个形如栈溢出的异常,不过最后抛出的不是 StackOverflow,好像是空指针之类的异常,于是把代码拉下来看了眼,果不其然 只能说这写的是真的神秘,咱也不知道当时到底是什么需求,会导致这样的代码,听说这 jsticket 反正也不用了,干脆就给注释了。 然后跑了一下发现还是不通,于是就去试了下 api,结果发现限额用光了,换了个 key,bug1 解决。 # BUG2 刚解决完一个...
12k 11 分钟

#SpringBoot #Vue #CAS #单点登录 #前后端分离 # 前言 因为组里来了新的前端,所以新开的项目就都准备用前后端分离的方式来做,原本还挺爽的,只用写自己接口就完事了,但是到了对接甲方 CAS 的时候就出了问题。 # CAS 认证流程 官网给出的认证流程如下, TGC,TGT,ST 之类的概念就不说了,网上一搜一大堆,简单来说就是访问网站后没登陆就跳到 cas 认证中心,登录完会在浏览器存一个 cookie 叫 TGC(用来标识你登陆过了,以及后续获取 ticket),跳转到你的服务上,并且 url 后面会携带一个 ticket,也就是 ST,client...
4.1k 4 分钟

这几天写项目,有分页需求,每个接口上定义一次参数有点麻烦,就想到 RuoYi 写了个 getPageDomain 的静态方法,其原理是直接通过 HttpServletRequest 对象获取 url 中的参数。 public static PageDomain getPageDomain(){ PageDomain pageDomain = new PageDomain(); pageDomain.setPageNum(Convert.toInt(ServletUtils.getParameter(PAGE_NUM), 1));...