论如何用 redis 打造一个优雅的计数系统 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
snailsir
V2EX    Redis

论如何用 redis 打造一个优雅的计数系统

  •  
  •   snailsir 2015-09-09 11:07:27 +08:00 8618 次点击
    这是一个创建于 3752 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如题,想听听大家都怎么搞的,有 demo 更好, php 最好 :)

    哦,当然会有 mysql

    第 1 条附言    2015-09-10 11:39:33 +08:00
    有人发了一篇讨论 redis 的新帖,我觉得很好,记录学习一下,同时期待大家继续就本帖子畅所欲言哈、共同进步 :)
    t/219551
    36 条回复    2015-09-10 12:47:42 +08:00
    broadliyn
        1
    broadliyn  
       2015-09-09 11:09:16 +08:00
    当然是 K-V 还能怎么搞?
    redis 的 incr 和 decr 都是原子操作,
    wupher
        2
    wupher  
       2015-09-09 11:11:23 +08:00
    折腾用 MongoDB 打造一个优异的计数系统。
    snailsir
        3
    snailsir  
    OP
       2015-09-09 11:11:44 +08:00
    @broadliyn 然后怎么往 mysql 里搞呢?
    sun2920989
        4
    sun2920989  
       2015-09-09 11:12:20 +08:00
    incr
    snailsir
        5
    snailsir  
    OP
       2015-09-09 11:15:08 +08:00
    @sun2920989 我知道用 incr ,但是我想说的 php ---> redis --> mysql 一整套啊、哥
    sun2920989
        6
    sun2920989  
       2015-09-09 11:28:56 +08:00
    @snailsir redis 有持久化 为啥还要存进 mysql 或者说既然有 mysql 为啥用 redis 做计数
    songco
        7
    songco  
       2015-09-09 11:35:05 +08:00   1
    计数系统不需要非常精确, 可以直接写 redis, 然后定期从 redis 同步到数据库, 比如每小时一次.
    kslr
        8
    kslr  
       2015-09-09 11:35:21 +08:00 via iPad
    Redis 关于计数器有文档的,你可以到 Incr 那一栏看下
    snailsir
        9
    snailsir  
    OP
       2015-09-09 11:37:33 +08:00
    @sun2920989 啊,这个不是太懂,所以问问大家是怎么弄的啊 [挠头]

    现在想的是用 redis 分担 mysql 的压力(单纯计数这块),其余的还是要存在 mysql 里
    shiny
        10
    shiny  
    PRO
       2015-09-09 11:38:00 +08:00
    楼主是知乎上多了吧,这还能优雅啊?
    snailsir
        11
    snailsir  
    OP
       2015-09-09 11:39:58 +08:00
    @songco 嗯,这个定期从 redis 同步到数据库,怎么搞呢? 定时脚本吗?
    songco
        12
    songco  
       2015-09-09 11:43:28 +08:00
    @snailsir 这是很简单的操作吧, 随便什么语言都很容易实现... redis 各种 client 都有: http://redis.io/clients
    iyangyuan
        13
    iyangyuan  
       2015-09-09 11:45:11 +08:00 via iPhone
    redis 本身就有持久化,而且可以高速缓存,为啥非要往 mysql 里同步?你要再不放心可以主备,甚至可以集群。想同步肯定得自己写代码,估计 redis 没有实现这种需求
    broadliyn
        14
    broadliyn  
       2015-09-09 12:12:14 +08:00   1
    @snailsir 后台写个定时任务去读取 redis 中计数相关的 K-V 结构,然后保存到 mysql 中
    broadliyn
        15
    broadliyn  
       2015-09-09 12:12:58 +08:00
    redis 本身就可以做数据库,好多人都把 redis 当成只能做 cache 了。
    tms
        16
    tms  
       2015-09-09 12:16:55 +08:00
    975 visits today | 730301 visits total with 585772 hit & 144416 miss | This is the 30 times you came here
    博客的统计,用 redis 做的,访问统计和缓存命中统计。日期存两层 key , ip 转 10 进制做 key 或者 hkey 。再存一个总数。基本只用到了 incr 而已。
    a398058068
        17
    a398058068  
       2015-09-09 12:18:25 +08:00
    redis 的 SortedSet
    est
        18
    est  
       2015-09-09 12:18:39 +08:00
    没人用 influxdb ?
    a398058068
        19
    a398058068  
       2015-09-09 12:19:23 +08:00
    an0nymous.coding.io/blogcontent?id=49 这里有一篇关于 redis 的文章
    snailsir
        20
    snailsir  
    OP
       2015-09-09 13:32:22 +08:00
    @broadliyn 哦,也就是这样的了?

    php ----> redis ----cron---> mysql
    snailsir
        21
    snailsir  
    OP
       2015-09-09 13:35:48 +08:00
    @tms 对,我想说的前面展示大概就是这子的。

    这里就只用了 redis ,没有将数据存到 mysql 里吗?

    这样的话,一个网站的数据不就分成了两份东西了吗
    iyaozhen
        22
    iyaozhen  
       2015-09-09 13:45:04 +08:00
    @snailsir 分成多份了没啥问题呀。还保险些。你要存进 MySQL 的话就一个小时存一次呗。
    snailsir
        23
    snailsir  
    OP
       2015-09-09 14:43:01 +08:00
    @a398058068 文章很好,说了很多 redis 的应用方面,但是
    snailsir
        24
    snailsir  
    OP
       2015-09-09 14:44:52 +08:00
    @iyaozhen 我就觉得很分散是因为备份的话,感觉会比较费劲,万一漏了。。。。。

    一小时一次指的就是 crontab 定时脚本喽
    wingoo
        25
    wingoo  
       2015-09-09 14:47:32 +08:00   1
    1. 累计此次定时同步, 比如 10 的倍数存一次, 具体多少要看你的量
    2. cronjob
    phx13ye
        26
    phx13ye  
       2015-09-09 17:08:08 +08:00   1
    scheduler 执行程序

    c = redisClient.get ("foo_count")
    mysqlClient.execute ("UPDATE SET count = ? WHERE name = foo", c )
    msg7086
        27
    msg7086  
       2015-09-10 03:30:23 +08:00
    @iyangyuan 被谁随便连上了 flush 一下就好看了。
    snailsir
        28
    snailsir  
    OP
       2015-09-10 09:32:52 +08:00
    @wingoo

    1. 是用定时任务检测值,比如符合 10 的倍数就存到数据库,不符合就不存?
    2. cronjob 不是 crontab 吗?
    snailsir
        29
    snailsir  
    OP
       2015-09-10 09:36:46 +08:00
    @phx13ye scheduler 是什么? 下面的示例我可以理解为

    一个 php 脚本,先执行 从 redis 的读取,然后再将值更新到 mysql 中?

    这样的话,我大概就很明白了 :)
    snailsir
        30
    snailsir  
    OP
       2015-09-10 09:39:21 +08:00
    @msg7086

    ????
    phx13ye
        31
    phx13ye  
       2015-09-10 09:39:35 +08:00
    @snailsir 你程序里的定时任务调度器,你也可以用 cron+bash 脚本
    snailsir
        32
    snailsir  
    OP
       2015-09-10 09:41:29 +08:00
    @phx13ye 哦,了解了。谢谢啊 :)
    msg7086
        33
    msg7086  
       2015-09-10 09:50:07 +08:00
    @snailsir 我回的 13 楼。
    wingoo
        34
    wingoo  
       2015-09-10 10:33:59 +08:00
    @snailsir
    1. 不是, 是你程序中进行 redis 累加之后, 立即判断当前的值
    2.是 crontab, 需要写个脚本
    snailsir
        35
    snailsir  
    OP
       2015-09-10 11:31:06 +08:00
    @wingoo 哦,那么
    1. 立即判断当前值,符合条件时然后往 mysql 里搞吗? 那还要 2 的定时任务做什么呢
    wingoo
        36
    wingoo  
       2015-09-10 12:47:42 +08:00
    @snailsir 2 种方案
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2904 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 36ms UTC 14:37 PVG 22:37 LAX 06:37 JFK 09:37
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86