一、redis非关系型基础数据结构
- 字符串string
- 列表list
- 集合set
- 有序集合sort set
- 散列hash
二、基本命令
- dbsize 获取存储数据个数
- exists key 判断是否存在key
- del key 删除指定数据
- scan 0 match key count 10 从0下标开始查找key,查找10条数据
- type key 返回key的数据类型
- expire key 1000 设置key1000秒过期时间
- ttl key 返回整数表示剩余时间,-1表示永久有效,-2已经失效过期
二、string基本命令
- set key value 设置单个key值
- set key value xx 存在key值才设置成功,相当于存在数据才修改
- set key value nx 不存在key值才设置成功,相当于不存在数据才添加
- set key value EX 100 设置key值,并设置过期时间100秒
- set key value EX 100 nx 结合3,4可以实现不存在key才添加成功且设置过期时间100秒,命令为原子性操作
- set key value EX 100 xx 结合2,4可以实现存在key才修改key值且设置过期时间100秒,命令为原子性操作
- get key 获取单个key值
- mset key1 value1 key2 value 设置多个key值
- mget key1 key2 获取多个key值
- incr key 使key自增1并返回自增后的值
- incrby key 10 使key自增指定值10
- decr key 使key自减1
- decrby key 10 使key自减指定值10
- setnx key value 如果key不存在则添加成功,否则添加失败
- setex key 100 value 设置key值,并设置过期时间100秒
- getset key value 设置key值并返回旧的value
三、hash基本命令,结构为key-value
- hset key field value 设置key为键值对
- hsetnx key name dp 如果key只不存在设置key值为键值对
- hmset key name dp sex man 批量设置
- hget key field 获取值
- hmget key field1 field2 批量获取值
- hexists key field 是否存在field
- hvals key 返回key下键值对所有的value
- hkeys key 返回key下键值对所有的field
四、list基本命令
五、set基本命令,数据无序且不可重复
- sadd key value1 value2 value3 添加元素无序,如果添加单个元素存在则添加失败,添加多个元素有一个不存在则添加成功,否则添加失败。返回添加成功的个数
- srem key value1 value2 删除多个元素,返回删除成功元素的个数
- smembers key 获取所有元素的集合
六、zset基本命令,数据有序且不可重复
七、缓存雪崩
出现场景:
- 某个时刻redis出现问题,请求全部访问数据库,导致数据库崩溃。redis设置主从架构,或者集群来解决问题
- 缓存的过期时间相同,缓存失效后,大量请求访问数据库重新设置缓存,导致数据库崩溃。缓存时间添加随机值来解决问题
七、缓存击穿
出现场景:请求的数据在缓存大量不命中,导致访问数据库
解决方案:
- 请求前加一层布隆过滤器,拦截不存在的请求,不合法则不请求到数据库
- 根据业务场景,设置缓存对象为空。但可能出现缓存为空后,数据被添加进去,在缓存时间内任然查出为空。
八、Redis的过期策略和内存淘汰机制
过期策略: 如果一批key设置了过期时间,达到了过期时间后怎么删除。定期删除+惰性删除
定期删除: 没过一段时间随机抽取key来检查和删除
惰性删除: 获取某个key的时候,检查key是否过期,如果过期则就会删除不会返回任何值。
内存淘汰机制: 如果redis的内存占用过多的时候,此时会进行内存淘汰,有如下一些策略:
- noeviction:当内存不足以容纳新写入数据时,新写入操作会报错,这个一般没人用吧
- allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key(这个是最常用的)
- allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key,这个一般没人用吧
- volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key这个一般不太合适
- volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key
- volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除
九、rdb,aof
- rdb是redis默认持久化方案,在指定时间内,达到指定的写操作次数。则会触发bgsave将内存中的数据写到磁盘中,生成一个dump.rdb文件。redis重启会加载dump.rdb文件恢复数据
- save保存数据,直接调用 rdbSave ,阻塞 Redis主进程,直到保存完成为止。在主进程阻塞期间,服务器不能处理客户端的任何请求。
- bgsave保存数据,则是fork 出一个子进程,子进程负责调用 rdbSave ,并在保存完成之后向主进程发送信号,通知保存已完成。 Redis 服务器在bgsave执行期间仍然可以继续处理客户端的请求。
- aof 会将收到的每个命令追加到文件中,当aof文件是上次重写后大小的一倍或者大于配置文件的64M(建议设置为3G)会触发重写,根据当前内存的数据重写一个新的aof文件。rdb和aof同时开启时,会优先使用aof。
appendonly yes 开启aof
appendfsync always 每条命令都保存
appendfsync everysec 每秒保存一次
appendfsync no 从不保存 - rdb全量备份,非常适用于备用和灾难恢复
- rdb在恢复大数据时的数据比aof速度要快
- aof配置每隔一秒保存一次命令,redis出问题时可能会丢失最后一秒的数据。且aof的日志文件通常比rdb大
- aof非常使用误删缓存数据恢复,只需要清除删除命令即可
十、从数据库加载100W条到redis
- 分批次查询数据
- 使用pipleLine保存到redis
十一、主从复制
- 配置3台机器:
主:127.0.0.1 6379
从:127.0.0.2 6380
从:127.0.0.3 6381
在从机的conf文件中,配置slaveof 127.0.0.1 6379
如果主机挂掉后,登录从机127.0.0.2 执行slaveof no one就变成主机,然后在127.0.0.3中执行命令slaveof 127.0.0.2 6380变成他的从机
设置从节点只读:slave-read-only yes
十二、哨兵模式
- 三个定时任务
一.每10秒每个 sentinel 对master 和 slave 执行info 命令:该命令第一个是用来发现slave节点,第二个是确定主从关系.
二.每2秒每个 sentinel 通过 master 节点的 channel(名称为_sentinel_:hello) 交换信息(pub/sub):用来交互对节点的看法(后面会介绍的节点主观下线和客观下线)以及自身信息.
三.每1秒每个 sentinel 对其他 sentinel 和 redis 执行 ping 命令,用于心跳检测,作为节点存活的判断依据.
- 主观下线
当前sentinel实例认为某个redis服务不可用 - 客观下线,如果sentinel集群中超过quonum(配置)数量的节点认为该redis节点主观下线,则该redis客观下线。如果节点是丛节点则操作到此为止,如果是主节点则执行故障转移
- 选举sentinel Leader
如果某个sentinel投票数 > sentinel数/2 + 1(表示超过半数),则认为是sentinel Leader否则重新选举 - sentinel Leader选择一个redis节点作为主节点
过滤故障节点
选择优先级slave-priority最大的节点作为主节点,如果不存在则继续
选择复制偏移量最大的节点作为主节点,当主从的偏移量一致则数据是完全同步的,如果不存在则继续
选择runid最小的节点作为主节点,随机生成的
参考
- https://juejin.cn/post/6844903990212165645
- https://www.cnblogs.com/warrior4236/p/12724937.html
- https://www.cnblogs.com/mengchunchen/p/10039467.html
- https://www.cnblogs.com/codingmode/p/12633261.html
- https://www.cnblogs.com/zhangfengshi/p/13292190.html
- https://blog.csdn.net/ysvae/article/details/106417485