源码

Redis源码剖析 字典 结构 ( dict.h/dict.c)

≯℡__Kan透↙ 提交于 2020-02-04 20:09:29
字典又称为符号表、关联数组 、或者映射。是一种用于保存键值对(key-value)的抽象结构数组。 例如:Redis中所有key到value的映射,就是通过字典结构维护,还有hash类型的键值。 1、Redis中字典的实现 Redis的字典是由哈希表实现的,一个哈希表有多个节点,每个节点保存一个键值对。 1.1哈希表(dict.c/dict.h) typedef struct dictht{ dictEntry** table;//存放一个数组的地址,数组中存放哈希节点dictEntry的地址 unsingned long size;//哈希表table的大小,出始大小为4 unsingned long sizemask;//用于将hash值映射到table位置的索引,大小为(size-1) unsingned long used;//记录哈希表已有节点(键值对)的数量 }dictht; 1.2哈希表节点 typedef struct dictEntry{ void *key; //key union{ void* val; uint64_t u64; int64_t s64; double d; }v; //val struct dictEntry *next; //指向下一个节点,用来解决 哈希冲突 }dictEntry; 1.3字典 typedef struct dict{

Glide源码分析(三)

别来无恙 提交于 2020-02-04 19:17:13
文章目录 .into(*) 1、Target 2、Request 3、track() 3.1 生命周期 3.2 requestTracker.runRequest(Request) 4、DecodeJob.run() 5、ModelLoader 6、HttpUrlFetcher 7、缓存 8、加载图片 总结 最后的个人总结 .into(*) 这个方法非常的复杂,得反复看好几遍源码。 —— 鲁迅 以 .into(ImageView) 为例,我们看看这个方法究竟做了哪些事情: public ViewTarget < ImageView , TranscodeType > into ( @NonNull ImageView view ) { BaseRequestOptions < ? > requestOptions = this ; //省略验证及一些设置性的代码 . . . return into ( glideContext . buildImageViewTarget ( view , transcodeClass ) , /*targetListener=*/ null , requestOptions , Executors . mainThreadExecutor ( ) ) ; } 1、Target 看到上面的源码,最终又会调用另一个重载的方法: private <Y

安卓开发---2048小游戏

坚强是说给别人听的谎言 提交于 2020-02-04 19:02:08
实现过程 新建一个card类,代表每一个格子,通过创建一个card的二维数据,然后监听用户的上下左右滑动的动作,即可以完成该款简单的2048安卓小游戏的制作。过程比较简单,都是逻辑处理,可以自己阅读源码,文章末尾提供源码。 运行效果图 源码获取 微信关注<飞飞产业园>公众号,回复“2048安卓源码”即可获得2048小游戏源码的下载链接了。 来源: CSDN 作者: coffee_fighter 链接: https://blog.csdn.net/coffee_fighter/article/details/92099889

ThreadLocal 源码分析

喜你入骨 提交于 2020-02-04 18:11:38
转自:http://www.iteye.com/topic/103804 首先,ThreadLocal 不是用来解决共享对象的多线程访问问题的,一般情况下,通过ThreadLocal.set() 到线程中的对象是该线程自己使用的对象,其他线程是不需要访问的,也访问不到的。 各个线程中访问的是不同的对象。 另外,说ThreadLocal使得各线程能够保持各自独立的一个对象,并不是通过ThreadLocal.set()来实现的,而是通过每个线程中的new 对象 的操作来创建的对象,每个线程创建一个,不是什么对象的拷贝或副本。 通过ThreadLocal.set()将这个新创建的对象的引用保存到各线程的自己的一个map中,每个线程都有这样一个map,执行ThreadLocal.get()时,各线程从自己的map中取出放进去的对象,因此取出来的是各自自己线程中的对象,ThreadLocal实例是作为map的key来使用的。 如果ThreadLocal.set()进去的东西本来就是多个线程共享的同一个对象,那么多个线程的ThreadLocal.get()取得的还是这个共享对象本身,还是有并发访问问题。 下面来看一个hibernate中典型的ThreadLocal的应用: private static final ThreadLocal threadSession = new

redis 5.0.7 源码阅读——跳跃表skiplist

ぐ巨炮叔叔 提交于 2020-02-04 16:06:08
redis中并没有专门给跳跃表两个文件。在5.0.7的版本中,结构体的声明与定义、接口的声明在server.h中,接口的定义在t_zset.c中,所有开头为zsl的函数。 一、数据结构 单个节点: typedef struct zskiplistNode { //key,唯一 sds ele; //分值,可重复 double score; //后退指针 struct zskiplistNode *backward; //层 struct zskiplistLevel { //前进指针 struct zskiplistNode *forward; //到本层下一节点的跨度,用于计算rank unsigned long span; } level[]; } zskiplistNode; zskiplistNode定义了跳跃表中每个节点的数据结构,它是一个变长结构体。 1 /* 2 +------------------------+ 3 |sds ele | /+-----------------------------+ 4 +------------------------+ / |struct zskiplistNode *forward| 5 |double score | / +-----------------------------+ 6 +---------------

Spring源码编译下载

被刻印的时光 ゝ 提交于 2020-02-04 14:58:57
下载源码 2B哥在家远程办公,心血来潮,整理点spring源码玩玩。 可以在github上下载 ,也可以下载我课堂的源码(有注释) git clone https://github.com/spring-projects/spring-framework.git 配置gradle 编译环境 Spring源码是通过gradle编译的,所以要先配置gradle编译环境 gradle下载安装 下载地址 ,我本地环境用的 v4.10.2 解压安装,安装路径不要出现空格(建议),如图 2、配置环境变量 选中系统变量path,然后编辑,打开编辑环境,新建, 输入配置路径C:\apache\gradle-4.10.2\bin 验证环境安装是否正常,如下图,表示正常 3. 导入idea,配置idea环境 导入spring-framwork到idea 打开idea, 选择File—Open,选择解压的spring-framwork,导入到idea 配置idea中gradle环境 File—Settings ,搜索gradle, 配置gradle 指定gradle home: C:/apache/gradle-4.10.2 安装路径 Service directory path指定了gradle仓库: D:/maven/gradle/.gradle 自定义 vm参数可不配: -XX

Django2.0.6-Xadmin后台源码安装流程(python 3.8+django 2.0)

自闭症网瘾萝莉.ら 提交于 2020-02-04 12:57:56
1. 命令行执行 pip install git+git://github.com/sshwsfc/xadmin.git@django2 2.修改url.py 3.修改setting.py 4.卸载xadmin 保留依赖(因为我们用源码的xadmin) pip uninstall xadmin 5.下载xadmin源码(注意不要下载错了) 6.解压下载文件 7.将解压后的文件放到项目所需要的目录。(这里统一放在第三方包管理目录,这里放在extra_app中) 8.安装结束。 来源: https://www.cnblogs.com/lpdeboke/p/12258948.html

vim 源码安装

半腔热情 提交于 2020-02-04 12:21:48
声明:本文借鉴自  https://github.com/ycm-core/YouCompleteMe/wiki/Building-Vim-from-source 1 本机环境 ubuntu 18.04 2 安装步骤 a. 卸载当前的 vim sudo apt remove vim vim-runtime gvim 如果之前是源码安装的,需要手动删除相关的文件进行卸载。 b. 安装相关依赖 sudo apt install libncurses5-dev libgnome2-dev libgnomeui-dev \ libgtk2.0-dev libatk1.0-dev libbonoboui2-dev \ libcairo2-dev libx11-dev libxpm-dev libxt-dev python-dev \ python3-dev ruby-dev lua5.1 liblua5.1-dev libperl-dev git 不是所有的都需要,可以根据实际情况取舍,详细请见声明链接。 c. 下载最新的 vim 源码,并进行相关的配置和安装 cd ~ git clone https://github.com/vim/vim.git cd vim ./configure --with-features=huge \ --enable-multibyte \ --enable

tars源码解析1--服务端启动

你。 提交于 2020-02-04 11:36:56
tars源码解析1-服务端启动 1. 服务如何启动 1.1 AppContext 1.2 初始化Server 1.3 加载Servant 1.4 AppContextListener 2. 服务如何注册到注册中心 3.总结 首先本例子是来自, TarsJava/examples/quickstart-server/ 新建一个启动类App.java package com.qq.tars.quickstart.server; /** * @author : yesheng * @Description : * @Date : 2020-01-31 */ public class App { public static void main(String[] args) throws Exception { com.qq.tars.server.startup.Main.main(args); } } Jvm参数配置成 -Dconfig=/Users/yesheng/Documents/huya/tars/TarsJava/examples/quickstart-server/src/main/resources/TestApp.HelloJavaServer.config.conf 运行App.main就可以运行起来。 1. 服务如何启动 1.1 AppContext public

【requireJS源码学习03】细究requireJS的加载流程

风格不统一 提交于 2020-02-04 08:08:56
前言 这个星期折腾了一周,中间没有什么时间学习,周末又干了些其它事情,这个时候正好有时间,我们一起来继续学习requireJS吧 还是那句话,小钗觉得requireJS本身还是有点难度的,估计完全吸收这个月就过去了,等requireJS学习结束后,我们的学习流程可能就朝两个方向走 ① 单页应用框架/UI库整理 ② UML文档相关/重构思想相关(软性素质) 然后以上的估计估计会持续3、4个月时间,希望学习下来自己能有不一样的提高,成为一个合格的前端,于是我们继续今天的内容吧 requireJS中的队列 经过之前的学习,我们队requireJS的大概结构以及工作有了一定认识,但是,我们对于其中一些细节点事实上还是不太清晰的,比如里面的队列相关 requireJS中有几种队列,每种队列是干神马的,这些是我们需要挖掘的,而且也是真正理解requireJS实现原理的难点 首先,requireJS有两个队列: ① globalDefQueue / 全局 ② defQueue / newContext 闭包 这个队列事实上是一个数组,他们具体干了什么我们还不得而知,但是我下意识觉得他比较关键...... 我们这里来简单的理一理这两个队列 globalDefQueue 这个是全局性的队列,与之相关的第一个函数为takeGlobalQueue takeGlobalQueue /** *