annidy / notes

0 stars 0 forks source link

Use Redis Comments #326

Open annidy opened 3 months ago

annidy commented 3 months ago

A developer's guide to Redis

Keyspace

Key的类型是Strings。在Redis中,Strings不是单指字符串,任意二进制数据(不超过512M)都是字符串,包括空字符串“”。

全局空间的key可能被其它人覆盖。大部分指令会在key不存在时自动创建key,比如LPUSHHSET;少数指令(比如SET)可以直接覆盖原类型,安全的做法是先EXISTS检查是否已存在。

Key可以有过期时间,最高精度是1ms。TTL的配置会持久化到文件。Redis判断过期主要有2种:1. 惰性计算:每次get时计算;2. 定时扫描:默认是1s扫描一次,可以配置;⚠️定时扫描每次只扫部分键。

遍历Keyspace有2种方法:SCANKEYSSCAN可以增量扫描,KEYS粗暴的返回所有匹配结果,数据量大时可能会阻塞。

Key的匹配示例

Pipeling

普通的Redis客户端是一问一答模式,而Pipeling是不等待上一个执行返回就执行下一条语句,对于不需要返回结果的场景比较实用。参考 Golang Redis Pipelines, WATCH, and Transactions

redis的api中有一个TxPipelined,它只是把回调里的操作封装到MULTIEXEC之间提交而已。redis并不支持事务,中间任何错误的语句都不影响下一条运行,回滚也是不可能的。

redis收到DISCRD后立即清空MULTI队列中的任务。前面队列中的命令并没有开始直到收到EXEC。

生产中的事务还需要配合WATCH命令,它是一种乐观锁。在MULTI之前WATCH监听多个key,在EXEC时,redis会检查这些key是否有变化,如果发送变化直接返回失败。

脚本是提交多条命令的首要选择,其次才是Pipeling。

Keyspace Notifications

Pub/Sub可以订阅任何与Key(包括对应的值)相关的变动。有2点需要注意

  1. 订阅消息是fire and forget,只在触发的时候发送一次
  2. Cluster集群模式下,订阅的事件不会跨node发送

Pub/Sub这个功能需要特别配置开启,开启后所有的Key变化都会通知(不支持模式匹配),所以对性能还是有损失的。 开启后用SUBSCRIBE接受特定channel的通知,比如过期就是keyevent@0:expired