Dev's Logging

Welcome to my blog !


When should server side sessions be used instead of client side sessions?

Published at April 16, 2019 ·  1 min read

针对 server side session 和 client side session 的区别,将 session 保存在 client side 一大原因往往是安全问题,如果被更改则如何验证。server side session 相对来说比较安全,但是在 scaleable system 中,往往会容易成为瓶颈 When should server side sessions be used instead of client side sessions?...

HTTP cookies

Published at April 16, 2019 ·  1 min read

Cross-site request forgery (CSRF) 这篇文章很好的解释了 CSRF 存在的来由,通过伪造 <img> 资源或 form 请求,以达到跨站获取当前用户 cookie 实现跨站攻击的目的,一个比较好的解决方式便是在后端生成 CSRF token 发送给前端,并在提交数据时在后端验证 token,此方法 只是针对 post,put 等会修改后端内容的方法,针对 get 则在设计上遵循幂等性只请求后端资源,而不进行修改。 HTTP cookies...

Memory management in Python

Published at April 14, 2019 ·  1 min read

Python 的内存管理模型,在 Python 中,一切都是 object (对象)。为了更加高效的管理内存,设计了三种不同的数据结构,Block, Pool, Arena. Block 为最小的数据结构,从 8 到 512 bytes,但必须是 8 的整数,被划分为 64 种不同的大小。Pool 则是大小相同的 Block 的集合,一般情况下 Pool 的大小等于 Memory page ,4 kb。将 Pool 限定在只包含固定大小的 Block 是为了方便 fragmentation (碎片)管理,当一个 block 被消除后,随即可以用一个新的 block 填充上来。Pool 是由 doubly linked list (双向链表)链接而成。Arena 是堆上分配的 256k 大小的内存块,为 64 个 pool 提供存储空间。Python 的 small object manager 很少将内存归还给操作系统,只有当Arena 中所有的 Pool 为空时,Arena 才会被释放,也只有短时间内有大量的临时 objects 时才会出现这种情况。所以,对于一些长期运行的 Python 进程,可能会因此占用大量未被释放的内存。 Memory management in Python...

Garbage collection in Python: things you need to know

Published at April 14, 2019 ·  1 min read

在 Python 中,每个 variable 都是一个指向一个对象的 reference(pointer),为了追踪 reference 每个 object 中都会有一个 reference count,当对象被 copy 或 delete 则相应的增减或减少其 count,当 count 值为 0 时,则表明已经没有 variable 指向这个 object 了,这时则需要 gc (garbage collector) 将 object 清除,进而回收其占用的内存。当然也可以通过 gc.disable() 禁用 gc ,gc.collect() 手动运行 gc。 Garbage collection in Python: things you need to know...

SQL vs NoSQL Database Differences Explained with few Example DB

Published at April 11, 2019 ·  1 min read

非常详细的解释了 sql 和 nosql 之间的区别。1. sql 是基于 table 的,而 nosql 是基于 document,kv 对,图或者 宽表,也就是说在 sql 中,sql 是包含若干 table,而 nosql 则是若干 document 的集合。2. 复杂的查询,我想这也是两者最为关键的区别,sql 可以轻易的完成多种条件关系组合的复杂查询,而 nosql 却将这种复杂的关系固化到 document 的 kv 组合中 3. 两者在 scale 时的区别sql 适合 vertically scalable,也就是说,提高服务器的硬件,比如 ram,cpu,disk 之类即可提高数据库的负载性能,而 nosql 则是需要通过增加数据库服务器的数量来提高负载。4. sql 设计遵循 acid, atomicity, consistency, isolation, durability, nosql 则遵循 cap , consistency, availability and partition tolerance SQL vs NoSQL Database Differences Explained with few Example DB...

Linked List vs Array - GeeksforGeeks

Published at April 11, 2019 ·  1 min read

