Rax

[由零开始]Redis数据类型与底层数据结构

旧街凉风 提交于 2020-09-24 11:31:12
数据类型与底层数据结构 1.数据类型 Redis是一个Key-Value的存储系统,使用ANSI C语言编写。 key的类型是字符串。 常用的:string字符串类型、list列表类型、set集合类型、sortedset(zset)有序集合类型、hash类 型。 不常见的:bitmap位图类型、geo地理位置类型。 Redis5.0新增一种:stream类型 注意:Redis中命令是忽略大小写,(set SET),key是不忽略大小写的 (NAME name) 2. Redis数据类型分析 2.1 Redis的Key的设计 用:分割 把表名转换为key前缀, 比如: user: 第二段放置主键值 第三段放置列名 比如:用户表user, 转换为redis的key-value存储 userid username password email 1 zhangf 111111 zhangf@163.com username 的 key: user:9:username {userid:9,username:zhangf} email的key user:9:email 2.2 String字符串类型 String能表达3种值的类型:字符串、整数、浮点数 2.2 .1 常见操作命令: 命令名称 命令描述 set set key value 赋值 get get key 取值 getset

Swift .self .Type 分析

寵の児 提交于 2020-08-20 09:37:26
前言: 我们知道Swift中,对象在内存中存储结构如下图所示: 对象 的 前8个字节 指向类型信息,也就是指向 元类型(metadata) (也叫元数据) 。 所以 这8个字节就是一个 元类型指针 我们再看下面的Dog.self Dog.self 也是一个 元类型(metadata) 指针, 里面存放着 元类型(metadata) 。 既然是指针,64bit中就占用8个字节 且 Dog.self 是 Dog.Type 类型 证明1: Dog.self 也是一个 元类型(metadata) 指针, 里面存放着 元类型(metadata) 通过汇编代码: 15行 是allocating ,创建Dog对象的,之后会返回堆空间地址,也就是17行中rax寄存器中存储的值。 (即:17行中的 rax 中存储着 dog对象的堆空间地址) 19行 将rax值 赋值给 0x87e (%rip) 这个全局变量 (也就是赋值给 dType) ,只要弄清楚此时的rax里装着什么就ok了,我们查看18行汇编会发现 rax值来自 -0x20 (%rbp), 第13行会发现 -0x20 (%rbp)的值来自rax, rax是什么呢,可以发现是11行这个函数调用后的返回值,11行这个函数时什么呢?看注释可以知道是type metadata相关的函数,我们打印13行的rax看看是什么东西就知道了:

将32位循环计数器替换为64位会在Intel CPU上使用_mm_popcnt_u64引起疯狂的性能偏差

匆匆过客 提交于 2020-08-20 05:28:22
问题: I was looking for the fastest way to popcount large arrays of data. 我一直在寻找最快的方法来 popcount 大量数据的数量。 I encountered a very weird effect: Changing the loop variable from unsigned to uint64_t made the performance drop by 50% on my PC. 我遇到了一个 非常奇怪的 效果:将循环变量从 unsigned 更改为 uint64_t 使PC上的性能下降了50%。 The Benchmark 基准测试 #include <iostream> #include <chrono> #include <x86intrin.h> int main(int argc, char* argv[]) { using namespace std; if (argc != 2) { cerr << "usage: array_size in MB" << endl; return -1; } uint64_t size = atol(argv[1])<<20; uint64_t* buffer = new uint64_t[size/8]; char* charbuffer =

从X86指令深扒JVM的位移操作

我的未来我决定 提交于 2020-08-17 06:24:29
概述 之所以会写这个,主要是因为最近做的一个项目碰到了一个移位的问题,因为位移操作溢出导致结果不准确,本来可以点到为止,问题也能很快解决,但是不痛不痒的感觉着实让人不爽,于是深扒了下个中细节,直到看到Intel的指令规约才算释然,希望这篇文章能引起大家共鸣。 本文或许看起来会比较枯燥,不过其实认真看挺有意思的,如果实在看不下去,告诉你一个极简路径,先看下下面的Demo,然后直接跳到后面的小结,如果懂了,别忘记顺便点个赞,请叫我雷锋,哈哈。 Demo 还是从一个简单的例子说起 大家可以尝试做几个改变,看看结果怎样 4 << shift 改成 4L << shift 将35改成291,PS:提示一下 291=25+256*1 如果上面的各种结果你都能解释,那说明你对位移操作还是有一定了解的,不过本文主要从JVM到Intel X86_64指令角度来分析这个问题,或许也值得一看 JVM里4和4L的区别 要知道区别,我们看 doShiftL 方法通过javac编译出来的指令有什么不一样 4 << shift的字节码 0: iconst_4 1: iload_0 2: ishl 4L << shift的字节码 0: ldc2_w # 34 // long 4l 3: iload_0 4: lshl 针对4和4L的区别,我们看到了两条不同的指令,分别是 iconst_4 和 ldc2_w

