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

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

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

    如题,想听听大家都怎么搞的,有 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
        1
    broadliyn   2015-09-09 11:09:16 +08:00
    当然是 K-V 还能怎么搞?
    redis 的 incr 和 decr 都是原子操作,
        2
    wupher   2015-09-09 11:11:23 +08:00
    折腾用 MongoDB 打造一个优异的计数系统。
        3
    snailsir   2015-09-09 11:11:44 +08:00
    @broadliyn 然后怎么往 mysql 里搞呢?
        4
    sun2920989   2015-09-09 11:12:20 +08:00
    incr
        5
    snailsir   2015-09-09 11:15:08 +08:00
    @sun2920989 我知道用 incr ,但是我想说的 php ---> redis --> mysql 一整套啊、哥
        6
    sun2920989   2015-09-09 11:28:56 +08:00
    @snailsir redis 有持久化 为啥还要存进 mysql 或者说既然有 mysql 为啥用 redis 做计数
        7
    songco   2015-09-09 11:35:05 +08:00   ♥ 1
    计数系统不需要非常精确, 可以直接写 redis, 然后定期从 redis 同步到数据库, 比如每小时一次.
        8
    kslr   2015-09-09 11:35:21 +08:00 via iPad
    Redis 关于计数器有文档的,你可以到 Incr 那一栏看下
        9
    snailsir   2015-09-09 11:37:33 +08:00
    @sun2920989 啊,这个不是太懂,所以问问大家是怎么弄的啊 [挠头]

    现在想的是用 redis 分担 mysql 的压力(单纯计数这块),其余的还是要存在 mysql 里
        10
    shiny   2015-09-09 11:38:00 +08:00
    楼主是知乎上多了吧,这还能优雅啊?
        11
    snailsir   2015-09-09 11:39:58 +08:00
    @songco 嗯,这个定期从 redis 同步到数据库,怎么搞呢? 定时脚本吗?
        12
    songco   2015-09-09 11:43:28 +08:00
    @snailsir 这是很简单的操作吧, 随便什么语言都很容易实现... redis 各种 client 都有: http://redis.io/clients
        13
    iyangyuan   2015-09-09 11:45:11 +08:00 via iPhone
    redis 本身就有持久化,而且可以高速缓存,为啥非要往 mysql 里同步?你要再不放心可以主备,甚至可以集群。想同步肯定得自己写代码,估计 redis 没有实现这种需求
        14
    broadliyn   2015-09-09 12:12:14 +08:00   ♥ 1
    @snailsir 后台写个定时任务去读取 redis 中计数相关的 K-V 结构,然后保存到 mysql 中
        15
    broadliyn   2015-09-09 12:12:58 +08:00
    redis 本身就可以做数据库,好多人都把 redis 当成只能做 cache 了。
        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 而已。
        17
    a398058068   2015-09-09 12:18:25 +08:00
    redis 的 SortedSet
        18
    est   2015-09-09 12:18:39 +08:00
    没人用 influxdb ?
        19
    a398058068   2015-09-09 12:19:23 +08:00
    an0nymous.coding.io/blogcontent?id=49 这里有一篇关于 redis 的文章
        20
    snailsir   2015-09-09 13:32:22 +08:00
    @broadliyn 哦,也就是这样的了?

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

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

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

    一小时一次指的就是 crontab 定时脚本喽
        25
    wingoo   2015-09-09 14:47:32 +08:00   ♥ 1
    1. 累计此次定时同步, 比如 10 的倍数存一次, 具体多少要看你的量
    2. cronjob
        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 )
        27
    msg7086   2015-09-10 03:30:23 +08:00
    @iyangyuan 被谁随便连上了 flush 一下就好看了。
        28
    snailsir   2015-09-10 09:32:52 +08:00
    @wingoo

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

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

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

    ????
        31
    phx13ye   2015-09-10 09:39:35 +08:00
    @snailsir 你程序里的定时任务调度器,你也可以用 cron+bash 脚本
        32
    snailsir   2015-09-10 09:41:29 +08:00
    @phx13ye 哦,了解了。谢谢啊 :)
        33
    msg7086   2015-09-10 09:50:07 +08:00
    @snailsir 我回的 13 楼。
        34
    wingoo   2015-09-10 10:33:59 +08:00
    @snailsir
    1. 不是, 是你程序中进行 redis 累加之后, 立即判断当前的值
    2.是 crontab, 需要写个脚本
        35
    snailsir   2015-09-10 11:31:06 +08:00
    @wingoo 哦,那么
    1. 立即判断当前值,符合条件时然后往 mysql 里搞吗? 那还要 2 的定时任务做什么呢
        36
    wingoo   2015-09-10 12:47:42 +08:00
    @snailsir 2 种方案
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   972 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 28ms · UTC 21:20 · PVG 05:20 · LAX 13:20 · JFK 16:20
    ♥ Do have faith in what you're doing.