位图
用redis位图节约存储空间
set s h 整存
setbit s 1 1 设置第一位为1
get s 整取
getbit s 12 获取第12位
bitfield w get u3 2 从第3位开始取 取3位作为无符号数
bitfield w set u8 8 97 从第9位开始 接下来的8位用97代替
bitfield w incrby u4 2 1 从第三位开始 接下来的4位 加 1
默认折返,也就是为溢出截断。
溢出策略子指令 sat:保持最大值 fail: 失败不执行
bitfield w overflow sat/fail incrby u4 2 1
HyperLogLog 12KB
pfadd co u1 u2 u3
pfcount co
pfmerge co co1
分布式锁 延时队列(异步对列) 限流 漏斗限流
线程IO模型
单线程
1.事件轮询 多路复用 响应IO
2.定时任务 维护最小堆
通信协议
resp
持久化
快照+AOF
快照是二进制的序列化的增量备份
AOF是内存数据修改的指令记录文本,先执行 再序列化 需要定期瘦身
COW 多进程 copy on write
父子页面共享代码块与数据
父进程响应请求 修改页面 cow 会在修改时把共享页面复制出来
子进程进行序列化操作
AOF重写
bgrewriteaof
快照会遍历整个内存 AOF的fsync是个耗时的IO操作,降低性能,增加IO负担
因此采用主从复制
混合持久化
增量AOF日志 + rdb
管道
redis压力测试工具
> redis-benchmark -t set -q
set 5w/s
>redis-benchmark -t set -P 2 -q
Jedis jedis = new Jedis("192.168.229.128", 6379);
// 开启管道
Pipeline pipelined = jedis.pipelined();
for(int i = 0; i < 100000; i++){
pipelined.set(i + "", i + "");
}
// 提交命令
pipelined.sync();
事务
不具备原子性 仅仅具有隔离性中的串行化
一般事务: begin commit rollback
Redis: multi exec discard
乐观锁
jedis.watch(key);
int value = Integer.parseInt(jedis.get(key));
value *= 2;
//事务
Transaction tx = jedis.multi();
tx.set(key,value);
List<Object> res = tx.exec();
if(res!=null){
//成功
break;
}