redis watch使用场景_[Redis] 常用类型及应用场景
主要類型字符串(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,單位秒)
基本上常見的場景就是這些了。
總結
以上是生活随笔為你收集整理的redis watch使用场景_[Redis] 常用类型及应用场景的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 线性八叉树_octree八叉树数据结构原
- 下一篇: vue 添加完数据后刷新页面_vue f