Redis场景设计

目录

Sting存储

实现分布式锁

Hash数据场景

List数据场景

Set集合数据场景

Set集合特殊指令应用场景


Sting存储

  1. Key设计注意事项
    1. 一般以业务功能模块、表名或者业务模块开头,尽量短小精悍
  2. 常见引用场景
    1. 计数功能:文章点击数
      1. 各类场景下的标识号 incrby serialNo 1000:订单号
      2. 每次生成订单会去redis请求生成订单号,但是redis上限是10W/s请求量,如果高并发下会耗尽redis资源无法进行其它操作,解决方案是一次请求预先分配多个订单号缓存到tomcat,下次请求会优先用缓存中的订单号
    2. 集群环境下的Session共享
      1. 两次请求到不同tomcat,只有第一次tomcat有session,解决方案是把session会话存储到redis,下次登录会验证redis中session是否过期

实现分布式锁

  1. redis分布式锁基础知识
    1. 利用SETNX key value,key不存在返回true,如果key存在返回false实现
    2. 给定key设置的生存时间,当key过期时,它会被自动删除
    3. 用lua脚本原子性操作redis主动删除加锁值
  2. redis加锁正确姿势
    1. 加锁:通过setnx向特定的key写入一个随机值,并同时设置失效时间,写值成功既加锁成功SET key value NX PX 15000
      1. 失效时间避免死锁
      2. 加锁时,每个节点产生一个随机字符串,避免锁误删除
      3. 写入随机值与设置失效时间必须同时,保证加锁时原子性
  3. 解锁:匹配随机值,删除redis上的特点key数据,要保证获取数据、判断一致以及删除数据三个操作是原子的

Hash数据场景

  1. 淘宝购物车
    1. 全选功能-获取所有该用户的所有购物车商品:hgetall gouwuche:001
    2. 商品数量-购物车图标上要显示购物车里商品的总数:hget gouwuche:001 prod:001
    3. 删除-要能移除购物车里某个商品:hdel gouwuche:001 prod:001
    4. 增加或减少某个商品的数量:hincrby gouwuche:001 prod:001 5

List数据场景

  1. 阻塞队列:比如brpop,只有当redis没数据时候才会阻塞,有数据时候不会阻塞
  2. 订阅号消息:多个订阅号在不同时间发布消息通过下图展示,key为用户ID

Set集合数据场景

  1. 抽奖系统:key为活动ID

  1. 朋友圈点赞:key为朋友圈消息ID
    1. 如果用Set设计无法排序
    2. 可以用zset集合来设计

Set集合特殊指令应用场景

  1. 交集并集差集
    1. setA={A,B,C}     setB={B, C}
      1. 集合与集合之间的交集:sinter setA setB-->得到集合{B,C}
      2. 集合与集合之间的并集:sunion setA setB -->得到集合{A,B,C}
      3. 集合与集合之间的差集:sdiff  setA setB-->得到集合{A}
  2. 设计微博维关系设计
    1. James老师关注的人:sadd jamesCares lison peter king av
    2. Lison老师关注的人:sadd lisonCares james av cjk king
    3. av老师关注的人:sadd avCares deer cjk king
    4. James和lison共同关注的人:sinter jamesCares lisonCares,计算结果为 {av, king}
    5. 我关注的人也关注他(king老师)
      •  sismember lisonCares king
      • sismember avCares king 
    6. 我可能认识的人:SDIFF lisonCares jamesCares-> {james.cjk}
    7. 新闻热搜:key为日期,会出现值越来越大,可以适当分小时等分段操作
      1. 点击话题:zincrby topic:20201111 1 文章名称
      2. 实现前8排行榜:zrevrange topic:20201111 0 8 withscores
      3. 统计近3日点击数据:zunionstore topic:3day 3 topic:20201113 topic:20201112 topic:20201111
      4. 展示近3日的排行前8名:zrevrange topic:20201113-20201111 0 8 withscores
### Redis 常见应用场景及案例分析 Redis 是一种高性能的键值存储系统,支持多种数据结构操作,广泛应用于各种场景中。以下是 Redis 的一些典型应用场景及其案例分析: #### 1. 缓存服务 Redis 被广泛用于缓存层的设计,能够显著提升系统的响应速度并降低数据库负载。通过将热点数据加载到内存中的方式,Redis 提供了极高的读写性能[^1]。 - **案例**: 很多网站会利用 Redis 来缓存动态生成的内容(如新闻页面、商品详情页),从而减少对后端 MySQL 数据库的压力。例如,在电商平台上,用户访问频率较高的商品信息可以通过 Redis 进行缓存处理[^2]。 #### 2. 实时数据分析 由于其高效的计算能力和丰富的内置命令集,Redis 可以用来执行复杂的实时统计任务。通过对原始日志或事件流进行快速解析和汇总,企业可以获得即时洞察力[^3]。 - **代码示例** ```python import redis r = redis.Redis(host='localhost', port=6379, db=0) # 记录某个用户的点击次数 def record_click(user_id): r.incr(f"user:{user_id}:clicks") # 获取某段时间内的总点击数 def get_total_clicks(): total = 0 for key in r.scan_iter("user:*:clicks"): total += int(r.get(key)) return total ``` #### 3. 排行榜/计分板功能 借助于 Redis 的有序集合特性,“获取前 N 名”的需求变得异常简便高效。无论是游戏排行榜还是社交媒体上的点赞排行,都可以轻松实现毫秒级返回结果[^4]。 - **SQL 替代方案对比** 传统关系型数据库如果要完成相同的功能,则可能涉及大量复杂查询逻辑甚至临时表创建过程;而采用 Redis 后不仅简化了开发流程还极大提高了效率。 #### 4. 队列管理器 除了作为简单的消息队列外,还可以构建更高级别的工作分配机制比如延迟任务调度等。它允许开发者定义不同的优先级来控制任务执行顺序。 - **实际运用领域** 如订单状态更新通知推送服务当中就非常适合引入此类中间件解决方案以便更好地协调上下游资源调配情况。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值