Redis实现千万级别点赞数据计数(redis 点赞 计数)

Redis实现千万级别点赞数据计数

在现今社交媒体高速发展的时代,点赞已成为一种越来越普遍的文化现象,伴随着此消费升级趋势,点赞计数技术也已成为一个关键问题。其中一个常见方案是使用Redis,我们将在本文中探讨如何使用Redis实现千万级别的点赞数据计数。

我们需要了解Redis基本数据类型中的计数器类型–inc. 它使我们可以通过命令直接增加一个特定key的值。如下显示Redis incr命令的使用方式:

> SET counter 0
OK
> INCR counter
1
> INCR counter
2
> INCR counter
3

假如我们需要为每个文章创建一个一个点赞计数器,我们可以按照以下方式实施:

我们需要确保我们有一个带有article:ID:votes结构的计数器。在此结构中,ID是我们所谓的文章ID,votes是文章ID的投票数。 这很容易用Redis的哈希类型实现,如下所示:

redis-cli> HSET article:12345 votes 0

下一步是使用incr操作增加文章ID的投票数:

redis-cli> INCR article:12345:votes

当数据集增长时,我们可能需要为查询文章投票计数器而存储的所有文章ID创建单独的集合。 然后,您可以使用以下命令基于排序:

redis-cli> ZADD articles 1000 12345
redis-cli> ZADD articles 2000 67890

这将告诉Redis按分数顺序存储这些ID。由于我们不需要任何特定的分数,仅仅是排序并通过它们来调用相关联的文章ID,我们可以使用时间戳作为分数。

我们将实现一个具有前端交互功能的完整示例,可以用于点赞计数器和文章阅读量计数器。

我们需要使用flask框架设置一个本地服务:

“`python

from flask import Flask, render_template, request, redirect, url_for

app = Flask(__name__)

@app.route(‘/’)

def index():

return render_template(‘index.html’)

app.run(debug=True)


下一步是创建一个与Redis交互的helper函数:

```python

from redis import Redis

redis = Redis(host='redis', port=6379)

from datetime import datetime

def update_counter(request):
redis.incr(request.form['id'] + ':votes')
redis.zadd('articles', {request.form['id']:datetime.utcnow().timestamp()})

def get_votes(id):
return int(redis.get(id + ':votes'))
def article_exists(id):
return redis.exists(id + ':votes')
def get_top_articles():
article_ids = redis.zrevrangebyscore('articles', min='+inf', max='-inf', start=0, num=5)
return [(id.decode('utf-8'), get_votes(id)) for id in article_ids]

```

接下来,我们需要实现相应的HTML和JavaScript代码,以使网站和用户可以维护和更新文章的阅读量和点赞数。

Html代码:

```html



Welcome!





Article List






Top Articles










integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smX/Kp4VqnC+diYB9HdpevJ6O"
crossorigin="anonymous">


$.get('get_articles', (data) => {
let article_list = $('#article-list');
$.each(data, (index, val) => {
article_list.append('
  • '+val[0]+' Votes:'+`${val[1]}`+'
  • ');
    });
    });

    $.get('get_top_articles', (data) => {
    let top_articles_list = $('#top-articles-list');
    $.each(data, (index, val) => {
    top_articles_list.append('
  • '+val[0]+' Votes:'+`${val[1]}`+'
  • ');
    });
    });




    JavaScript代码:

    “`js

    $(document).ready(function () {

    $(‘#vote-form’).on(‘submit’, function (event) {

    event.preventDefault();

    $.post(‘/vote’, $(this).serialize(), function () {

    alert(‘Successfully voted!’);

    });

    });

    $(‘#create-article-form’).on(‘submit’, function (event) {

    event.preventDefault();

    $.post(‘/create_article’, $(this).serialize(), function () {

    alert(‘Created new article!’);

    });

    });

    });


    可以看到,使用Redis进行点赞计数器和文章阅读量计数器的实现并不复杂。这种技术已经被广泛运用在社交媒体、新闻网站等多个领域,在亿级数据规模下都能够保证良好的性能。如果你的应用需要进行这些计数,那么Redis无疑是一个了不起的工具。

    完整代码可以在 https://github.com/nicejade/Redis-article-vote-demo 中获取。

    参考文献:

    1. HowToForge学院。Redis入门:学习使用Redis存储键/值,数据类型和结构。Retrived from https://www.howtoforge.com/redis-getting-started-storing-key-value-data-types-and-structures/
    2. 阮一峰。Redis 教程。Retrieved from http://www.ruanyifeng.com/blog/2017/08/redis.html
    3. 优果学院。Redis实战。Retrieved from https://www.uguoquan.com/category/redis
    4. Flask教程。Retrived from https://www.twilio.com/blog/how-to-build-a-python-flask-app-with-docker

    数据运维技术 » Redis实现千万级别点赞数据计数(redis 点赞 计数)