张果老道逢深,活了二千岁还不死,这可气坏了阴王地府的阎王爷。他想:我们地府向来就有规定:一个灵魂到人间,长不过百岁,酸甜苦辣都应尝尽,然后归阴。这张果老一去两千年不回阴府,人间的酸苦辣全都不尝,只享人间的清福,把我阴王地府的规距破坏尽净,我岂能容他。想完,他用力喊道:“大小魔鬼!” “有!”殿下立即站了两排魔鬼。秃头鬼、赤脚鬼、靴子鬼、长尾巴鬼、牛头鬼、马面鬼⋯阴森森站了两排。 阎王大声喝令道:“秃头鬼,你去把张果老拿来,不得有误。” 秃头鬼奉命,立即去拿张果老。 那天傍晚,张果老坐在茅屋前独对残阳,正在打盹,忽然听门外有人喊道: “张果老,张果老,年龄活得真不小。 阎王老子着了急,派我来把你来找。 快跟我走休逃跑。” 张果老一听口音,是秃头鬼来拿他,心生一计说。 “女儿明天要出嫁,头上没毛人笑话。 正给女儿栽毛毛,栽好就到阎王家。” 无头鬼一听头发能栽,就想让张果老给他栽一头头发。他说: “我的头上没毛毛,给我栽栽好不好? 栽得好,我在阎王面前给你说好话,栽不好,我让阎王给你点颜色瞧。” 张果老在树旁放了一把凳子。打开门说:“请进。”秃头鬼进去,坐在树下。张果老让他闭上眼睛,把他绑到
前几天看自己一个关于用户信息的代码,突然发现组里一个人加了一段与之并列的逻辑,看着像是重构的方法,心想这个模块上线才不到一个月,也没发现有什么问题,为什么要重新搞?于是去问提交的人原因,他的意思是原来有两点问题,需要优化,现在新产品用户量还不高,等高了可能有问题,我觉得有必要记下来,聊一下这个cache需要怎么更新 数据结构 数据其实就是一个用户信息表,包含用户id,用户名,各种用户资料之类的,包含一个DB表,DB之前会有一个redis用于cache信息。很典型的cache方式 原cache-set流程(双删更新) 删除redis中对应修改用户key的数据 update用户信息表 delay 1s左右再次删除对应用户key的数据 请求用户数据时判断cache存在,则直接返回 请求用户数据时判断cache不存在,读db 读db后将数据json_encode到字符串set到redis中 返回db结果 新cache-set流程 update用户信息表 订阅用户信息表binlog 解析更新内容,修改redis中对应用户的hash结果中的修改内容的字段key 请求用户数据判断cache存在
因为最近需要做一个滑动窗口式的限流器,本着不要重复造轮子的原则找一些开源的,但找了半天发现都是些单机版的,没办法就自己搞一个吧 不多介绍,就是一个基于redis的sorted-set写的滑动窗口式的频率控制器,可以支持多种限流策略组合,适合类似于push这类的需要频控的业务 Just show the code https://github.com/elangx/redis-ratelimiter
我的博客之前一直是用的jekyll,一个很简单的静态博客生成系统,好处是真的很简单,没有评论、热度这类动态数据,同时也不需要数据库,用运行环境,搞个nginx指一下webroot就行,也有不少主题插件。不需要关心有没有人攻击、数据泄露、篡改什么的,但同时也一直有个问题存在,那就是更新有点麻烦,需要在本地打包手动上传到自己的vps上,搞的过程很像一次手动上线,比较繁琐,前一段时间正好换了vps,正好重新搞一套。 从头说 服务器选择 放在境内还是境外?境内的话两个选择,一是我手里有个阿里云的ces,2核2G,到是正好能用;二是放到nas里,好处是本地部署,不用占用云服务器,但是我的域名在Godady,如果转到境内的话还需要转到国内域名商,实名认证,然后还得备案,虽然我之前有过备案经历(当初备案还要用一个特殊的背景布自拍……),但还是觉得太麻烦,而且不想网站下面写个IPC备案这样的文案,太丑了;于是觉得先放境外,之前的『搬瓦匠』IP因为我在上面搭了个自用的梯子结果ip被封了,而且『搬瓦匠』换IP得7美元,而且换完还不一定是通的,刚好也快到期了,就准备换个服务商,找个名气小一点的,找来找去决定
平时我们在调一些rpc/db数据或获取一些远程setting时,常常会把他们保存在本地cache里,但每次又需要考虑存本地全局变量还是cache组件,还要考虑序列化反序列化,保存时间,数据结构调整之类的事,导致一些类似的工作会搞好几遍。于是我就搞了这个duration_cache的东西,他只需要在你原先读取数据的基础上调整一行代码就可以帮你把数据保存起来,过期后再重新获取,一般是不需要考虑结构调整,也不自己处理过期,使用了泛型,所以支持所有类型数据。 具体本地缓存用的freecache,因为它支持单key过期时间,同时使用了zero-gc的策略,保证了性能,不过也不时动态扩容;另外有个点是每个key大小不能大于千分之一的总容量 另外使用了singleflight来保证不会有并发更新的问题 使用方法很简单: 原代码示例: cacheRs, err := cache.GetUser(ctx, 1234) if err == nil && cacheRs != nil { return cacheRs, nil } row, err := db.GetUser(ctx, 1234) if
eLangX
不要瞎写!不要瞎写!不要瞎写!