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

Redis查询那些基本操作怎么用,实战里边一步步带你上手掌握

想学会用Redis,光看理论不行,得动手,咱们就假设你是个电商网站的开发者,我来一步步带你用Redis解决几个实际问题,操作自然就记住了,你得在电脑上安装好Redis,并启动它,启动后,在命令行输入 redis-cli,就进入了Redis的“对话模式”,后面所有的命令都是在这里面敲的。

第一战:缓存用户信息(Set 和 Get 的应用)

来源:《Redis实战》中经常以缓存作为入门案例。

你的网站每次显示用户主页,都要从MySQL数据库里查一次用户信息,比如名字、邮箱,如果访问量很大,数据库就撑不住了,这时就用Redis做缓存。

  • 操作1:存数据(SET) 想象用户“张三”的ID是1001,他的信息可以存成一个JSON字符串,命令很简单:

    SET user:1001 '{"name":"张三", "email":"zhangsan@example.com"}'

    敲回车,如果返回 OK,就说明存成功了,这里 user:1001 就是你给这把“钥匙”起的名字,叫键(Key),后面的一长串JSON是值(Value),Key的名字最好有规律,比如用冒号分隔,这样好管理。

  • 操作2:取数据(GET) 前端需要显示用户1001的信息,你不用查数据库了,直接问Redis要:

    GET user:1001

    回车后,刚才存的那串JSON就显示出来了,这个过程比查数据库快几十上百倍。

  • 操作3:给数据加个“保质期”(EXPIRE) 缓存不能永远有效,万一用户在数据库里改了名字,你缓存里的还是旧的就不对了,所以我们要设置一个过期时间,比如10分钟。

    EXPIRE user:1001 600

    这里的600就是600秒,10分钟后,这个键会自动被Redis删除,你也可以在存数据的时候直接设置过期,用 SETEX user:1001 600 '...JSON...' 命令一步到位。

第二战:统计每日活跃用户(SADD 和 SCARD 的应用)

来源:Redis官方文档中Set类型的典型使用场景。

老板想知道今天有多少不同的用户登录了网站,用数据库去重计数很麻烦,用Redis的集合(Set)就特别简单,集合的特点是里面的元素都是唯一的,自动去重。

  • 操作1:用户登录时“报个到”(SADD) 假设今天是2024年5月21日,用户1001登录了:

    SADD active_users:20240521 1001

    用户1002也登录了:

    SADD active_users:20240521 1002

    如果用户1001一天内多次登录,你再执行一次 SADD active_users:20240521 1001,集合里也只会有一个1001,不会重复。

    Redis查询那些基本操作怎么用,实战里边一步步带你上手掌握

  • 操作2:下班前统计总数(SCARD) 到了晚上,你想看看今天到底有多少独立用户登录了:

    SCARD active_users:20240521

    这个命令会返回一个数字,比如25800,意思是今天有25800个活跃用户,非常简单直接。

第三战:商品排行榜(ZADD 和 ZRANGE 的应用)

来源:常见于电商和游戏排行榜设计文章。

你的网站卖商品,需要做一个“热度排行榜”,根据销量排序,Redis的有序集合(Sorted Set)完美适合这个场景,它能为每个元素(比如商品ID)设置一个分数(score),并根据分数排序。

  • 操作1:商品卖出,增加分数(ZADD) 商品5001卖出了一件,给它加1分:

    ZADD hot_rank 1 5001

    商品5002卖出了三件,一次性加3分:

    ZADD hot_rank 3 5002

    如果商品5001又卖出了5件,你可以再次执行 ZADD hot_rank 5 5001,但这样会覆盖原来的分数为5,我们是想增加,所以用更聪明的命令:

    Redis查询那些基本操作怎么用,实战里边一步步带你上手掌握

    ZINCRBY hot_rank 5 5001

    这个命令会给商品5001的分数增加5,现在它的分数就是1+5=6了。

  • 操作2:展示前十名(ZRANGE) 要获取销量前十的商品:

    ZRANGE hot_rank 0 9 WITHSCORES

    0 9 表示从第0名到第9名(也就是前十)。WITHSCORES 选项会把商品的分数也显示出来,返回的结果会按照分数从低到高排列,如果你想要从高到低排列,用 ZREVRANGE 命令。

第四战:限制短信验证码发送频率(INCR 和 EXPIRE 的组合拳)

来源:网络开发中常见的防刷机制。

为了防止恶意用户频繁获取短信验证码,你需要限制一个手机号1分钟内只能发一次。

  • 操作1:请求发送时检查(INCR 和 TTL) 用户手机号13800138000请求发送验证码,你先检查一下:
    INCR sms_limit:13800138000

    INCR 命令会将这个键的值增加1,如果这个键不存在,它会先创建并设置为0,然后再加1,所以第一次执行会返回1。 紧接着,查看这个键的剩余生存时间:

    TTL sms_limit:13800138000

    如果返回 -2,说明键不存在(这是第一次发送),你需要设置过期时间:

    EXPIRE sms_limit:13800138000 60

    TTL 返回一个大于0的数(比如45),说明60秒还没过,此时你再看一下 INCR 返回的数字,如果大于1,就说明这个号码在短时间内已经请求过了,就拒绝发送。

通过上面这四个实战小例子,你已经用到了Redis最核心的字符串(String)、集合(Set)、有序集合(Sorted Set)这几种数据类型,以及SET、GET、EXPIRE、SADD、SCARD、ZADD、ZINCRBY、ZRANGE、INCR、TTL这些最常用的命令,最好的学习方法就是打开你的Redis-cli,把这些命令都敲一遍,感受一下,印象就深刻了。