SIGSEGV信号处理

╄→гoц情女王★ 提交于 2020-08-16 06:13:41
由某一个线程造成的 SIGSEGV|SIGFPE 的异常信号都会被递交给发起线程, 文档 。 这类信号可以通过 SA_SIGINFO 的方式获取到 siginfo_t 中的,中断信号,错误代码,发送者,以及错误访问的地址。 在第三个参数 void* 类型的数据,一般是 ucontext_t 类型,其中的 gregs 存储上下文寄存器会存储 RAX 是错误地址,和对应的栈信息。栈信息可以通过 backtrace 函数以及 backtrace_sysmbols 函数获取到同样的栈帧。 异常的友好处理可以使用 setjmp + longjmp 的方式,但是这种虽然可以规避异常,但是不会调用析构函数,随意,最好是做好自己的资源统计。 案例 #include<execinfo.h> //#include<signal.h> #include<stdio.h> #define SIZE 20 int main() { void * buf[SIZE]; int ret = backtrace(buf,SIZE); char **bk = backtrace_symbols(buf,ret); for(int i = 0 ; i < ret ;i ++) printf("%s\n",bk[i]); return 0; } 编译指令 g++ -rdynamic stack.cpp 来源:

如何借助社区能力快速构建中后台生态,飞猪中后台的探索和实践

ⅰ亾dé卋堺 提交于 2020-08-15 03:05:55
本文来自飞猪前端@肖北同学,深入中后台方向开发,在飞猪中后台建设中沉淀了大量提效、开箱即用、可视化搭建、体验度量的能力,本文将飞猪侧一年来在商家、行业中后台开发过程中建设总结,欢迎一起交流! 前言 要对用户提供更多的货品和服务,底层的供应链升级和商家能力就显得极为重要。尤其在互联网用户红利燃烧殆尽的情况下,对存量用户市场进一步的挖掘,需要更为低廉的价格和优质的服务。如何签约更多商家和货品?如何能直连商家降低操作成本?如何帮助商家线上运营?在这一系列的问题中,中后台的站点和业务也呈爆发式增长。 与重内容展示且经常迭代的 C 端业务不同,中后台要负责 整合内容生产和行业流程 ,其中包括 商家、TP、供应商等外部客户用的商家平台 ,也涵盖 BD、运营、客服、小二等使用的一系列的小二工作台 。要在巨大的业务压力下确保稳定和体验,又要为商家的入驻和效能提升做背书,这促使我们依托集团社区现有的底层技术做了一些摸索,并形成了一系列基础能力。文中大多技术都已经开源,文末有相关链接,大家可以按需取用。 挑战与落地 整体上看,随着业务体量的不断增大,前后端人员比例进一步失衡。同时中后台体系内部,存量问题极多,老系统的技术体系混乱,加之从未有过设计师参与需求流程,既导致设计规范不统一,用户体验差,也从侧面增大了飞猪中后台的维护成本。 在这些挑战下,我们立足于 规范统一、前端服务化、效能提升、体验治理

BUUCTF--[GWCTF 2019]xxor

