redis watch使用场景_[Redis] 常用类型及应用场景

本文介绍了Redis的常用数据类型,如strings、hashes、lists、sets等,并详细讲解了Watch命令的使用,用于实现分布式锁和监控键值变化。通过PHP代码示例展示了如何利用Watch实现秒杀操作。此外,还提到了Redis的Bloom过滤器和限流模块Redis-cell的应用。
摘要由CSDN通过智能技术生成

主要类型字符串(strings,bitmaps)

散列(hashes)

列表(lists)

集合(sets)

有序集合(sorted sets)

hyperloglogs

发布订阅(pub/sub)

地理空间(geospatial)

Stream(5.0版本新增)

关于命令我推荐看这两个:

应用场景

strings缓存

分布式锁(setnx)

签到统计(setbit)

计数(incr)

hashes缓存

用户标签

lists队列

sets交集并集

数据去重

zset排行榜

延时任务(score存储执行时间戳)

限流

hyperloglogsuv统计(ip统计、id统计)

pub/sub发布订阅(不是特别可靠)

geospatial附近的人

Stream队列

发布订阅

其他

利用事务实现秒杀

以php代码为例:WATCH命令可以监控一个或多个键,一旦其中有一个键被修改(或删除),之后的事务就不会执行。监控一直持续到EXEC命令(事务中的命令是在EXEC之后才执行的,所以在MULTI命令后可以修改WATCH监控的键值)

// 库存为5

//实例化redis

$redis = new Redis();

//连接

$redis->connect('127.0.0.1', 6379);

$key = 'sale';

$redis->setnx($key, 0); // 此项不预定义亦可,保证key唯一就行

$redis->watch($key); //监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。

$sale_num = $redis->get($key);

if ($sale_num > 4) {

exit();

}

$redis->multi(); //标记事务

$redis->incr($key); //销量+1

sleep(1); //模拟真实环境

$ret = $redis->exec(); // 事务块内所有命令的返回值,按命令执行的先后顺序排列。

if ($ret) {

// 自定义的一个基于medoo的dbclass

include 'db.php';

$db = new db([

'database_type' => 'mysql',

'database_name' => 'test',

'server' => '13sai',

'username' => '13sai',

'password' => '*',

'charset' => 'utf8'

]);

$db->update('goods', ["stock_num[-]" => 1], ['id' => 1]);

}

布隆过滤器布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。

php实现推荐看看这篇文章:

当然,Redis自己也有第三方模块:

git clone https://github.com/RedisBloom/RedisBloom.git

cd redisbloom

make

/path/to/redis-server --loadmodule ./redisbloom.so

Bloom:向过滤器添加新项,如果尚不存在,则会为您创建一个新的过滤器

127.0.0.1:6379> BF.ADD newFilter foo

(integer) 1

Bloom:检查过滤器中是否存在项

127.0.0.1:6379> BF.EXISTS newFilter foo

(integer) 1

127.0.0.1:6379> BF.EXISTS newFilter notpresent

(integer) 0

限流 Redis-cell

// 提前安装rust哟

git clone https://github.com/brandur/redis-cell.git

cd redis-cell

cargo build --release

cp target/release/libredis_cell.dylib /path/to/modules/

redis-server --loadmodule /path/to/modules/libredis_cell.so

该模块只有1条指令cl.throttle,它的参数和返回值都略显复杂,接下来让我们来看看这个指令具体该如何使用。

> cl.throttle limitThrot 15 30 60 1

▲ ▲ ▲ ▲ ▲

| | | | └───── need 1 quota (可选参数,默认值也是1)

| | └──┴─────── 30 operations / 60 seconds 这是漏水速率

| └───────────── 15 capacity 这是漏斗容量

> └─────────────────── key

上面这个指令的意思是允许频率为每 60s 最多 30 次(漏水速率),漏斗的初始容量为 15,也就是说一开始可以取 15 个,然后才开始受漏水速率的影响。我们看到这个指令中漏水速率变成了 2 个参数,替代了之前的单个浮点数。用两个参数相除的结果来表达漏水速率相对单个浮点数要更加直观一些。

> cl.throttle limitThrot 15 30 60 1

1) (integer) 0 # 0 表示允许,1表示拒绝

2) (integer) 15 # 漏斗容量capacity

3) (integer) 14 # 漏斗剩余空间left_quota

4) (integer) -1 # 如果拒绝了,需要多长时间后再试(漏斗有空间了,单位秒)

5) (integer) 2 # 多长时间后,漏斗完全空出来(left_quota==capacity,单位秒)

基本上常见的场景就是这些了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值