V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
snailsir
V2EX  ›  Redis

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

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

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

    哦,当然会有 mysql

    第 1 条附言  ·  2015-09-10 11:39:33 +08:00
    有人发了一篇讨论 redis 的新帖,我觉得很好,记录学习一下,同时期待大家继续就本帖子畅所欲言哈、共同进步 :)
    https://www.v2ex.com/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  
       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   ·   实用小工具   ·   2046 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 00:28 · PVG 08:28 · LAX 16:28 · JFK 19:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.