当前位置: 首页 > 面试题库 >

Redis-是否有斑点

范承教
2023-03-14
问题内容

对于跨进程的数据通信,我打算使用Redis列表。生产者推送到列表,而一组使用者使用BRPOP消费列表内容。

为了限制列表的大小无限增长,我想将列表大小限制为固定值(例如1万个项目)。我很惊讶地没有找到像BLPUSH或BRPUSH这样的等效命令。这是Redis员工故意遗漏的吗?

因此,我假设我必须在推送之前使用Watch / multi创建一个Txn来检查列表大小。这是正确的方法还是可用的更好的技术?


问题答案:

我将为此功能使用lua脚本

接受一个键(列表名称),两个参数new_element_name和的LUA
max_size。返回值可以是返回值,也可以是列表已满时的LPUSH-1
这是执行此操作的脚本:

if tonumber(ARGV[2]) > redis.call('LLEN', KEYS[1]) then
    return redis.call('LPUSH', KEYS[1], ARGV[1])  end 
return -1

您应该使用SCRIPT LOAD加载一次:

cat blpush.lua | redis-cli -x script load

并与EVALSHA一起使用

evalsha 96d1fb35d6173758facda9dbc108296fd4a1512d 1 <myList> <new_element_name> <max_size>


 类似资料:
  • 问题内容: Redis非常快。在我的机器上,大多数情况下它的速度与node.js中的本机Javascript语句或函数调用一样快。在node.js中编写常规的Javascript代码很容易/很轻松,因为不需要回调。我不明白为什么使用node.js在Redis中获取/设置键/值数据不那么容易。 假设node.js和Redis在同一台机器上,是否有任何npm库允许使用阻塞调用与node.js上的Red

  • 问题内容: 如果我将某些内容推送到Redis的列表中,然后从该列表中弹出,是否可以保证我会得到较早推送的项目,还是可以在写入之前进行读取? 问题答案: Redis在单个线程中运行(执行后台保存时进行分叉除外,但这无关紧要),因此以后发送的任何请求都必然会在以后运行。这样,您将看到您推送的值。 (不过,再三考虑一下,如果您不愿意并且有意使它故意失败,可能会引发失败。但这将需要通过单独的连接发送请求,

  • 请问 amh能否支持redis-stack

  • 该项目需要一个自定义的RedisConnectionFactory,并发现了一个问题:当使用LettuceConnectionFactory时,运行时总是报告java.lang.NullPointerException,而JedisConnectionFactory可以通过测试。我想LettuceConnectionFactory是否对redis和Springboot有版本限制? 开发环境: Sp

  • 我尝试在我的DB中更新一个表“image”并插入blob类型。 ImageClass: Hibernate用户映射: 利布: 错误:

  • 我知道Redis从内存中提供所有数据,但它是否也可以在服务器重新引导时持久存在,这样当服务器重新引导时,它将从磁盘中读取所有数据到内存中。或者它总是一个空白存储,只存储数据,而应用程序运行没有持久性?