高效的跳表 对比AVL树和红黑树,都可以做到遍历数据有序,时间复杂度也差不多,而跳表的优势在于:实现简单,容易控制,而平衡树增删改查都更复杂跳表的额外空间消耗更低,平衡树节点需要存储三个节点指针,父亲和左右孩子,还有平衡因子或颜色等消耗。
效率高的B树系列 前面我们所学习到的数据结构,只能用来存储少量的数据,因为内存大小是非常有限的,一般情况下,也就几十个G,面对海量数据时,也就只能加载少部分数据到内存,其它的都存在磁盘,而与磁盘交换,即IO,速度是非常慢的如下图,以二叉平衡树为例,树节点存的是磁盘中数据的地址,当数据量非常庞大时,这棵树的高度也就非常高,而内存中,为了存储更多的数据,每个节点就不存储关键字,只存储磁盘地址,所以可能每到一层,就需要进行一次磁盘IO,所以就需要进行高度次磁盘IO,效率很低。
分布式系统部署Redis redis哨兵节点,只有一个也是可以的,但也会有一些问题1、如果哨兵节点只有一个,它本身也是容易出现问题的,万一这个哨兵节点挂了,后续redis节点也挂了,就无法进行自动的恢复过程了2、出现误判的概率比较高,毕竟网络传输数据是容易出现抖动或者延迟或者丢包的,如果只有一个哨兵节点,出现上述问题之后,影响就比较大基本的原则:在分布式系统中,应该避免使用 “单点”
Redis事务 Redis中实现事务,是引入了队列,每个客户端都有一个,开启事务的时候,此时客户端的命令,就会发给服务器,并且进入这个队列中,而不是立即执行,当遇到"执行事务"命令的时候,就会把队列中的这些任务都按照顺序依次执行,是在Redis主线程中执行的,主线程会把事务中的操作都执行完,再处理别的客户端。Redis事务具有弱化的原子性,它可以把多个操作打包到一起,要么全部执行,要么全部都不执行,它不保证执行成功,而MySQL是要保证成功的,不成功就会回滚,Redis没有回滚特性,所以说它是弱化的原子性。
Redis持久化 AOF文件持续增长,体积越来越大,会影响到redis服务器下次的启动时间,因为redis服务器启动的时候,要读取aof文件的内容,该文件记录了中间的过程,实际上redis在重新启动的时候,只会关注最终结果,比如lpush key 111,lpush key 222,lpush key 333,又比如set key 111,set key 222,set key 333,redis都只会关注lpush key 111 222 333和set key 333。如下图,是AOF重写的流程。
Redis客户端 如下图,获取key1和key2的value,是正常的,但获取不存在的key3的value,就发生了抛异常,所以这里可以用两种方式解决,一种是捕捉异常,另一种则是 if 语句判断一下是不是为空即可!如下图,cursor是光标,光标就指向了当前遍历的位置,光标设置为0,意味着这次遍历是从头开始获取,下面的"2",表示下次继续遍历,光标从哪里开始,后面的则是真正遍历到的key的内容。不同的命令,返回结果不一样,有的命令,直接返回ok,有的命令,可能返回个整数,有的命令,可能返回个数组。
Redis数据类型 Redis主要有Strings、Lists、Sets、Hashes、Sorted sets等数据类型,这些都是非常通用的,还有一些少见的可以去官网了解Strings相当于C++中的字符串类型Hashes相当于C++中的unordered_mapLists相当于C++中的dequeSets相当于C++中的SetSorted sets是有序集合,除了存储member之外,还需要存储一个score(权重)
初识Redis 上面一段话是官网给出的对Redis的介绍,in-memory data store表明Redis是在内存中存储数据的,这和我们接触的其他数据库就有很大的不同,比如MySQL,它是将数据存储在磁盘中的,但由于MySQL需要与磁盘交互,访问速度就比较慢,而很多互联网产品,又对性能要求比较高,这时,Redis就可以发挥出它的作用了,因为是在内存中存储数据,就意味着访问速度远比在磁盘中快,极大地提高了程序的性能。而要想解决这个问题,无非两种方式,第一个是节流,在软件上优化,但对程序员的水平要求就比较高;
git原理与使用 在上面创建仓库时,有一个添加ignore文件,可以勾选,就会在远程仓库生成该文件,该文件用于添加提交文件时,可以忽略指定的部分文件,比如写入了账号密码信息的文件,我不想推送,让别人看到,我就不提交,但文件太多了,add 指定文件太麻烦,就只能add . ,所以就有了ignore文件的产生,直接在该文件中写入你想忽略的文件即可,如下图所示。此时,git应运而生!a 和 b表示从之前的a文件,修改后变成了b文件,相当于同一个文件的不同版本,-1表示改动前第一行,+1,2表示改动后第一行起连续两行的内容。