liuyong00 2020-02-20
后续会继续更新。
Redis知识点总结
基于内存的分布式高性能key-value数据库。
特点:
1.数据库操作读写在内存中完成,纯内存操作,磁盘用来做持久化,性能出色;
2.支持多种数据结构,单个value最大限制为1gb ;
3.可以将数据复制到任意数量的从机中 缺点:数据库操作受限于自身物理内存,不能作为海量数据的高性能读写,适合较小数据量的高性能读写;
4.单进程服务器模型与多路IO复用模型,非阻塞IO,采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗;
内容过多,后面直接放链接。
python客户端
1.https://www.cnblogs.com/-wenli/p/10958055.html 2.https://www.cnblogs.com/-wenli/p/10992152.html
go语言客户端
1.https://www.cnblogs.com/-wenli/p/12221495.html
持久化
RDB 全量持久化(冷备)
RDB快照持久化机制,是对 Redis 中的数据执行周期性的持久化,把内存中的数据集以快照形式写入磁盘,实际操作是通过 fork 子进程执行,采用二进制压缩存储;
如何持久化:Redis会单独创建(fork)一个子进程来进行持久化,不同时刻会生成不同时刻的数据文件,每个数据文件分别都代表了某一时刻Redis里面的数据。
Fork:Fork的作用是复制一个与当前进程一样的进程。新进程的所有数据(变量、环境变量、程序计数器等)数值都和原进程一致,但是是一个全新的进程,并作为原进程的子进程。 整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能,如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常的敏感,那RDB方式要比AOF方式更加高效。
优点:
1.RDB主进程在做快照写入磁盘过程中不进行任何IO操作,对Redis的性能影响非常小,是因为在同步数据的时候他只是fork了一个子进程去做持久化的,而且他在数据恢复的时候速度比AOF来的快。
适合冷备:恢复到某一时刻的数据。
缺点:
1.在一定间隔时间做一次备份,所以如果redis意外down掉的化,就会丢失最后一次快照后的所有修改。 2.Fork的时候,内存中的数据被克隆一份,大致2倍的膨胀性需要考虑。
AOF增量持久化(热备)
AOF 机制以日志文本的形式记录redis命令,以 append-only(追加) 的模式写入一个日志文件中。
如何持久化:RDB五分钟一次生成快照,但是AOF是一秒一次去通过一个后台的线程fsync操作,最多丢这一秒的数据。
优点:
1.数据备份更完整,支持同步与异步两种方式。
缺点:
1.相同数据集的数据而言aof文件要远大于rdb文件,恢复速度慢于rdb。
2.Aof运行效率要慢于rdb,每秒同步策略效率较好,不同步效率和rdb相同。
RDB与AOF如何选择
单独使用RDB会丢失很多数据,单独使用AOF,数据恢复没RDB恢复快,做数据恢复时第一时间用RDB恢复,然后AOF做数据补全,冷备热备兼备。
注意:RDB和AOF同时存在时,在这种情况下,当redis重启的时候会优先载入AOF文件来恢复原始的数据,因为在通常情况下AOF文件保存的数据集要比RDB文件保存的数据集要完整。
缓存系统都要定期清理无效数据,就需要一个主键失效和淘汰策略.在Redis当中,有生存期的key被称为volatile。在创建缓存时,要为给定的key设置生存期,当key过期的时候(生存期为0),它可能会被删除。
Redis处理过期key机制
处理过期keys的命令
1.expire : 设置过期时间。格式是:expire key值 秒数
2.expireat : 设置过期时间,格式是:expireat key值 到期的时间戳
3.ttl : 查看还有多少秒过期,格式是:ttl key值, -1表示永不过期,-2表示已经过期
4.persist : 设置成永不过期,格式是:persist key值 删除key的过期设置; 5.另外使用set或者getset命令为键赋值的时候,也会清除键的过期时间。
6.pttl:查看还有多少毫秒过期,格式是:pttl key值
7.pexpire : 设置过期时间,格式是:pexpire key值 毫秒数
8.pexpireat : 设置过期时间,格式是:pexpireat key值 到期的时间戳
影响生存时间的一些操作
1.PERSIST命令可以在不删除 key 的情况下,移除 key 的生存时间,让 key 重新成为一个永远不过期 key 。
2.EXPIRE命令可以重新指定key的生存时间,新的生存时间会取代旧的生存时间。
如何更新生存时间
可以对一个已经带有生存时间的 key 执行EXPIRE命令,新指定的生存时间会取代旧的生存时间。过期时间的精度已经被控制在1ms之内,主键失效的时间复杂度是O(1),EXPIRE和TTL命令搭配使用,TTL可以查看key的当前生存时间。设置成功返回 1;当 key 不存在或者不能为 key 设置生存时间时,返回 0 。
redis 提供 6种数据淘汰策略:
注意这里的6种机制,volatile和allkeys规定了是对已设置过期时间的数据集淘汰数据还是从全部数据集淘汰数据,后面的lru、ttl以及random是三种不同的淘汰策略,再加上一种no-enviction永不回收的策略。
使用策略规则:
1.如果数据呈现幂律分布,也就是一部分数据访问频率高,一部分数据访问频率低,则使用allkeys-lru
2.如果数据呈现平等分布,也就是所有的数据访问频率都相同,则使用allkeys-random
1.缓存更新方式与缓存不一致的解决方法:https://www.cnblogs.com/-wenli/p/11474164.html
2.缓存穿透:查询缓存不命中,然后穿透 DB 查询依然不命中。这时会有大量请求穿透缓存访问到 DB。
解决办法:
3.缓存击穿:某个热点数据失效时,大量针对这个数据的请求会穿透到数据源。
解决办法:
3.缓存雪崩:原因是缓存在同一时间挂掉,这时所有的请求都会穿透到 DB。
解决办法:
缓存击穿和缓存雪崩的区别:
缓存雪崩是因为大面积的缓存失效,打崩了DB,而缓存击穿不同的是缓存击穿是指一个Key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个Key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个完好无损的桶上凿开了一个洞。
哨兵+主从可以保证集群的高可用,但并不能保证数据不丢失。
主从配置:
主从特性:
主从原理和过程(同步机制):
当你启动一台从机的时候,他会发送一个psync命令给主机 ,如果是这个从机第一次连接到主机做第一次同步时,会触发一个全量复制。主机就会启动一个线程,做一次bgsave,并同时将后续的写请求记录到内存buffer,待完成后将rdb文件全量同步到从机,从机接受完成后将rdb镜像加载到内存。加载完成后,再通知主机将期间后续的写请求记录同步到从机进行重放就完成了同步过程。
主从同步的时候,新的slaver进来的时候用RDB,那之后的数据呢?有新的数据进入master怎么同步到slaver,AOF,把日志增量同步给从机。
哨兵配置:
哨兵作用:自动版反客为主,能够后台监控主机是否故障,如果故障了根据投票数自动将从机转换为主机。
哨兵特性:
Redis Cluster可以保证集群的扩展性。
1.https://www.cnblogs.com/diegodu/p/9183356.html
2.https://www.cnblogs.com/lykxqhh/p/5690923.html
热点缓存:将热点数据放到内存中,设置内存的最大使用量以及淘汰策略来保证缓存的命中率。
计数器:可以对 String 进行自增(incr)自减运算(decr),从而实现计数器功能。Redis 这种内存型数据库的读写性能非常高,很适合存储频繁读写的计数量。
限流器:
分布式锁:setnx\expire\del,先拿setnx来争抢锁,抢到之后,再用expire给锁加一个过期时间防止锁忘记了释放。
消息队列:
小功能
1.Set 可以实现交集、并集等操作,从而实现共同好友等功能。
2.ZSet 可以实现有序性操作,从而实现排行榜等功能。
性能检测工具
redis-benchmark(redis系统自带):Redis自带的性能检测工具, 该工具可以模拟 N 个客户端同时发出 Y 个请求。可以使用 redis-benchmark -h 来查看基准参数。
监控工具