一、非对称加密和对称加密具体算法和使用场景
对称加密算法:发端和收端共享同一个密钥,使用该密钥进行加密和解密。适用于数据量大的数据传输中;
非对称加密算法:有一个公钥,一个私钥;发端和收端不需要共享密钥,只需要使用对方的公钥进行加密;适用于身份验证、数字签名等场景。
二、基本数据结构
****数组
优点:索引访问速度快,通过索引可以快速地访问数组中的任何元素;空间效率高,数组在内存中是连续存储的,空间利用率高。
缺点:插入和删除效率低,在数组中插入或删除元素可能需要移动大量的元素以保持数组的连续性;大小固定:数组在创建时大小是固定的,如果需要存储更多的数据,可能需要重新分配内存并复制数据。
****链表
优点:动态大小,链表的大小可以根据需要动态的增加或减少;插入和删除效率高,在链表中插入或删除元素只需要修改相应的指针即可,不需要移动其他元素。
缺点:索引访问速度慢,需要从头节点开始遍历链表以访问特定位置的元素;额外空间开销,链表中的每个元素都需要额外的空间来存储指向下一个元素的指针。
****栈
优点:先进后出,非常适合处理需要逆序执行的操作,如函数调用和撤销;实现简单。
缺点:功能有限,只能访问栈顶的元素,对栈中间的元素操作较为困难。
****队列
优点:先进先出,适合处理需要顺序执行的任务,如打印任务,消息队列等。并发处理,在多线程或分布式系统中,队列是实现任务分发和同步的有效工具;
缺点:对非队头元素操作效率较低,通常需要遍历整个队列来访问或修改非队头。
****树
优点:层次化存储,树形结构可以清晰地表示数据之间地层次关系;高效搜索,树形结构中,通过特定的搜索算法可以实现高效的查找操作。
缺点:实现复杂,树形结构的实现通常比数组和链表更加复杂;平衡问题,对于某些树形结构,如果数据插入的顺序不当,可能导致树的高度过高,从而影响查找效率。
****图
优点:表示复杂关系,图可以表示数据之间的复杂关系,如社交网络、地图路线等;算法丰富,在图上有许多成熟的算法来解决实际问题。
缺点:实现复杂,图的实现通常比其他数据结构更加复杂,因为它需要存储节点之间的关系;存储空间开销大,对于包含大量节点和边的图,可能需要大量的存储空间来存储这些信息。
三、缓存穿透、缓存击穿、缓存雪崩及它们的解决方案?
缓存穿透:查询一个一定不存在的数据,这个不存在的数据每次请求都要到数据库去查询,进而给数据库带来压力;
解决方案:1.布隆过滤器:查询数据时,先判断该数据是否存在于布隆过滤器中,如果存在则直接返回结果,否则再从数据库查询数据;
2.缓存空对象:在缓存中存储空对象,当查询一个不存在的数据时,直接返回空对象,而不是默认值或者错误信息;
3.设置热点数据永不过期
缓存击穿:热点key在某个时间点过期的时候,而恰好这个时间点对key有大量的并发请求过来,从而大量的请求打到数据库。
解决方案:1.主动设置空缓存:当接收对于数据库中没有的请求查询时,主动在缓存中写入空数据,设置过期时间;
2.互斥锁:使用分布式锁进行加锁,保证只有一个线程能访问数据库,其他线程需要等待锁释放之后才能进行查询;
3.设置逻辑过期时间
缓存雪崩:大量缓存同时失效或过期后引起的系统性能急剧下降。
解决方案:1.保持缓存层的高可用:使用Redis哨兵模式或者Redis集群部署方式,保证缓存层高可用性;
2.限流降级组件:使用限流降级组件如:Sentinel等,避免缓存层或存储层异常导致整个系统不可用;
3.缓存不过期:设置Redis的key永不失效,避免大量缓存同时失效;
4.优化缓存过期时间:为每一个Key选择合适的过期时间,避免大量key同一时刻同时失效;
5.使用互斥锁重建缓存
6.异步重建缓存