redis学习
2021-07-28 14:51:54 11 举报
AI智能生成
redis
作者其他创作
大纲/内容
分布式锁redisson
lua脚本保证原子性
看门狗机制续期
发布订阅实现通信
插件机制
BloomFilter
常见问题
缓存穿透(大量不存在的key)
布隆过滤器
缓存击穿(单个热点key失效)
互斥锁
热点数据永不失效
缓存雪崩(大量key同时失效)
加随机值
集群部署
双写一致性
问题:先更新db还是先更新缓存?是删除缓存还是更新缓存?
延时双删
快的原因
多路IO复用
广告项目可用缓存的地方
主数据:项目,楼层,楼栋,商铺
资源位信息:一个项目的资源位设置完成后,应该很少改动
广告位信息:资源位设置广告位后,半年才允许变更一次
各种审批列表:审批信息一旦结束,则不会再变回
广告位排期:按照广告位缓存。一旦计划创建完成后,很长一段时间,不会再针对这个广告位创建新计划
设备列表:新增后基本不变
计划列表和素材列表,考虑变更性比其他列表大,可以不用缓存。
基本类型和使用场景
String
特点
简单,动态,快速,二进制安全
常用命令
set/get
mset/mget
strlen/append
incr/decr
setnx/setex
应用场景
普通存储字符串
自增变量(浏览次数,访问量)
简易分布式锁
jpg图片或者序列化的对象
底层使用sds,二进制安全
Hash
特点
是一个 string 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储对象
常用命令
hset/hget
hmset/hmget
hkeys/hvals
hexists/hlen
应用场景
存储、读取、修改用户属性
List
特点
是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)
常用命令
lpush/lpop
lindex/llen
ltrim/lrange
blpop/brpop
应用场景
列表存储
消息队列
分页展示
Set
特点
是 String 类型的无序集合。集合成员是唯一的。添加,删除,查找的复杂度都是 O(1)
常用命令
sadd/srem
smembers/sismember
scard/spop
sinter/sdiff/sunion
应用场景
共同好友/推荐好友
利用唯一性,统计访问网站的唯一ip
SortedSet
特点
不允许重复的成员。每个元素都会关联一个 double 类型的分数
有序集合的成员是唯一的,但分数(score)却可以重复。默认按照score从小到大排序
有序集合的成员是唯一的,但分数(score)却可以重复。默认按照score从小到大排序
常用命令
zadd/zrem
zrange/zrangebyscore/zrank
zcard/zscore/zcount/zincrby
应用场景
各种排行榜
带权重的消息队列
HyperLogLog
特点
是用来做基数统计的算法
每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数
每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数
常用命令
pfadd/pfocunt/pfmerge
应用场景
统计注册 IP 数
统计每日访问 IP 数
统计页面实时 UV 数
统计在线用户数
统计用户每天搜索不同词条的个数
统计每日访问 IP 数
统计页面实时 UV 数
统计在线用户数
统计用户每天搜索不同词条的个数
Geo
特点
主要用于存储地理位置信息,并对存储的信息进行操作
常用命令
geoadd/geopos
geodist/georadius
应用场景
根据定位点范围搜索
pub/sub
特点
发布、订阅机制(类似于消息队列)
常用命令
subscribe/publish/unsubscribe
psubscribe/punsubscribe
应用场景
广播通知
分布式锁广播
分布式锁广播
Bitmap
特点
位图,其实也就是 byte 数组,用二进制表示,只有 0 和 1 两个数字
常用命令
getbit/setbit
应用场景
统计每日用户的登录数
bloomfilter 但一般都用Google的
bloomfilter 但一般都用Google的
底层结构
SDS
键值的底层都是sds(简单动态字符串)
AOF缓存区
记录本身长度 C需要遍历
修改字符减少内存重新分配
空间预支配
惰性空间释放
二进制安全
C只能保存文本数据 无法保存图片等二进制数据
sds是使用长度去判断
hash字典
数据库 哈希键
hash冲突用单向链表解决
渐进式 rehash
会逐渐rehash 新的键值对全部放到新的hash表
每个字典带 两个hash表
一个平时用 一个rehash时候用
链表
压缩列表?
跳跃表
高可用
持久化
rdb
# save 3600 1
# save 300 100
# save 60 10000
# save 300 100
# save 60 10000
fork(),生成一个dump.rdb文件
可以指定save时间设置。
占用空间小。适合容灾备份。
恢复时加载速度比 AOF快
缺点:
1:可能丢的数据时间较长
2:数据集大是,fork可能很耗时
可以指定save时间设置。
占用空间小。适合容灾备份。
恢复时加载速度比 AOF快
缺点:
1:可能丢的数据时间较长
2:数据集大是,fork可能很耗时
aof
1:丢失数据少
2:文件过大时,可通过配置或者手动rewrite重写。
3:数据出错时,可通过redis-check-aof修复
2:文件过大时,可通过配置或者手动rewrite重写。
3:数据出错时,可通过redis-check-aof修复
appendonly no
appendfilename "appendonly.aof"
# appendfsync always
appendfsync everysec
# appendfsync no
appendfilename "appendonly.aof"
# appendfsync always
appendfsync everysec
# appendfsync no
混合模式
主从
特点:
* 主数据库可以进行读写操作,当读写操作导致数据变化时会自动将数据同步给从数据库
* 从数据库一般都是只读的,并且接收主数据库同步过来的数据
* 一个master可以拥有多个slave,但是一个slave只能对应一个master
* slave挂了不影响其他slave的读和master的读和写,重新启动后会将数据从master同步过来
* master挂了以后,不影响slave的读,但redis不再提供写服务,master重启后redis将重新对外提供写服务
* master挂了以后,不会在slave节点中重新选一个master
* 主数据库可以进行读写操作,当读写操作导致数据变化时会自动将数据同步给从数据库
* 从数据库一般都是只读的,并且接收主数据库同步过来的数据
* 一个master可以拥有多个slave,但是一个slave只能对应一个master
* slave挂了不影响其他slave的读和master的读和写,重新启动后会将数据从master同步过来
* master挂了以后,不影响slave的读,但redis不再提供写服务,master重启后redis将重新对外提供写服务
* master挂了以后,不会在slave节点中重新选一个master
常用命令:
slaveof 192.168.1.1 6379 (高版本replicaof)
slave-read-only
info replication
slaveof 192.168.1.1 6379 (高版本replicaof)
slave-read-only
info replication
存在问题:一旦主节点挂掉,则不能提供写服务
哨兵(sentinel)
功能
集群监控
消息通知
故障转移
特点
* sentinel模式是建立在主从模式的基础上,如果只有一个Redis节点,sentinel就没有任何意义
* 当master挂了以后,sentinel会在slave中选择一个做为master,并修改它们的配置文件,其他slave的配置文件也会被修改,比如slaveof属性会指向新的master
* 当master重新启动后,它将不再是master而是做为slave接收新的master的同步数据
* sentinel因为也是一个进程有挂掉的可能,所以sentinel也会启动多个形成一个sentinel集群
* 多sentinel配置的时候,sentinel之间也会自动监控
* 当主从模式配置密码时,sentinel也会同步将配置信息修改到配置文件中,不需要担心
* 一个sentinel或sentinel集群可以管理多个主从Redis,多个sentinel也可以监控同一个redis
* sentinel最好不要和Redis部署在同一台机器,不然Redis的服务器挂了以后,sentinel也挂了
* 当master挂了以后,sentinel会在slave中选择一个做为master,并修改它们的配置文件,其他slave的配置文件也会被修改,比如slaveof属性会指向新的master
* 当master重新启动后,它将不再是master而是做为slave接收新的master的同步数据
* sentinel因为也是一个进程有挂掉的可能,所以sentinel也会启动多个形成一个sentinel集群
* 多sentinel配置的时候,sentinel之间也会自动监控
* 当主从模式配置密码时,sentinel也会同步将配置信息修改到配置文件中,不需要担心
* 一个sentinel或sentinel集群可以管理多个主从Redis,多个sentinel也可以监控同一个redis
* sentinel最好不要和Redis部署在同一台机器,不然Redis的服务器挂了以后,sentinel也挂了
工作机制
* 每个sentinel以每秒钟一次的频率向它所知的master,slave以及其他sentinel实例发送一个 PING 命令
* 如果一个实例距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 选项所指定的值, 则这个实例会被sentinel标记为主观下线。
* 如果一个master被标记为主观下线,则正在监视这个master的所有sentinel要以每秒一次的频率确认master的确进入了主观下线状态
* 当有足够数量的sentinel(大于等于配置文件指定的值)在指定的时间范围内确认master的确进入了主观下线状态, 则master会被标记为客观下线
* 在一般情况下, 每个sentinel会以每 10 秒一次的频率向它已知的所有master,slave发送 INFO 命令
* 当master被sentinel标记为客观下线时,sentinel向下线的master的所有slave发送 INFO 命令的频率会从 10 秒一次改为 1 秒一次
* 若没有足够数量的sentinel同意master已经下线,master的客观下线状态就会被移除;
若master重新向sentinel的 PING 命令返回有效回复,master的主观下线状态就会被移除
* 如果一个实例距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 选项所指定的值, 则这个实例会被sentinel标记为主观下线。
* 如果一个master被标记为主观下线,则正在监视这个master的所有sentinel要以每秒一次的频率确认master的确进入了主观下线状态
* 当有足够数量的sentinel(大于等于配置文件指定的值)在指定的时间范围内确认master的确进入了主观下线状态, 则master会被标记为客观下线
* 在一般情况下, 每个sentinel会以每 10 秒一次的频率向它已知的所有master,slave发送 INFO 命令
* 当master被sentinel标记为客观下线时,sentinel向下线的master的所有slave发送 INFO 命令的频率会从 10 秒一次改为 1 秒一次
* 若没有足够数量的sentinel同意master已经下线,master的客观下线状态就会被移除;
若master重新向sentinel的 PING 命令返回有效回复,master的主观下线状态就会被移除
配置
修改sentinel.conf
daemonize yes
logfile "/usr/local/redis/sentinel.log"
dir "/usr/local/redis/sentinel" #sentinel工作目录
sentinel monitor mymaster 192.168.30.128 6379 2 #判断master失效至少需要2个sentinel同意,建议设置为n/2+1,n为sentinel个数
sentinel auth-pass mymaster 123456
sentinel down-after-milliseconds mymaster 30000 #判断master主观下线时间,默认30s
daemonize yes
logfile "/usr/local/redis/sentinel.log"
dir "/usr/local/redis/sentinel" #sentinel工作目录
sentinel monitor mymaster 192.168.30.128 6379 2 #判断master失效至少需要2个sentinel同意,建议设置为n/2+1,n为sentinel个数
sentinel auth-pass mymaster 123456
sentinel down-after-milliseconds mymaster 30000 #判断master主观下线时间,默认30s
问题:无法动态扩容
集群(cluster)
特点
* 多个redis节点网络互联,数据共享
* 所有的节点都是一主一从(也可以是一主多从),其中从不提供服务,仅作为备用
* 不支持同时处理多个key(如MSET/MGET),因为redis需要把key均匀分布在各个节点(16384个slot)上,
并发量很高的情况下同时创建key-value会降低性能并导致不可预测的行为
* 支持在线增加、删除节点
* 客户端可以连接任何一个主节点进行读写
* 所有的节点都是一主一从(也可以是一主多从),其中从不提供服务,仅作为备用
* 不支持同时处理多个key(如MSET/MGET),因为redis需要把key均匀分布在各个节点(16384个slot)上,
并发量很高的情况下同时创建key-value会降低性能并导致不可预测的行为
* 支持在线增加、删除节点
* 客户端可以连接任何一个主节点进行读写
配置
cluster-enabled yes
cluster-config-file nodes_7001.conf
cluster-node-timeout 15000
redis-cli -a 123456 --cluster create IP host ...
CLUSTER NODES
cluster-config-file nodes_7001.conf
cluster-node-timeout 15000
redis-cli -a 123456 --cluster create IP host ...
CLUSTER NODES
引申
CRC16(key) % 16384
一致性哈希(hash环)
子主题
哈希分布
虚拟槽
子主题
0 条评论
下一页