redis知识图谱
2021-07-24 15:07:03 0 举报
AI智能生成
redis整体框架介绍
作者其他创作
大纲/内容
基础
支持的数据类型
string
字符类型
setnx: 不存在时 再设置
mset: 批量设置 mset k1 a k2 b
mget: 批量获取 k1 k2
append: 追加 append k1 " world"
getRange : 获取value中的第几位到第几位 getrange key1 1 2
这里有一个正负向索引的概念
getrange k1 5 -1 代表取第五位开始到最后一位得字符串
setRange: 替换某一个key中的某几位字符串 setRange k1 5 "MSB" 代表从第五个位置开始 设置为MSB
strlen 获取字符串的长度
getset: 先响应回去一个old值 ,再覆盖一个新值
integer类型
incr
incr by
decr
decr by
适用场景:抢购 秒杀
bitmap
setbit key offset(bit位置) value
bitpos key bit start end 查找bit值0或者1 在字节当中出现的二进制的位置
bitop and/or newkey k1 k2 对k1 k2的二进制进行与或操作 得到的值赋给newkey
使用场景:用户系统,统计用户的登录次数 随机的时间窗口
方案:将用户的ID 作为key 第几天的天数做为bit的位数 0/1表示登录的状态
设置:setbit yj 355 1
统计:bitcount yj -2 -1 代表查询的是 yj在最后16天的登录次数
优点 :每个用户只需要46B 1000千万 用户的登录数据只需要400多M
使用场景2:618做活动 登录的人即可领取一份礼物,仓库应该备多少货? 此时需要提前计算活跃用户
方案:将日期作为key, 将用户的序号用作bit的索引位 0/1代表登录的状态
保存 setbit 20210705 5 0 (5 代表第5号用户)
统计方案: 1、bitop or destkey 20210705 20210706
2、bitcount destkey 0 -1
api: type (可以使用object encoding k1 对k1的value进行格式化 如果k1的值设置的是99 则type的值 会是int)
hash
set zs::name 张三
设置zs的name是张三
基于上边这种需求,设计出更为合理的hash结构
hset key key1 value
设置单个key的属性
hmset key key1 a key2 b key3 c
批量设置属性
hget key1 key
取出key1中的key属性
hmget key1 a b c
取出key1中的a b c 对应的值
hkeys key1
取出key1中的所有的key
hvalues key1
取出key1中的所有的values
hgetall key1
取出key1中的所有的键值对
hincrbyfloat key1 age 0.5
对key1中的age 做自增0.5的操作
list
lpush
从左边逐个添加元素 可多个
rpush
从右边逐个添加元素 可多个
lpop
弹出左边第一个元素
rpop
弹出右边第一个元素
基于首尾操作的方式 可将redis视为栈操作 也可视为队列操作
lrange key start end
取出list中的某几位元素
lindex key index
取出list中第几位的元素
lset key index value
设置list中的第几位的值
lrem key num value
从左至右移出num个元素value
linsert key after 6 a
代表在list中的第6位元素后插入要一个a
linsert key before -1 a
代表在list中的最后一个元素前插入一个a
blpop key timout
一直阻塞获取key中的第一个元素 获取到元素后 会结束
注意:如果有多个客户端阻塞获取某个list时 最开始阻塞的 会最开始获取到 其他的客户端按照开始阻塞的顺序依次获取
单播队列 FIFO
ltrim key start end
删除start右侧 end左侧的元素(两端的元素)
set
sadd
scard
获取一个set集合中的元素个数
srem
移出某个元素(可多个 )
smembers
获取所有的元素
sinner k1 k2
取两个集合中相同的元素
sinnerstore destkey k1 k2
取出相同的元素后 将相同的元素放到目标key中
sunion k1 k2
取两个集合中的合集
srundmember k1 count
随机取出set集合中的几个元素
count为正数时 取出的元素个数不能超过集合本身
count为负数时 取出的元素个数一定=count 但会取出重复的数据
如果为0 时 不反回数据
可以使用的场景:抽奖
spop
随机弹出一个元素
使用场景:抽奖 一次抽出一个奖 且抽中的人 不能再参与抽奖
zset
有序的set集合:按分值进行排序
物理内存上 是按照 左小右大的方式进行排序
zrange k1 start end
如 zrange k1 0 -1 取出所有的元素。
zrange k1 start end withscores
zrangebyscore k1 startscore endscore
按照给定的分值取元素
zrank k1 apple
元素的排名
zscore k1 apple
根据元素取出分值
zrevrange
按照反向取出元素
zincrby k1 2.5 apple
将apple对应的元素分值+2.5
使用场景:歌曲动态实时排名
zuniostore newkey 2 k1 k2 weights k1的权重 k2的权重(aggregate sum/min/max默认是相加)
对两个集合相同的key做相加操作 并放到新的key中
后边的聚合的用法是 如max是取两个集合中的相同key的最大值
排序的实现是skip:跳跃表
在添加元素时 会随机造层
机制
IO多路复用
发展路程
BIO(blocking 阻塞IO) : 内核 kernel
NIO(同步非阻塞): 在用户空间中采用循环遍历的方式 获取结果
问题如下:如果用户取1000个数据,需要与redis内核交互1000次 成本太高了
同步非阻塞:为了减少与内核的交互,用户线程一次提交所有的读请求,内核响应已经获取到数据的文件标识符list,用户空间再遍历获取
问题:文件标识符的相关数据会在内核太与用户态之间来回复制 浪费性能
为了解决这个问题,创建出共享空间 采用索引位置进行标记 获取, mmap epoll
epoll
linux内核提供的一种调用方式
管道
定义:开启管道就是将要执行的多个命令一次执行, 节省往返时间
命令:nc localhost 6379
复杂使用:echo -e 'set k1 2 \n incr k1 \n get k1' | nc localhost 6379
内存淘汰机制
返回错误
删除最少使用的key
删除设置了过期时间最少使用的key
随机删除key
随机删除设置了过期时间的key
在设置了过期时间的集合中 删除马上要过期的key
LFU 与LRU的区别
LFU:最少使用的次数
LRU:长时间内没有使用
过期的key删除策略
主动删除
当客户端访问时 判断有没有过期
被动删除
当客户端没有访问时 ,过期的key 采用 1、每隔10秒抓取20个key进行抽查 2、删除过期的key 3、如果有对于25%的key过期 则重复1步骤
其他机制
发布订阅:pub|sub
命令:publish channel message
命令:subscribe channel
注意:只有消费者启动后 生产者发的消息才会被接收 否则会丢失
事务
开启事务:multi
提交事务:exec
中断事务:discard
watch 可以实现乐观锁、CAS的操作
如果两个线程同时对1个key进行事务操作,一个线程执行后的结果对另外一个线程造成提交失败的影响时 使用watch可以提前监控k值 发现key已经被删除时 会取消事务 并中断执行
modules
redis_bloom 布隆过滤器
解决缓存穿透的问题
定义:查询redis中本来没有的数据 导致所有的查询全部都打到数据库上
实现原理:将系统中的数据 通过映射函数映射到bitmap中 标记为1,没有的数据 不标记。请求的数据进到redis后先判断元素是否被标记为1 ,为0的 则被拦截
其他的过滤器:counting bloom 升级版的布隆过滤器 布谷鸟过滤器
语法:BF.add k1 adc 在添加k1元素的过滤元素
语法:BF.EXISTS K1 abc 判断abc 在不在k1的过滤器里边
持久化
快照:RDB
引出问题:在快照持久化时 是否能看到新修改的数据?
linux基础常识补充:
管道:前一个命令的输出 作为后一个命令的输入
管道会触发创建子进程
echo $$ | more 打印当前的进程id 管道 (会打印出父进程的ID)
echo $BASHPID | more 打印当前的进程id 管道(会打印出子进程的ID)
说明:$$ 的级别比 | 高
linux的父子进程
父进程的数据 子进程是否可以看到?
常规:看不到
进阶:可以看到 使用export 关键字修饰一下
被export修饰的父进程中的变量,子进程修改数据 父进程是否可以看到?
看不到 同样的父进程修改 子进程也看不到
快照过程
1、准时开辟一个子进程(fork)
fork的机制:copy-on-write 写时复制
2、开辟完子进程后 ,将redis中的所有的数据(类似于栈中的对象)复制一份出来
3、在复制的过程中 子进程的指针不会变化 指向的还是原父进程的内存地址 此时当父进程发生写时 会将原指针指向新的内存地址 不会影响已经fork出来的子进程的数据
4、在复制完成后 子进程才会将数据从内存中 读取出来后落地到磁盘中
方法
save
阻塞服务 进行快照
场景:如停机维护时进行阻塞save
save second change 在固定的时间段内 或者多少次操作后进行快照保存
save 900 1
save 300 10
save 60 10000
bgsave
非阻塞 后台fork进行快照
弊端
永远只有一个dump.rdb(需要运维辅助保存策略 如每天转出一份)
丢失数据相对来说比较多一点
优点:恢复速度快
AOF
定义:将操作记录追加到文件中
优点
丢失数据少
弊端
体量无限大,恢复速度较慢
备注:当同时开启了AOF 与 RDB ,恢复时只会使用aof
4.0之后的版本,AOF会包含RDB的全量,增加记录新的写操作
优化:
持久化方案
4.0之前
整合命令
删除抵消的命令
合并重复的命令
最终也是一个纯指令的文件
4.0之后
重写
将老的数据 rdb到aof当中 ,将增量的数据以指令的形式append到aof文件中
最终是一个rdb 与aof的整合体
memcache
没有数据类型
缺点:返回的value需要手动解码,server的网卡 IO会成为瓶颈
集群
各种集群架构
主从
参与业务 客户端可以访问到任何一个节点
哨兵机制
原理:通过发布订阅的方式发现其他的哨兵
解决问题:解决主从复制下的人工处理故障的问题
主备
只有主节点参与业务
读写分离
每一个节点又是一个单节点
一般对主机做ha高可用
数据拆分
按照业务逻辑拆分
场景:数据可以分类 交集不多
按照算法拆分
场景:数据没办法再拆分
cap理论
consistency 一致性
availabilitity 可用性
partition tolerons 分区容错性
指的分布式系统中的某个节点或者网络分区出现了故障的时候,整个系统仍然能对外提供满足一致性和可用性的服务。也就是说部分故障不影响整体使用。
事实上我们在设计分布式系统是都会考虑到bug,硬件,网络等各种原因造成的故障,所以即使部分节点或者网络出现故障,我们要求整个系统还是要继续使用的
(不继续使用,相当于只有一个分区,那么也就没有后续的一致性和可用性了)
事实上我们在设计分布式系统是都会考虑到bug,硬件,网络等各种原因造成的故障,所以即使部分节点或者网络出现故障,我们要求整个系统还是要继续使用的
(不继续使用,相当于只有一个分区,那么也就没有后续的一致性和可用性了)
0 条评论
下一页