Redis
数据结构 c
redis 0-15DB -- key --value( String list set map z-set)
String
int/sds sds.h sds.c
二进制安全 sds char[] len \0标记符 不计入len长度
list
查找不方便 lpush rpush lpop rpop
其中 0 表示列表的第一个元素, 1 表示列表的第二个元素,可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素。
redis> RPUSH mylist "one"
redis> RPUSH mylist "two"
redis> RPUSH mylist "three"
redis> LRANGE mylist 0 0 1) "one"
redis> LRANGE mylist -3 2 1) "one 2) "two" 3) "three"
3.2版本之前 zipList linkedlist
3.2之后 quicklist 双向链表 有ziplist组成的双向链表
消息队列
栈
生产者消费者模型
hash(map)
key field -value
hget hdel hset hexists
ziplist数据量小
hash dict.h dictEntry dict dictht(扩容)
set
sadd diff
intset hashtable(key ,value(null))
z-set
score value
zadd rank 9 baidu 8 google
zrange
跳跃表 t_zset.c level
排行榜
命令
http://redisdoc.com/index.html
keys *
exists key
过期时间
命令 expire gupao 50 ttl gupao presist gupao
setnx( key, seconds,value)
原理 消极方法
积极方法 周期性从设置过期时间的key中选择一部分删除 如果 25% 重复执行
发布订阅
publish channel.mic hello
subscribe channel.mic 不支持消息存储
持久化
RDB 快照 fork子进程 dump.rdb
规则sava 900 1 或 save 300 10 或 save 60 1000
save 阻塞 bgsave 不阻塞 恢复快
AOF appendonly.aof 日志文件 防止数据丢失
重写aof文件 同时 重写缓冲数据 ;重写完成之后 重写缓冲 追加到aof 防止数据丢失
appendfsync (always)everysec(no)
rdb 和aof 一起使用
内存回收策略
allkeys-lru
allkeys-random
volatile-random/lru/ttl 范围:设置过期时间的key
为什么单线程
多线程 更好的使用cpu资源,计算 其他核心用不到
单线程 减少线程切换开销 瓶颈在于内存和网络部分
多路复用 非阻塞io
同步阻塞
同步非阻塞
异步阻塞
多路复用 文件描述符 select poll epoll
LUA 脚本 原子性 pipeline 管道模型
批量执行减少网络开销 原子性 复用性
redis.call('set','gupao','123')
redis.call('get','gupao')
eval "return redis.call('get','gupao')"
eval "return redis.call('set',KEYS[1],ARGV[1])" 1(key的数量) mic val;
./redis-cli --eval hello.lua
主从结构
数据同步 一致性
选主
配置 从节点 slaveof ip port bind 防火墙
info relication
ping 命令 心跳 无磁盘复制
内部选举(zab协议)
外部选举(哨兵)
哨兵(raft算法 leader flower candicate epoch term )
监控master salve 是否正常 ,master故障 选举master
哨兵节点 订阅 master节点 channel
连接sentiel set 才能做故障转移
cluster 无中心化架构
海量数据 分片 slot16000 最小6台 3主 3从 每个都是master节点 故障转移或者新增节点 从新分片
jedis/redisson
jedis jedisSentinelPoll.java jedis.java protocal.java jedisCluster
jedisLock
redission
RedissionClient = Redission.create
getLock
RedissionLock lua
分布式锁
缓存一致性问题
更新 数据库 更新 缓存 MQ 或者 补偿机制
缓存雪崩
时间离散
缓存击穿
null
key值规则 过滤 布隆过滤器 压缩 空间换时间 概率性算法 误差率;