03-Redis缓存数据库
2021-12-17 15:26:29 0 举报
AI智能生成
登录查看完整内容
redis知识整理
作者其他创作
大纲/内容
寻址,单位ms
带宽 G/M
磁道、扇区,一扇区512Byte
磁盘
索引的成本变大
寻址,单位ns
内存
秒>毫秒>微妙>纳秒
I/O buffer:成本
常识
磁盘I/O成本瓶颈
epoll
sendfile(0拷贝)
I/O模型
基础知识
单实例Redis默认16个库
集群Redis只有DB0
缓存
数据库
使用场景
追求速度,数据可以丢失
追求速度,数据绝对不可以丢
设置一个key和value,EX:设置超时时间,单位s;PX:设置超时时间,单位ms;NX:key为空时才允许设置;XX:key不为空时才去更新。
SET key value [expiration EX seconds|PX milliseconds] [NX|XX]
参数
1.SET k1 0 NX
2.SET k1 0 XX
3.set k1 0 ex 10
用法
SET
获取key的value值
GET key
GET
获取key的value值的长度
STRLEN key
STRLEN
给key的value值追加value
APPEND key value
APPEND k1 hello
APPEND
替换key的value值里第offset的值
SETRANGE key offset value
SETRANGE k1 0 H
SETRANGE
通过索引获取key的value某一范围的值
GETRANGE key start end
GETRANGE k1 0 4
GETRANGE k1 5 -1
getrange
正反向索引
字符串操作
对key所存储的数值,自增1
INCR key
INCR k2
INCR
对key所存储的数值,自减1
DECR key
DECR k2
DECR
对key所存储的数值,做加法
INCRBY key decrement
INCRBY k2 2
INCRBY
对key所存储的数值,做减法
DECRBY key decrement
DECRBY k2 2
DECRBY
对key 所存储的数值,增加Float
INCRBYFLOAT key increment
INCRBYFLOAT k2 0.5
INCRBYFLOAT
数值操作
对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)
SETBIT key offset value
SETBIT k1 0 1
SETBIT
对 key 所储存的字符串值,获取指定偏移量上的位(bit)
GETBIT key offset
GETBIT k1 0
GETBIT
返回位图中第一个值为 bit 的二进制位的位置
BITPOS key bit [start] [end]
BITPOS k1 1
BITPOS k1 1 0 -1
BITPOS
计算给定字符串中,被设置为 1 的位的数量
BITCOUNT key [start end]
BITCOUNT k1
BITCOUNT k1 0 -1
BITCOUNT k1 5 8
BITCOUNT
对一个或多个保存二进制位的字符串 key 进行位元操作,并将结果保存到 destkey 上
operation:AND 、 OR 、 NOT 、 XOR
BITOP operation destkey key [key ...]
BITOP AND destkey k1 k2
BITOP
位图操作
String(Byte)
用户ID+年份为key,value位为天,如为1则签到,为0未签到
用户签到
用户在线状态
以天为key, value位为人,如果登陆置为1,未登录置为0,用BITOP进行and操作后再用BITCOUNT去近一段时间的活跃用户数
统计活跃用户
用点赞内容ID为key, 用户ID为位数,如果点赞置为1,反之为0,再通过BITCOUNT获取点赞总数
点赞功能
各种状态值
自定义布隆过滤器
场景
给key的index位赋值value
LSET key index value
LSET
获取某个key的value的长度
LLEN key
LLEN
获取列表的index位的元素
LINDEX key index
LINDEX
从左至右添加一个或多个数据至List中
LPUSH key value [value ...]
LPUSH
删除并返回最左面的value值
LPOP key
LPOP
left
right
栈
从右至左添加一个或多个数据至List中
RPUSH key value [value ...]
RPUSH
删除并返回最后的value值
RPOP key
RPOP
队列
在某个值之前/之后添加某个值
LINSERT key BEFORE|AFTER pivot value
LINSERT
从List中删掉count个value
LREM key count value
LREM
删除掉LIst开闭区间以外的值
LTRIM key start stop
LTRIM
数组
删除并获取LIst的第一个值,如为空则一直阻塞至有值为止
BLPOP key [key ...] timeout
BLPOP
删除并获取LIst的最后一个值,如为空则一直阻塞至有值为止
BRPOP key [key ...] timeout
BRPOP
删除List的最后一个值,并把它添加到另一个List的最左侧,如果为空则一直阻塞至有值为止
BRPOPLPUSH source destination timeout
BRPOPLPUSH
阻塞队列,单播队列
List
HSET key field value
HSET
HMSET key field value [field value ...]
HMSET
HGET key field
HGET
HMGET key field [field ...]
HMGET
删除掉某个value
HDEL key field [field ...]
HDEL
HKEYS key
HKEYS
HVALS key
HVALS
HGETALL key
HGETALL
给hashmap里的数值做加法
HINCRBY key field increment
HINCRBY
HSCAN key cursor [MATCH pattern] [COUNT count]
HSCAN
hash
向集合添加一个或多个成员
SADD key member [member ...]
SADD
判断 member 元素是否是集合 key 的成员
SISMEMBER key member
SISMEMBER
返回集合中的所有成员
SMEMBERS key
SMEMBERS
SREM key member [member ...]
SREM
返回给定所有集合的交集
SINTER key [key ...]
SINTER
返回给定所有集合的交集并存储在 destination 中
SINTERSTORE destination key1 [key2]
SINTERSTORE
移除并返回集合中的一个或多个随机元素
SPOP key [count]
SPOP
返回所有给定集合的并集
SUNION key [key ...]
SUNION
所有给定集合的并集存储在 destination 集合中
SINTERSTORE destination key [key ...]
SUNIONSTORE
返回第一个集合与其他集合之间的差异
SDIFF key [key ...]
SDIFF
返回给定所有集合的差集并存储在 destination 中
SDIFFSTORE destination key [key ...]
SDIFFSTORE
获取集合的成员数
SCARD key
SCARD
随机返回count个数据
SRANDMEMBER key [count]
SRANDMEMBER
删除并返回count个数据
SPOP
Set
抽奖
随机事件
向有序集合添加一个或多个成员,或者更新已存在成员的分数
ZADD key score1 member1 [score2 member2]
ZADD
获取有序集合的成员数
ZCARD key
ZCARD
计算在有序集合中指定区间分数的成员数
ZCOUNT key min max
ZCOUNT
有序集合中对指定成员的分数加上增量 increment
ZINCRBY key increment member
ZINCRBY
计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 destination 中
ZINTERSTORE destination numkeys key [key ...]
ZINTERSTORE
在有序集合中计算指定字典区间内成员数量
ZLEXCOUNT key min max
ZLEXCOUNT
通过索引区间返回有序集合指定区间内的成员
ZRANGE key start stop [WITHSCORES]
ZRANGE
通过字典区间返回有序集合的成员
ZRANGEBYLEX key min max [LIMIT offset count]
ZRANGEBYLEX
sorted set
基础数据类型
pipline
PUBLISH channel message
发布
SUBSCRIBE channel [channel ...]
订阅
消息订阅
标记开始一个事务块
MULTI
执行所有事务块内的命令
EXEC
监控某些key,如果在事物开始执行前被改变,则事物被打断
WATCH
取消监控
UNWATCH
事务
官方提供多个扩展包,包括布隆过滤器、布谷鸟过滤器
moduls
使用bitmap,通过对key进行一系列自定义的hash算法计算出一个数值,然后对bitmap中数值所在位置的值置1
查找时,通过对查找值进行同样的hash算法计算数值,然后在bitmap中查找对应位置的值是否为1,如果为1,则存在
二进制组成的数组,查询和插入都很快,且占用空间小
优点
hash算法有一定重复性,容易产生误判且没办法删除数据
缺点
布隆过滤器
可以判断某个数据一定不存在,但是无法判断一定存在可判断大数据量下某个数据是否存在,防止缓存穿透
跟布隆过滤器一样, 只不过多增加了一个计数,如果二进制数组中被多个元素命中, 则该位增加1
增加了删除操作如果删除, 该位减1
计数试布隆过滤器
依旧是无法避免误判,但是增加了删除操作
布谷鸟hash算法, 建立两个hash表, 在插入一条数据的时候会通过hash算法计算出插入哪一张表,如果该表的位置已有数据, 则把已有数据剔除,并重新计算插入到另外一张hash表, 如果依然存在则把已有元素剔除,继续以上操作
弊端可能循环很多次后仍然出现有一个元素没有位置的时候, 则扩容hash表
内存访问次数不高
hash计算逻辑简单
容易引发循环填装
cpu消耗大
删除数据时容易引发误删操作
布谷鸟过滤器
过滤器
规避误判,增加白名单,把容易误判的数据放在其他地方做二次判断
当写入的数据加上原始数据将大于内存限制大小时,返回错误
noeviction
回收最少使用的key
allkeys-lru
回收最少活跃的key,且有设置过期时间的key
volatile-lru
回收有设置过期时间的key,且过期时间最短
volatile-ttl
访问时判断是否过期
一次只判断20key是否过期
周期轮询判断
过期处理
回收策略
如果所有的key均无过期时间,则该策略等于noeviction
appendfsync always
* appendfsync everysec
appendfsync no
自动触发
触发重写
开启 AOF 重写缓冲区
主进程继续写旧文件
AOF_FSYNC_NO
AOF_FSYNC_EVERYSEC
AOF_FSYNC_ALWAYS
AOF重写缓冲区的指令追加新文件
缓存落盘策略
文件替换
bgrewriteaof
手工触发
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
no-appendfsync-on-rewrite no
重写
AOF
在m秒内,发生n次变化触发bgsave()
save() m n
save() 900 1
save() 300 10
save() 60 10000
默认
同步,不建议使用
save()
异步
bgsave()
如果从节点要全量复制, 主节点会执行bgsave(),并把rdb文件发个从节点
主从复制
在应用关机时会自动执行rdb持久化
shutdown
其他场景
RDB
持久化
异步复制,低延迟,高性能
可以一主多从
复制操作在master上是非阻塞的
sentinel <选项的名字> <主服务器的名字> <选项的值>
监控
提醒
故障自迁移
Redis哨兵(Sentinel)
业务拆分
hash+取模
random随机
一致性hash
业务端控制
min-replicas-to-write 3
min-replicas-max-lag 10
集群
自动分区(Cluster)
高可用
AKF
CAP
理论
注意
进阶使用
缓存击穿
缓存穿透
缓存雪崩
先更新数据库,再更新缓存
先删缓存,再更新数据库
先更新数据库,再删缓存
双写一致性
缓存的并发竞争
常见问题
Jedis
Spring boot
API使用
Redis
二进制安全,只用字节流,value编码格式要定义好计算像数据移动
03-Redis缓存数据库
0 条评论
回复 删除
下一页