首先,从宏观上说,redis是一个完全免费开源,由C语言编写的,单线程(处理网络请求)、高性能基于键值对的内存数据库,支持持久化的nosql
功能
做缓存,但不仅仅只能做缓存,还可以做分布式锁,队列,会话缓存,点赞,统计访问量功能,利用redis计数器做分布式唯一主键
持久化
rdb
bgsave会fork一个子进程去执行持久化
save在主进程进行持久化
直接以数据形式存储到dump.rdb文件
bind配置本机ip用于监听,如果是阿里云,建议设置为私网ip
设置了bind或者密码,保护模式不生效
主从复制时,不能关闭rdb持久化
aof
由于rdb定时执行,因此会丢失执行周期的数据
aof是基于日志追加的模式进行持久化,everysec,no,always
BGREWRITEAOF重写会fork子进程,会按照rdb形式存储数据,可以通过配置自动触发
数据结构
string,list,set,hash,zset
集群
一共有16384个槽位
redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 --cluster-replicas 1 -a 123456
redis-cli -h 127.0.0.1 -p 7000 -a 123456 cluster nodes
红锁及其思想
缓存穿透
数据库没有,缓存中也没有,就会造成缓存穿透
可以存储空值,但是容易被黑客利用进而存储大量无用数据
可以使用布隆过滤器bloomFilter,由谷歌提供,误判率与数组长度和哈希函数个数有关
但是bloomFilter不支持分布式,占用内存且重启会丢失
解决方案:可以利用bitmap与bloomFilter结合最佳实践,但是维护比较麻烦,新增时要更新并且不能删除,要定时更新
缓存击穿
数据刚好失效时,恰好并发访问这条数据
解决方案:使用分布式锁
缓存雪崩
大部分数据失效就是缓存雪崩
解决方案是搭建高可用集群,将过期时间错开
分布式锁
使用setnx key value并加过期时间
redis事务
multi->exec/discard配合watch使用
语法错误全部回滚,执行错误部分回滚
redis发布订阅
简化版的消息队列
删除策略
redis有三种删除策略
惰性删除:在查看时删除过期数据
定时删除:占用CPU
定期删除:是惰性和定时的折中方案
如果没有设置过期时间,但是内存满了,就要用到淘汰策略
淘汰策略(逐出算法)
一共八种策略
noeviction:当内存使用达到阈值的时候,所有引起申请内存的命令会报错。默认配置
allkeys-lru:在主键空间中,优先移除最近未使用的key。
volatile-lru:在设置了过期时间的键空间中,优先移除最近未使用的key。
allkeys-lfu:在主键空间中,优先移除最近使用次数最少的数据
volatile-lfu:在设置了过期时间的键空间中,挑选最近使用次数最少的数据
allkeys-random:在主键空间中,随机移除某个key。
volatile-random:在设置了过期时间的键空间中,随机移除某个key。
volatile-ttl:在设置了过期时间的键空间中,具有更早过期时间的key优先移除。
volatile-* 系列指令在无键值满足条件时(例如未设置过期时间),表现为 noeviction