数据结构 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
同步阻塞
同步非阻塞
异步阻塞
多路复用
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值规则 过滤 布隆过滤器 压缩 空间换时间 概率性算法 误差率;
原文:https://www.cnblogs.com/hoper2020/p/12732675.html