redis使用场景

使用场景

最近联系人列表

维护长度为 100 的最近联系人列表

  1. 如果指定的联系人已在列表中,则从列表中移除 (lrem) lrem list 1 mobile
  2. 将指定的联系人添加到列表最前面 (lpush) lpush list mobile
  3. 如果添加完成后,列表长度超过 100 ,则对列表进行修剪,仅保留列表前面的 100 个联系人 (ltrim) ltrim list 0 99

限制短信频率,比如同一手机号60分钟之内只能发送3条

限制短信频率,同一手机号60分钟之内只能发送3条

精华版采用队列实现

local lKey = KEYS[1] -- 列表键,比如直接使用手机号
local maxCount = tonumber(ARGV[1]) --一定时间内短信最多发送条数
-- 当前时间戳,毫秒
local currentTime = tonumber(ARGV[2])
-- 一段时间:一分钟、一小时、一天,毫秒
local period = tonumber(ARGV[3])
-- 查看当前队列大小。
local lSize = redis.call("llen", lKey)

-- 说明一段时间内队列未满,直接压入队列,返回 1,表示可以发送短信
local flag = false
if lSize < maxCount then
    -- 记录短信的发送时间(毫秒)
    redis.call("lpush", lKey, currentTime)
    flag = true
else
    -- 取队列当中最早一条短信的发送时间,拿当前时间减去此时间,如果超过“一段”时间,则可以移掉,并压入当前短信时间。
    local oldestTime = tonumber(redis.call("lindex", lKey, -1))
    local result = currentTime - oldestTime
    -- 当前时间与第一条短信的发送时间间隔大于“周期”,才可继续发送
    if result > period then
        redis.call("rpop", lKey) -- 弹出队列中最早一条短信发送时间
        redis.call("lpush", lKey, currentTime) -- 压入最新一条短信的发送时间
        flag = true
    end
end
-- 刷新键的过期时间为“一段”时间。
redis.call("expire", lKey, period/1000)
-- flag: true 表示可以发送短信,false 则不能发送短信
if flag then
    return 1
end
return 0

简陋版

--[[ 实现访问频率的脚本.
 参数:  KEY[1] 用来标识同一个用户的id
 ARGV[1] 过期时间
 ARGV[2] 过期时间内可以访问的次数
 返回值: 如果没有超过指定的频率, 则返回1; 否则返回0 ]]
local times = redis.call('incr', KEYS[1])
if times == 1 then  -- 说明刚创建, 设置生存时间
    redis.call('expire', KEYS[1], ARGV[1])
end
if times > tonumber(ARGV[2]) then
  return 0
end

return 1

队列实现

一、非阻塞消费队列

生产者rpush或lpush
消费者lpop或rpop

二、阻塞消费队列

生产者rpush或lpush
消费者blpop或brpop
一、二两种实现有丢掉消息的风险,当消费者网络问题或消费的过程中出现异常,消息会丢掉。

三、可靠消费队列

生产者rpush或lpush
消费者端增加一个辅助列表(处理中列表processing list),消费者消费消息的时候采用命令love messageList processingList right left,当消费处理完了,从处理中列表移走处理好的消息lrem processingList 1 element。由于lmove是原子操作,所以不会丢失消失。最好另开一个线程用于监视processingList列表,如果滞留processingList列表时间过长,视场景处理。

三、优先级队列

blpop或brpop可以给定多个列表作为弹出操作的执行对象。把优先级高的队列放在第一个参数,优先级中等的队列放在第二个参数,优先级低等的队列放在第三个队列。这样就可以通过多个队列实现优先级特性。

四、延迟队列

延迟队列,需要采用有序集合(delay_queue)和任务队列(task_list)来实现。
有序集合的分值,记录为延迟任务的时间戳;
用一个或多个线程使用当前时间作为分值,不断的循环在有序集合中查找可执行的延迟任务,每次最多取一批100条。
zremrangebyscore delay_queue 0 currentTimeStamp
把查出的延迟任务,放入任务队列。

https://www.jianshu.com/p/d32...

7 声望
0 粉丝
0 条评论
推荐阅读
mysql install
名称值操作系统CentOS Linux release 7.8.2003 (Core)mysql5.7.27mysql包存放路径/hom/software/mysql-5.7.27-linux-glibc2.12-x86_64.tar.gzmysql 下载链接[链接]mysql 安装参考:[链接]安装需要的rpm包,yum in...

NewBie阅读 513

如何选择适合你的微服务 API 网关:对比 Kong、APISIX、Tyk、Apigee 和其他网关
API 网关并非一个新兴的概念,在十几年前就已经存在了,它的作用主要是作为流量的入口,统一的处理和业务相关的请求,让请求更加安全、快速和准确的得到处理。它有以下传统的功能:

API7_技术团队8阅读 9k评论 2

Redis的线程模型和事务
我原本只是想学习Redis的事务,但后来发现,Redis和传统关系型数据库的事务在ACID的表现上差异很大。而要想详细了解其中的缘由,就离不开Redis独特的单线程模型,因此本文将二者联系在一起讲解。

KerryWu6阅读 6.2k评论 2

又一款内存数据库横空出世,比 Redis 更强,性能直接飙升一倍!杀疯了
KeyDB是Redis的高性能分支,专注于多线程,内存效率和高吞吐量。除了多线程之外,KeyDB还具有仅在Redis Enterprise中可用的功能,例如Active Replication,FLASH存储支持以及一些根本不可用的功能,例如直接备份...

民工哥4阅读 1.7k评论 2

封面图
Redis分布式锁的实现
很多新手将 分布式锁 和 分布式事务 混淆,个人理解:锁 是用于解决多程序并发争夺某一共享资源;事务 是用于保障一系列操作执行的一致性。我前面有几篇文章讲解了分布式事务,关于2PC、TCC和异步确保方案的实现...

KerryWu4阅读 7.1k评论 2

Redis集群介绍及测试思路
Redis集群一般有四种方式,分别为:主从复制、哨兵模式、Cluster以及各大厂的集群方案。在3.0版本之前只支持单实例模式,3.0之后支持了集群方式。在3.0之前各大厂为了解决单实例Redis的存储瓶颈问题各自推出了自...

京东云开发者2阅读 474

封面图
Windows环境下搭建Redis集群
最近因项目需要搭建Redis集群。查找了一些相关博文和资料,踩了不少坑。下面是本人总结的Redis集群搭建步骤和搭建过程中遇到的坑,希望对大家有帮助。篇幅有点长,请耐心看。

张三行阅读 5.6k

7 声望
0 粉丝
宣传栏