柔情痞子 提交于 2020-08-11 08:29:48
测试文件: https://www.lanzous.com/ib5y9cb 代码分析 1 __int64 __fastcall main(__int64 a1, char **a2, char ** a3) 2 { 3 signed int i; // [rsp+8h] [rbp-68h] 4 signed int j; // [rsp+Ch] [rbp-64h] 5 __int64 v6; // [rsp+10h] [rbp-60h] 6 __int64 v7; // [rsp+18h] [rbp-58h] 7 __int64 v8; // [rsp+20h] [rbp-50h] 8 __int64 v9; // [rsp+28h] [rbp-48h] 9 __int64 v10; // [rsp+30h] [rbp-40h] 10 __int64 v11; // [rsp+40h] [rbp-30h] 11 __int64 v12; // [rsp+48h] [rbp-28h] 12 __int64 v13; // [rsp+50h] [rbp-20h] 13 __int64 v14; // [rsp+58h] [rbp-18h] 14 __int64 v15; // [rsp+60h] [rbp-10h] 15 unsigned __int64 v16; // [rsp

C++引用原理

杀马特。学长 韩版系。学妹 提交于 2020-08-10 23:29:27
1、直接定义引用变量 示例代码 #include<iostream> void fun() { int a = 1; int& b = a; b = 10; } int main() { fun(); return 0; } 代码反汇编结果(使用VS反汇编,只看fun函数的代码即可) #include<iostream> void fun() { 00007FF7AAD01920 push rdi 00007FF7AAD01922 sub rsp,40h 00007FF7AAD01926 mov rdi,rsp 00007FF7AAD01929 mov ecx,10h 00007FF7AAD0192E mov eax,0CCCCCCCCh 00007FF7AAD01933 rep stos dword ptr [rdi] // 对变量a进行定义,a的地址为 rsp + 24h, 把这个地址的内容初始化为1 int a = 1; 00007FF7AAD01935 mov dword ptr [rsp+24h],1 // 创建变量b,b是a的引用,b 是指向 a 的指针,变量b的地址为 rsp+38h // lea rax,[rsp+24h] 取得变量a的地址,并把地址放到rax寄存器中 // qword ptr [rsp+38h],rax 把rax的内容赋给变量b int& b =

开放下载!《大促背后的前端核心业务实践》

假如想象 提交于 2020-08-10 17:25:14
《大促背后的前端核心业务实践》电子书重磅发布! 2020年618大促已经过去,作为淘系每年重要的大促活动,淘系前端在其中扮演着什么样的角色,如何保证大促的平稳进行?又在其中应用了哪些新技术?淘系技术联合阿里云开发者社区特推出《大促背后的前端核心业务实践》电子书,为大家介绍 618 中的前端身影。 本书另附 6000+ 字图文版前端学习秘籍和面试官直达简历投递地址 ,还不快来get?! 精彩内容抢先看 一、618大促背后的淘系前端技术体系 今年 618 大促一贯地保持了对友商的竞争优势,创造了新的数字消费记录,业务玩法和策略上也有了一些新的变化。例如:● 超长的售卖周期:5.25 预售、5.29 开门红、6.4 多波段品类日、6.16 狂欢日。● 消费券发放:平台、各地政府和商家一共发放了超 100 亿元的消费券和补贴。● 直播带货:通过直播带货让用户更好地感知商品,提升流量变现效率,形成电商导购的新模式。● 互动任务体系:618 理想生活列车,做任务,赚喵币,瓜分 10 亿平台和商家福利。● ......经过多年的沉淀和发展,淘系前端已经构建出了一套较为完备的技术体系,用以支撑阿里包含 618、双 11 在内的电商营销活动业务。接下来笔者将简单介绍淘系前端技术体系以及这个技术体系上基于 618 大促的场景诉求,技术演进的创新点。 二、生产力再提速,618 互动项目进化之路

用于测试Collat​​z猜想的C ++代码比手写汇编要快-为什么?

孤街浪徒 提交于 2020-08-04 22:09:48
问题: I wrote these two solutions for Project Euler Q14 , in assembly and in C++. 我用汇编语言和C ++语言为 Euler Q14项目 编写了这两种解决方案。 They are the same identical brute force approach for testing the Collatz conjecture . 它们是用于测试 Collat​​z猜想 的相同相同的蛮力方法。 The assembly solution was assembled with 组装解决方案与 nasm -felf64 p14.asm && gcc p14.o -o p14 The C++ was compiled with C ++使用 g++ p14.cpp -o p14 Assembly, p14.asm 汇编, p14.asm section .data fmt db "%d", 10, 0 global main extern printf section .text main: mov rcx, 1000000 xor rdi, rdi ; max i xor rsi, rsi ; i l1: dec rcx xor r10, r10 ; count mov rax, rcx l2: test