redis
2021-10-21 20:10:12 11 举报
AI智能生成
111
作者其他创作
大纲/内容
基础数据结构
String
get key
set key value [expiration EX seconds|PX milliseconds] [NX|XX]
mget key [key ...]
mset key value [key value ...]
incr key
incrby key increment
exists key [key ...]
del key [key ...]
type key
expire key seconds
ttl key
查看key还有多久过期
setex key seconds value
等价于 set+expire
setnx key value
如果key不存在就执行set创建(if not exists)
List
rpush key value [value ...]
lpush key value [value ...]
lrange key start stop
rpop key
lpop key
lindex key index
ltrim key start stop
保留区别的值
ltrim books 1 0 (这其实是清空了整个列表,因为区间范围长度为负)
Hash
hset key field value
hget key field
hmset key field value [field value ...]
hmget key field [field ...]
hgetall key
hincrby key field increment
Set
sadd key member [member ...]
smembers key
sismember key member
scard key
spop key
sinter key [key ...]
两个set的交集
sunion key [key ...]
sunionstore destination key [key ...]
SortedSet
zadd key [NX|XX] [CH] [INCR] score member [score member ...]
zrange key start stop [WITHSCORES]
zrevrange key start stop [WITHSCORES]
zrank key member
zrem key member [member ...]
zrangebyscore key min max [WITHSCORES] [LIMIT offset count]
zremrangebyscore key min max
基础知识
分布式锁
先用setnx(set if not exists)抢锁,抢到之后再用expire命令给锁加一个过期时间,防止忘记释放锁
如果setnx之后expire之前进程意外结束或者需要重启,需要把setnx和expire合成一条命令来执行(保证原子性): set key value ex 5 nx
检索某个key是否存在
keys pattern
keys 没有offset,limit,一次性找出所有符合条件的key
keys算法是遍历算法,redis是单线程,顺序执行所有指令,其他指令必须等到keys指令执行完了才能继续执行,会导致redis服务卡顿
scan cursor [MATCH pattern] [COUNT count]
不会阻塞线程
提供limit参数,可以控制每次返回结果的最大条数
返回的结果可能会有重复,需要客户端去重
遍历的过程中如果有数据修改,改动后的数据能不能遍历到是不确定的
单次返回的结果是空的并不意味着遍历结束,而是要看返回的游标值是否为0
异步队列
list结构作为队列,rpush生产消息,lpop消费消息(先进先出:队列),当lpop没有消息时,要适当sleep一会再试,缺点:空轮询浪费资源,解决:用blpop/brpop, 即是阻塞读(blocking)
延时队列
sortedset,将消息序列化成一个字符串作为value,这个消息的到期处理时间作为score,然后用zrangebyscore指令轮询获取到期的任务进行处理
应用场景
订单超过30分钟未支付,自动关闭
订单完成后, 如果用户一直未评价, 5天后自动好评
会员到期前15天, 到期前3天分别发送短信提醒
音频仿真体验者角色15天有效期,到期前1天发邮件提醒
布隆过滤器(Bloom Filter)
命令
bf.add
bf.exists
bf.madd
bf.mexists
描述
可以用于检索一个元素是否在一个集合中
应用场景
爬虫过滤已抓到的url就不再抓
邮件系统的垃圾邮件过滤功能
新闻客户端推荐系统去重
特性
有一定的误差
当布隆过滤器说某个值存在时,这个值可能不存在;当它说某个值不存在时,那就肯定不存在
HyperLogLog
命令(pf为创建该数据结构的人的名字缩写)
pfadd key element [element ...]
pfcount key [key ...]
pfmerge destkey sourcekey [sourcekey ...]
描述
用于统计一个集合中不重复的元素个数(基数计数),可以解决很多精确度要求不高的统计问题
应用场景
统计页面的UV
统计在线用户数
统计注册IP数
特性
有误差
标准误差为0.81%
有局限性,就是只能统计基数数量,而没办法去知道具体的内容是什么
缓存雪崩、穿透、击穿
雪崩
描述
大面积的缓存失效,大量请求直接请求数据库,打崩了数据库
解决 办法
批量往数据库存数据的时候,把每个key的失效时间都加上一个随机值,这个可以保证数据不会在同一时间大面积失效
热点数据永不过期,有更新时更新一下缓存
穿透
描述
用户不断地发起缓存和数据库都不存在的数据,导致数据库压力过大,严重可击垮数据库
解决办法
增加参数校验
布隆过滤器(Bloom Filter)
击穿
描述
一个key非常热点,高并发集中对这个点进行访问,当这个key失效的一瞬间,大量的请求直接请求数据库,击垮数据库,就像在完好无损的桶上凿开了一个洞
解决办法
设置热点数据永不过期
增加互斥锁
持久化
RDB(快照)
Redis使用操作系统的COW( Copy On Write)机制来实现快照持久化
在指定的时间间隔对你的数据进行快照存储
# 时间策略
save 900 1
save 300 10
save 60 10000
save 900 1 表示900s内有1条写入,就产生快照
save 300 10 表示300s内有10条写入,就产生快照
优点
RDB对Redis的性能影响非常小,是因为在同步数据的时候fork了一个子进程去进行持久化,同样的数据文件比AOF文件小,数据恢复的时候比AOF要快
缺点
快照文件默认五分钟才生成一次(根据时间策略),这意味着这五分钟的数据都有可能丢失
RDB在生成数据文件的时候,如果文件很大,客户端会暂停几毫秒甚至几秒
AOF(日志)
模式
alway
把每个写命令都立即同步到aof文件中,很慢,但很安全
everysec
(推荐)每秒同步一次
no
不处理,非常快,但也最不安全
描述
AOF根据模式同步数据,一般是everysec,这样可以兼顾速度和安全,每隔一秒执行一次fsync操作,最多损失一秒的数据
fsync
Linux的glibc提供了fsync(int id)函数可以将指定文件的内容强制从内核缓存刷到磁盘
优点
每隔一秒左右(模式可配置)执行一次fsync操作,最多损失一秒的数据
记录日志是追加(append_only)的方式,减少 了磁盘寻址的开销
0 条评论
下一页