Code Ease Code Ease
  • 个人博客网站 (opens new window)
  • 好用的工具网站 (opens new window)
  • Java核心基础
  • 框架的艺术
  • 分布式与微服务
  • 开发经验大全
  • 设计模式
  • 版本新特性
数据库系列
大数据+AI
  • xxl-job
运维与Linux
  • 基于SpringBoot和BootStrap的论坛网址
  • 基于VuePress的个人博客网站
  • 基于SpringBoot开发的小功能
  • 做一个自己的IDEA插件
程序人生
关于我
  • 分类
  • 标签
  • 归档

神秘的鱼仔

你会累是因为你在走上坡路
  • 个人博客网站 (opens new window)
  • 好用的工具网站 (opens new window)
  • Java核心基础
  • 框架的艺术
  • 分布式与微服务
  • 开发经验大全
  • 设计模式
  • 版本新特性
数据库系列
大数据+AI
  • xxl-job
运维与Linux
  • 基于SpringBoot和BootStrap的论坛网址
  • 基于VuePress的个人博客网站
  • 基于SpringBoot开发的小功能
  • 做一个自己的IDEA插件
程序人生
关于我
  • 分类
  • 标签
  • 归档
服务器
  • MySQL

  • Redis

    • 入门redis看这一篇就够了
    • redis入门到精通系列(二):redis操作的两个实践案例
      • key的通用操作和redis内部db的通用操作
      • Jedis--使用java操作redis详解
      • redis的持久化看这一篇就够了
      • redis的事务详解
      • redis高级数据类型详解
      • redis的高可用--主从复制详解
      • redis哨兵模式详解
      • springboot快速集成redis
      • redis的缓存穿透、缓存击穿以及缓存雪崩
      • 看完这一篇文章别再说不懂布隆过滤器
    • MongoDB

    • 数据库系列
    • Redis
    CodeEase
    2023-10-09
    目录

    redis入门到精通系列(二):redis操作的两个实践案例

    作者:鱼仔
    博客首页: codeease.top (opens new window)
    公众号:Java鱼仔

    在前面一篇博客中我们已经学完了redis的五种数据类型操作,回顾一下,五种操作类型分别为:字符串类型(string)、列表类型(list)、散列类型(hash)、集合类型(set)、有序集合类型(sorted_set)。学完基础语法操作后下一步就是通过几个案例来实践操作一下redis。在这里不会采用任何其他语言,单纯使用redis进行模拟操作。

    # (一)实例一:请求调用次数的限制

    应用场景:我们都知道服务器的资源总是有限的,因此如果想要让一个网站崩溃的方法之一就是无限次访问调用服务器的资源。当然了,现在的网站肯定都会有应对措施,比如熔断等操作。应对这种一个人频繁访问服务器的情况,还有一种解决方法是限制单个用户在一个时间段内调用的次数。

    思路:我们可以限制单个用户在一分钟内只能调用十次,

    1.设计一个计数器,记录调用的次数,把用户id作为key,调用次数作为value

    2.在调用前获取次数,如果为nil,则以id为key,设置调用次数为1,生命周期为60秒;反之如果存在该key,如果value小于10,则加1;value等于10,则禁止访问。

    实践:假设用户的id为123

    //首先获取123的值,如果为空,则设置值为1,周期为60s
    get 123
    setex 123 60 1
    //如果值不为空且小于10,则加1
    get 123
    incr 123
    
    1
    2
    3
    4
    5
    6

    这里判断值是否大于10由后端逻辑控制,在这里不做讲解

    2-1.jpg

    进一步优化:用这种方式限制访问次数有一点小小的缺点:每次取到值后都要先判断是否小于10。我们可以转换一下思路,string类型存在最大值9223372036854775807,我们只需要设置设置第一次访问的值为最大值-10,当超过最大值时,redis会发起异常,通过异常来限制调用次数

    实践:

    get 123
    setex 123 60 9223372036854775797
    incr 123
    
    1
    2
    3

    # (二)实例二:微信消息排列顺序

    应用场景:手机接受微信消息会按最后一条消息的发送时间由近到远排序,同时置顶的消息永远会排在非置顶之前。这个功能就可以通过redis来实现。

    思路:用两个list数据类型存放消息通知(用户id),一个list用来存放置顶消息,另一个list用来存放非置顶消息,再用一个string类型存放置顶用户。

    1.当有人发来消息时,首先查看是否是置顶用户(这一步用后端逻辑实现),再分别存放到两个list中

    2.我们把list看作一个栈,先进后出。当一个用户发来消息时,先删除list中该用户,再添加该用户。这一步的目的是始终保持最后发来消息的人排在最前。

    实践:假设有4个人,a b c d,模拟a的微信,因为置顶和非置顶的操作一样,这里先不考虑

    消息顺序为bccdb

    2-2.jpg

    # (三)总结

    这里只是对redis进行了简单的案例实践,但是逻辑可以应用到实际环境下。

    上次更新: 2025/04/29, 17:22:06
    入门redis看这一篇就够了
    key的通用操作和redis内部db的通用操作

    ← 入门redis看这一篇就够了 key的通用操作和redis内部db的通用操作→

    最近更新
    01
    AI大模型部署指南
    02-18
    02
    半个月了,DeepSeek为什么还是服务不可用
    02-13
    03
    Python3.9及3.10安装文档
    01-23
    更多文章>
    Theme by Vdoing | Copyright © 2023-2025 备案图标 浙公网安备33021202002405 | 浙ICP备2023040452号
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式