面试中会经常闻到的一个问题,数组和链表的区别。array 是存储了一组类型相同的元素,通过 index 进行查询,linked list 则是包含一组无序的节点。获取 array 中元素的时间复杂度为 O(1),linked list 则为 O(n),需要从一个节点开始遍历。插入或删除操作在 array 中则需要O(n),在 linked list 则为 O(1),由此可知在需要大量插入与删除时时选择 linked list 较为合适 Linked List vs Array - GeeksforGeeks...

git — Rebase vs Merge

Published at April 11, 2019 ·  1 min read

git rebase 和 git merge 的区别,什么时候该用 git rebase,什么时候该用 git merge。当 commit history 比较多且复杂需要将其简化,则推荐 rebase,但其会将 feature branch 移除,所以当多人协作一个 feature branch 时不建议使用 rebase git — Rebase vs Merge...

Big-O Cheat Sheet, Know The Complexities!

Published at April 10, 2019 ·  1 min read

详细的介绍了常见的数据结构和算法的时间和空间复杂度 Big-O Cheat Sheet, Know The Complexities!...

Achieving concurrency in Go

Published at April 6, 2019 ·  1 min read

Golang 中的 concurrency。关于 thread 与 goroutine 的对比较为详细。 线程/ thread 协程 / goroutine 系统的线程是由内核管理,有硬件依赖 goroutines 通过 Go 运行时管理,没有硬件依赖 系统线程通常有 1-2 MB 大小的固定堆栈 goroutines 在最新版的 Go 中通常是 8kb 大小的堆栈 堆栈大小在编译时及被决定,并且不能增加 堆栈大小由运行时进行管理,通过释放和分配新的堆栈可以增加到 1GB 在线程间没有方便的通信媒介 goroutine 通过 channels 进行低延时通信 (read more). 线程具有唯一的身份. 通过线程ID(TID)辨别在进程中的每个线程 goroutine 并没有任何唯一身份识别. 因为 Go 没有线程本地存储 TLS(Thread Local Storage). 线程有非常显著的创建和销毁成本,创建时需要向系统申请大量资源,并在销毁时将资源返还 goroutines 则是在运行时进行创建和销毁,这些操作相比于线程成本很低,因为 Go 运行时为 goroutines 维护了一个线程池....

Tags

abcs accept acid activemq affinity algorithm allocation android array async aws b+tree b-tree backoff benchmark best-practices bfs big-o bigquery bind bitcount blog break broker bubble buffer cache cap cert cgroups channel citus class classmethod cluster concurrency config consumer container cookie cors crawler cronjob csrf ctr data-science data-structure database datadog dataflow datascience decorator defer dfs distributed django dns docker double-shipping drf ecosia elastic-search enumerate epoll extra facebook-pixel financial-report flask flutter forward-proxy freelance frp garbage-collector gc gcp generator get gil git golang goroutine graphql ha handbook haproxy hash hash-slot hashring hashtable hpa http http-auth http-proxy http_proxy https index innodb instagram intergration interview ios javascript jinja2 jobboard jwt k8s kafka kibana kqueue label lambda layer4 layer7 lean levels.io linked-list linux list listen loadbalancer logs long-tail lru marketing master matplotlib memory merge metaclass metaprogramming metrics metrics-server microservices mitm model mq myisam mysql namespace nat netflix network-extension nginx nodejs nomad nosql npm oodesign openssl optimization orm pandas parallelism parkinglot patroni permission pg pipeline pixelme post postgresql postresql prefetch_related prerender process proxy proxycommand put pvm python queue rabbitmq rbac react-native rebase redis redis-cluster replication resource rest restfulapi retargeting retry revenue reverse-proxy rocketmq saas scaleable search-engine security select seo serverless service session set shadosocks shadowsocks shard sharding shell shopify sigint signal sigterm slack slave slow-query sniper sns socket socks5 source-code spa sql sqlalchemy sqs ssh ssl ssl-pinning stack startup state stateful stateless staticmethod string struct swift switch syscall system-design systemctl tcp tcp-proxy thread tmpreaper token traefik trustkit tunning type typeform udp variable vc vpn vuejs web web-development where yarn zset 削峰 宽索引 异步 窄索引 解耦 跨域 跳板机


Archives

2019 (137)
0001 (1)