一、RDB 持久化
可以将 redis 在内存中的数据库状态保存到磁盘里面,避免数据因为服务器进程退出而丢失。
RDB 持久化既可以手动执行,也可以根据服务器配置选项定期执行,该功能可以将某个时间点上的数据库状态保存到一个 RDB 文件中。
RDB 持久化功能所生成的 RDB 文件是一个经过压缩的二进制文件。有 SAVE 和 BGSAVE 命令
- SAVE 命令会阻塞 Redis 服务器进程,直到 RDB 文件创建完毕为止,在服务器进程阻塞期间,服务器不能处理任何命令请求
Redis 服务器状态结构的 clients 属性是一个链表,这个链表保存了所有与服务器连接的客户端的状态结构,对客户端执行批量操作,或者查找某个指定的客户端,都可以通过遍历 clients 链表来完成
1 | struct redisServer { |
而这个 clients 的每个节点指向的结构体如下
1 | struct redisClient { |
Redis 缓存的使用,极大的提升了应用程序的性能和效率,特别是数据查询方面。但同时,它也带来了一些问题。其中,最要害的问题,就是数据的一致性问题,从严重意义上讲,这个问题无解,如果对数据的一致性要求很高,那么就不能使用缓存。
另外的一些典型的问题就是:缓存穿透、缓存学霸和缓存击穿。目前,业界也都有比较流行的解决方案
假如用户想要查询一个数据,发现Redis内存数据库没有,也就是缓存没有命中,于是向持久层数据库查询,发现也没有,于是本次查询失败。当用户很多的时候,缓存都没有命中(秒杀),于是都去请求了持久层数据库。这会给持久层数据库造成很大的压力,这时候就相当于出现缓存穿透
解决方案:
布隆过滤器是一种数据结构,对所有可能查询的参数以 hash 形式存储,在控制层先进行校验,不符合则丢弃,从而避免了对底层存储系统的查询压力;
docker 虚拟化技术由这些技术支撑:namespace、Cgroups、union filesystem
命名空间(namespace)是 linux 提供的用于隔离进程、网络、挂载点、进程间通信等资源的方法。docker 就是通过 linux 的 namespace 对不同的容器实现了隔离。
Linux 的命名空间机制提供了七种不同的命名空间,包括:clone_newcgroup、clone_newipc、clone_newnet、clone_newns、clone_newpid、clone_newuser、clone_newuts
。通过这 7 个选项我们能在创建新的进程时,设置新进程应该在那些资源上与宿主机器进行隔离。
进程 pid 隔离的实现,在使用 clone 系统调用创建一个新进程时,在参数中指定 CLONE_NEWPID
参数。新创建的这个进程将会 “看到” 一个全新的进程空间,在这个进程空间中,他的 pid 为 1。也就实现了针对进程 PID 的命名空间。在此命名空间中,看不到宿主机中真正的进程空间,也看不到其他命名空间的情况。
在新的进程中创建隔离的挂载点需要在 clone 系统调用中传入 CLONE_NEWNS
,
1 | 输入一个整数数组 S: |
O(logN)
,这个是相对稳定的,即使最差情况下,时间复杂度不会改变。哈希表增删改查的时间复杂度为 O(1)
。并且查找速度和数据量大小基本无关。但是时间复杂度不太稳定,在插入或删除操作时,如果发生哈希冲突了,最坏的时间复杂度能达到 O(n)
。
这种题目包括:无序的单链表和有序的单链表
给定一个已排序的链表的头 head
, 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表。
leetcode:https://leetcode.cn/problems/remove-duplicates-from-sorted-list/
对于无序的单链表。