Dev's Logging

Welcome to my blog !


精益创业,快速原型验证想法,将技术栈维持在一个很小的可维护范围

Published at January 2, 2019 ·  1 min read

虽然一年已经过去,24个产品的目标还差一半才打到,但作者精益创业的思维非常值得学习,抓到需求点后快速原型并推广验证想法,并在原有的用户群基础上继续推出新产品,不断验证开发,推出市场实现盈利 Why we’re building 24 businesses in 12 months...

Redis 缓存与 Mysql 数据库中的数据一致性

Published at January 1, 0001 ·  1 min read

Redis 缓存将数据保存在内容中,很好的缓解了 Mysql 在高并发时的压力,根据实际场景的需求,可以将缓存的时间增长或减小,小到五秒甚至更短。 但是,如果用户对数据库进行删改等改变 Mysql 数据的行为,那这 5s 的时间内将会出现数据不一致的问题。 通常的做法是,在数据库出现删改等行为时将 Redis 中相应的数据删掉,下次请求时,则会向 mysql 发起请求并将得到的数据保存到 Redis 中。 这种设计中分别包含两次操作:1. 删除 Redis 中的 2. 增删改 Mysql 中的数据 在这种设计情况下,则可能会出现在进行完成 1 操作后到进行 2 操作前的请求,请求会 cache miss 到 Mysql 请求原来的数据并放到 Redis 中,那之后的数据均为脏数据。 面对这种情况一种解决方法则是在 2 完成后再进行一次 1,以保证 Redis 中的脏数据不存在 当然,还有一种方法则是利用 mysql 自有的 binlog 向 redis 提交更新数据。同一机房的情况下可以做到百毫秒以内。 https://yunpengn.github.io/blog/2019/05/04/consistent-redis-sql/ ...

Redis 数据结构设计“当前谁在线”功能

Published at January 1, 0001 ·  1 min read

设计需求:查看当前用户的在线好友 定义:可以将五分钟内进行过操作或有发送在线心跳包的用户定义为在线,而好友数量则可定义为 5000 以内的双向好友关系,也就是说 1 -> 2 与 2 -> 1 是等价的。 在上述前提下,满足这种条件的可以选用 Redis 中的 Set 数据结构,每一分钟新建一个 Set 将这一分钟内进行过操作或发送在线心跳包的用户放入其中,然后将五分钟作为时间滑动时间窗口,依次将最近五分钟的五个 Set 取出做 Union 操作 取并集,再与当前用户的好友取交集操作,即可找到“当前用户的在线好友” Redis in Practice: Who’s Online? ...

Python 单例设计模式( Singleton )

Published at January 1, 0001 ·  1 min read

Python 单例设计模式,为了实现程序在不同位置均能渠道同一个对象实例,如果实例不存在,则创建新实例,特引出 Singleton 设计模式,通过类的 new 方法,在创建实例时检测是否已存在,若存在则返回原实例。 class Single(object): _instance = None def __new__(cls, *args, **kw): if cls._instance is None: cls._instance = object.__new__(cls, *args, **kw) return cls._instance def __init__(self): pass single1 = Single() single2 = Single() print(id(single1) == id(single2)) 原文:https://zhuanlan.zhihu.com/p/37534850...

Python 中的 With

Published at January 1, 0001 ·  1 min read

在 Python 中,与文件相关的操作涉及到读写,经常需要用到 open 和 close,文件打开后,然后关闭,但是 with 的使用可以很好的规避 close。 比如: with open('file_path', 'w') as file: file.write('hello world !') 同样,在有相关需求的场景中,我们也可以自行构建支持 with 的对象,可以通过定义 enter 和 exit 的方式,如: # a simple file writer object class MessageWriter(object): def __init__(self, file_name): self.file_name = file_name def __enter__(self): self.file = open(self.file_name, 'w') return self.file def __exit__(self): self.file.close() # using with statement with MessageWriter with MessageWriter('my_file.txt') as xfile: xfile.write('hello world') https://www.geeksforgeeks.org/with-statement-in-python/...

Mysql Innodb 中的锁和意向锁

Published at January 1, 0001 ·  1 min read

Mysql Innodb 中存在者多种锁,分别是: Shared (S) lock,共享锁 Exclusive (X) lock,排他锁 以上两个锁均为行级(row)锁,当某个进程通过 S(只读) 锁定某一行时,其他进程可以申请这一行的 S 锁,而不能申请 X 锁。 当遇到某个表中的某行或某几行有 X 锁时,其他进程若想在此表内申请 X 锁时则需要遍历所有行查看是否有 X 锁,效率非常低。于是出现了 Intension Lock(意向锁) 与上述两种行级锁所不同的是意向锁是表级锁,只有当真正得到某一行的锁时,才是行级锁并与其他欲申请此行的锁相冲突。 当再向一个表添加表级X锁的时候 * 如果没有意向锁的话,则需要遍历所有整个表判断是否有行锁的存在,以免发生冲突 * 如果有了意向锁,只需要判断该意向锁与即将添加的表级锁是否兼容即可。因为意向锁的存在代表了,有行级锁的存在或者即将有行级锁的存在。因而无需遍历整个表,即可获取结果 InnoDB Locking ...

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 closure closures cluster concurrency config consistency consumer container context cookie cors crawler cronjob csrf ctr data-science data-structure database datadog dataflow datascience decorator deepcopy defer dfs distributed django dns docker double-shipping drf ecosia elastic-search enumerate epoll equal errgroup escaping event extra fabric2 facebook-pixel financial-report flask flutter forward-proxy freelance frontend frp garbage-collector gc gcp generator gesture get gil git golang goroutine graphql ha handbook haproxy hash hash-slot hashring hashtable hpa http http-auth http-proxy http_proxy https index init innodb instagram intention-lock intergration interview ios is javascript jinja2 jobboard json jwt k8s kafka kibana kqueue label lambda layer4 layer7 lean levels.io linked-list linux list listen loadbalancer lock logs long-tail lru marketing master matplotlib memory merge metaclass metaprogramming metrics metrics-server microservices mitm mobile model mongo mongoose mq myisam mysql namespace nat netflix network network-extension nginx nodejs nomad nosql notification npm oodesign openssl optimization orm osi pandas parallelism paramiko parkinglot patroni permission pg pipeline pixelme post postgresql postresql prefetch_related prerender private-key process proxy proxycommand put pvm python queue rabbitmq rbac react-native reactive reactjs rebase redis redis-cluster replication resource rest restfulapi retargeting retry revenue reverse-proxy rocketmq rsa rxswift saas scaffold scaleable search-engine security select seo serverless service session set shadosocks shadowsocks shard sharding shell shopify sigint signal sigterm singleton 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 swiftui switch syscall system-design systemctl tcp tcp-proxy thread tmpreaper token traefik trustkit tunning type typeform udp userdefaults variable vc voidcallback vpn vuejs weak web web-development where widget with yarn zset 削峰 单例模式 宽索引 异步 看源码学-golang 窄索引 解耦 跨域 跳板机


Archives

2020 (6)
2019 (157)
0001 (5)