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