当前位置:首页 > 问答 > 正文

用redis自己动手搞个简单程序,轻松上手不复杂

想用Redis搞点东西,但又觉得它听起来像个高大上的专业工具,有点无从下手?别担心,今天咱们就完全抛开那些复杂的理论,直接动手做一个实实在在的小程序,这个东西你肯定用过类似的:一个简单的网站访问计数器和一个最热文章排行榜,对,就这两个小功能,但用Redis来做,你会体会到它“快”得有多离谱。

第一步:先把场子搭起来

你当然得有个Redis,别怕,这比你装个普通软件还简单,去Redis官网(来源:redis.io)下载最新版本,或者如果你用Mac,用homebrew一句命令brew install redis就搞定了,安装好后,在终端里输入redis-server,看到那个漂亮的红色logo跑起来,说明服务器启动成功了,别关这个窗口,让它开着,再开一个新的终端窗口,输入redis-cli,这就是我们和Redis对话的命令行工具,好了,舞台搭好,演员就位。

第二步:理解Redis是个啥“万能盒子”

你可以把Redis想象成一个放在内存里的、结构特别多的“万能储物架”,它为啥快?因为所有东西都放在内存里,CPU直接就能拿到,比去硬盘里翻找快成千上万倍,它不像MySQL那种数据库,得先设计复杂的表结构,Redis的“储物架”有几种固定的格子:

  • 字符串(String):就像一个小格子,放一个值,比如数字或者短文本。
  • 哈希(Hash):像一个带很多小抽屉的盒子,可以存一组键值对,比如一个用户的姓名、年龄、邮箱。
  • 列表(List):像一条队伍,数据一个接一个排队,可以从头或尾放进去、拿出来。
  • 集合(Set):像一个不允许重复的袋子,你扔进去的东西是无序的,但每个东西只能有一份。
  • 有序集合(Sorted Set):这是Redis的王牌!它也是个不允许重复的袋子,但每个东西都带一个分数(score),可以根据分数自动排序,排行榜功能就靠它。

今天我们的两个小功能,主要就用“字符串”和“有序集合”这两种格子。

第三趴:动手写代码——访问计数器

假设你有个博客网站,你想在首页显示“您是第XXXX位访问者”,用传统数据库,每次有人访问,你都得:1. 查询当前的计数;2. 给这个数加一;3. 再写回数据库,三步操作,数据库压力大,速度也慢。

用Redis呢?简单到哭,在Redis里,我们用一个叫INCR的命令就行了,我们给计数器起个名字,比如website:visits

redis-cli里,你直接输入:

INCR website:visits

Redis会返回(integer) 1,你再输入一次,它返回(integer) 2,看到了吗?一句话,一个动作,原子性(就是说不会两个人同时操作导致数字错乱)地完成增加,你根本不用管它现在是多少,Redis自己帮你搞定。

在真正的程序里,比如用Python写(先pip install redis安装Python的Redis库),代码也就这么几行:

import redis
# 连接到本地的Redis服务器
r = redis.Redis(host='localhost', port=6379, db=0)
# 有人访问首页了,计数器+1
visit_count = r.incr('website:visits')
print(f"欢迎!您是第{visit_count}位访问者。")

就这么简单,一个高性能的计数器就做好了,无论你的网站访问量多大,这个操作都能瞬间完成。

第四趴:动手写代码——最热文章排行榜

这个功能稍微复杂一丢丢,但用Redis的“有序集合”依然很简单,思路是:每篇文章有一个ID,比如article:1001,每当有人阅读一篇文章,我们就给这篇文章的“分数”加1,有序集合会自动根据分数从高到低排序。

这里要用到有序集合的命令ZINCRBY(按增量增加分数)。

假设有三篇文章,ID分别是1001, 1002, 1003。

  1. 用户读了文章1001,在redis-cli里输入:

    ZINCRBY article:ranking 1 article:1001

    (意思是:给有序集合article:ranking里的成员article:1001增加1分)

  2. 又有人读了文章1003,同样操作:

    ZINCRBY article:ranking 1 article:1003
  3. 现在想看看排行榜前10名是谁?用ZREVRANGE命令(按分数从高到低取范围):

    ZREVRANGE article:ranking 0 9 WITHSCORES

    (意思是:取出排名从0到9的成员,并且把分数也带上)

Redis就会返回类似这样的结果:

  1. "article:1001"
  2. "2"
  3. "article:1003"
  4. "1" (假设1001被读了两次)

用Python代码来实现阅读和查看排行榜:

import redis
r = redis.Redis(host='localhost', port=6379, db=0)
# 模拟用户阅读文章ID为1001
article_id = "article:1001"
r.zincrby("article:ranking", 1, article_id)
print(f"文章 {article_id} 阅读量+1")
# 获取阅读排行榜前10名
top_articles = r.zrevrange("article:ranking", 0, 9, withscores=True)
print("最热文章排行榜:")
for rank, (article, score) in enumerate(top_articles, start=1):
    print(f"第{rank}名: {article.decode()}, 阅读量: {int(score)}")

第五趴:总结一下你学到了啥

你看,我们没写一行SQL,没设计一个数据表,就用Redis这么个“万能储物架”,轻松实现了两个非常实用的web功能,关键它性能极高,因为所有操作都在内存里完成。

通过这个动手过程,你其实已经摸到了Redis最核心的精华:

  1. 它是基于键值对的,但值可以有丰富的数据结构。
  2. 它提供了原子操作,像INCRZINCRBY,简单又安全。
  3. 它处理排序、计数这类场景是天然优势,速度快到飞起。

下次当你再遇到需要快速计数、排行榜、缓存热点数据(比如把复杂的查询结果暂时放在Redis里,下次直接取)、秒杀库存扣减等场景时,你就可以自信地掏出Redis这个神器了,上手用的最佳方式就是像我们今天这样,从一个实实在在的小目标开始捣鼓。

用redis自己动手搞个简单程序,轻松上手不复杂