JAVA面试篇(三)一Redis

Java面试-Redis篇 缓存击穿的意思是对于设置了过期时间的key,缓存在某个时间点过期的时候,恰好这时间点对这个Key有大量的并发请求过来,这些请求发现缓存过期一般都会从后端 DB 加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把 DB 压垮。当然是有缺点的,布隆过滤器有可能会产生一定的误判,我们一般可以设置这个误判率,大概不会超过5%,其实这个误判是必然存在的,要不就得增加数组的长度,其实已经算是很划分了,5%以内的误判率一般的项目也能接受,不至于高并发下压倒数据库。我们当时使用的是redisson实现的布隆过滤器。 阅读详情

1.基础

1、Redis 为何这么快?

➢ 1)基于内存;
➢ 2)单线程减少上下文切换,同时保证原子性;
➢ 3)IO多路复用;
➢ 4)高级数据结构(如 SDS、Hash以及跳表等)。

2、为何使用单线程?

因为 Redis 是基于内存的操作,CPU 不会成为 Redis 的瓶颈,而最有可能是机器内存的大小或者网络带宽。
既然单线程容易实现,而且 CPU 不会成为瓶颈,那就顺理成章地采用单线程的方案了。

详细原因:
	➢ 1)不需要各种锁的性能消耗
	Redis 的数据结构并不全是简单的 Key-Value,还有 List,Hash 等复杂的结构,这些结构有可能会进行
	很细粒度的操作,比如在很长的列表后面添加一个元素,在hash当中添加或者删除一个对象。这些操作可能就
	需要加非常多的锁,导致的结果是同步开销大大增加。
	
	➢ 2)单线程多进程集群方案
	单线程的威力非常强大,每核心效率也非常高。多线程虽然比单线程有更高的性能上限,但是在今
	天的计算环境中,即便单机多线程的上限也往往不能满足需要了,需要进一步摸索的是多服务器集群化的方案,
	这些方案中多线程的技术照样是用不上的。所以单线程、多进程的集群不失为一个时髦的解决方案。

3、缓存三大问题以及解决方案?

➢ 缓存穿透:查询数据不存在
	○ 1)缓存空值
	○ 2)key 值校验,如布隆筛选器 ref 分布式布隆过滤器(Bloom Filter)详解(初版)
	
➢ 缓存击穿:缓存过期,伴随大量对该 key 的请求
	○ 1)互斥锁
	○ 2)热点数据永不过期
	○ 3)熔断降级
	
➢ 缓存雪崩:同一时间大批量的 key 过期
	○ 1)热点数据不过期
	○ 2)随机分散过期时间
	

4、先删后写还是先写后删?

➢ 先删缓存后写 DB
	产生脏数据的概率较大(若出现脏数据,则意味着再不更新的情况下,查询得到的数据均为旧的数据)。	
	比如两个并发操作,一个是更新操作,另一个是查询操作,更新操作删除缓存后,查询操作没有命中缓存,
	先把老数据读出来后放到缓存中,然后更新操作更新了数据库。于是,在缓存中的数据还是老的数据,导致
	缓存中的数据是脏的,而且还一直这样脏下去了。

➢ 先写 DB 再删缓存
	产生脏数据的概率较小,但是依然会出现一致性的问题;若更新操作的时候,同时进行查询操作并命中,则查
	询得到的数据是旧的数据。但是不会影响后面的查询。
	
	比如一个是读操作,但是没有命中缓存,然后就到数据库中取数据,此时来了一个写操作,写完数据库后,让缓
	存失效,然后之前的那个读操作再把老的数据放进去,所以会造成脏数据。解决方案:
	➢1)缓存设置过期时间,实现最终一致性;
	➢2)使用 Cannel 等中间件监听 binlog 进行异步更新;
	➢3)通过 2PC 或 Paxos 协议保证一致性。

5、如何保证 Redis 的高并发?

Redis 通过主从加集群架构,实现读写分离,主节点负责写,并将数据同步给其他从节点,从节点负责读,从而实现高并发。

6、Redis 如何保证原子性?

由于 Redis 是单线程的,所以 Redis 提供的 API 也是原子操作。但我们业务中常常有
先 get 后 set 的业务常见,在并发下会导致数据不一致的情况。如何解决:
➢ 1)使用 incr、decr、setnx 等原子操作;
➢ 2)客户端加锁;
➢ 3)使用 Lua 脚本实现 CAS 操作。

7、有哪些应用场景?

Redis 在互联网产品中使用的场景实在是太多太多,这里分别对 Redis 几种数据类型做了整理:
➢1)String:缓存、限流、分布式锁、计数器、分布式 Session 等。
➢2)Hash:用户信息、用户主页访问量、组合查询等。
➢3)List:简单队列、关注列表时间轴。
➢4)Set:赞、踩、标签等。
➢5)ZSet:排行榜、好友关系链表。

2.持久化

1、Redis 的数据过期策略是什么?

在回答词问题之前,首先需要回答另一个问题,就是如何设置 Redis 中数据的过期时间?
➢1)expire key time (以秒为单位)–这是最常用的方式
➢2)setex(String key, int seconds, String value) --字符串独有的方式

2、如果设置了缓存过期时间,如何让其永不过期。

使用 persist key

3、Redis 的数据过期策略是什么?

➢ 常见的过期策略
1)定时删除
	在设置 key 的过期时间的同时,为该 key 创建一个定时器,让定时器在 key 的过期时间来临时,对 key 进行删除。
2)惰性删除
3)定期删除
	每隔一段时间执行一次删除(在 redis.conf 配置文件设置,1s 刷新的频率)过期 key 操作。

➢ Redis采用的过期策略
	Redis 采用了 ‘惰性删除 + 定期删除’ 的方式处理过期数据。

➢ 惰性删除的流程
	1)在进行get或setnx等操作时,先检查key是否过期;
	2)若过期,删除key,然后执行相应操作;
	3)若没过期,直接执行相应操作。

➢ 定期删除的流程
	其核心是对指定个数个库的每一个库随机删除小于等于指定个数个过期 key:
	1)历每个数据库(就是 redis.conf 中配置的 “database” 数量,默认为16);
	
	2)检查当前库中的指定个数个 key (默认是每个库检查 20 个,相当于该循环执行 20 次):
		2.1)如果当前库中没有一个 key 设置了过期时间,直接执行下一个库的遍历;
		2.2)随机获取一个设置了过期时间的 key,检查是否过期,如果过期则删除;
		2.3)判断定期删除操作是否已经达到指定时长,若已经达到,直接退出定期删除。

4、持久化文件对过期策略的处理?

过期 key 是不会写入 RDB 和 AOF 文件,同时数据恢复时也会做过期验证。

5、Redis 有哪些内存淘汰机制?

Redis 作为一个内存数据库,在内存空间不足的时候,为了保证命中率,就会和我们操作系统中的
页面置换算法类似,选择一定的数据淘汰策略。

➢ volatile(设置过期时间的数据集)
	1)volatile-lru:从已设置过期时间的数据集中挑选最近最少使用的数据淘汰。
	2)volatile-ttl:从已设置过期时间的数据集中挑选将要过期的数据淘汰。
	3)volatile-random:从已设置过期时间的数据集中任意选择数据淘汰。
	4)volatile-lfu:从已设置过期时间的数据集挑选使用频率最低的数据淘汰。

➢ allkeys(所以数据集)
	5)allkeys-lru:从数据集中挑选最近最少使用的数据淘汰
	6)allkeys-lfu:从数据集中挑选使用频率最低的数据淘汰。
	7)allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰

➢ no-enviction
	8)no-enviction(驱逐):禁止驱逐数据,这也是默认策略。
	意思是当内存不足以容纳新入数据时,新写入操作就会报错,请求可以继续进行,线上任务也不能持续
	进行,采用 no-enviction 策略可以保证数据不被丢失。

PS:在 redis.config 文件中,我们可以设置 maxmemory 的值来配置 Redis 的最大占用内存字节数。

6、Redis 有哪些持久化机制?

RDB 和 AOF。

7、说说 Redis 的 RDB?

RDB 持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘。也是默认的持久化方式。
也就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为 dump.rdb。

RDB 支持 同步(save 命令)、后台异步(bgsave)以及自动配置三种方式触发。

➢ 优点
	○ RDB 文件紧凑,全量备份,非常适合用于进行备份和灾难恢复
	○ 生成 RDB 文件时支持异步处理,主进程不需要进行任何磁盘IO操作
	○ RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快
	
➢ 缺点
	○ RDB 快照是一次全量备份,存储的是内存数据的二进制序列化形式,存储上非常紧凑。
	且在快照持久化期间修改的数据不会被保存,可能丢失数据。
	

8、说说 Redis 的 AOF?

全量备份总是耗时的,有时候我们提供一种更加高效的方式 AOF,其工作机制更加简单:会将每一个收
到的写命令追加到文件中。随着时间推移,AOF 持久化文件也会变的越来越大。
为了解决此问题,Redis 提供了 bgrewriteaof 命令,作用是 fork 出一条新进程将内存中的数据以
命令的方式保存到临时文件中,完成对AOF 文件的重写。

AOF 也有三种触发方式:
	➢ 每修改同步 always 
	➢ 每秒同步 everysec
	➢ 不同步 no:从不同步。

➢ 优点
	○ AOF 可以更好的保护数据不丢失,一般 AOF 隔 1 秒通过一个后台线程执行一次 fsync 操作
	○ AOF 日志文件没有任何磁盘寻址的开销,写入性能非常高,文件不容易破损
	○ AOF 日志文件即使过大的时候,出现后台重写操作,也不会影响客户端的读写
	○ AOF 日志文件的命令通过非常可读的方式进行记录,这个特性非常适合做灾难性的误删除的紧急恢复
	
➢ 缺点
	○ 对于同一份数据来说,AOF 日志文件通常比 RDB 数据快照文件更大
	○ AOF开启后,支持的写 QPS 会比RDB支持的写 QPS 低,因为 AOF 一般会配置成每秒 fsync 一次
	日志文件,当然,每秒一次 fsync,性能也还是很高的

9、RDB 和 AOF 该如何选择?

通常是二者结合使用的。

3.内存优化

➢ 1. 更快地回收过期的键内存
	当你在一个键上设置了过期时间时,redis不会在该瞬间使它过期。这意味着redis消耗内存来保存已经过期的键。
	
	快速回收这些缓存的办法:
		○ 重新启动redis服务器
		○ 在redis.conf中增加maxmemory-samples。(默认值为5,最大为10),以便更快地回收过期的键。
		○ 可以设置一个cron作业,该作业在一定间隔后运行scan命令,这有助于回收过期键的内存。
		○ 尽量所有的键都增加过期时间。
		
➢ 其他方案,暂不细述

4.集群模式

RK3568嵌入式Linux多屏显示开发指南 摘要:本篇RK3568嵌入式Linux多屏显示开发指南详细介绍了基于Qt应用层的实现方案。文章首先概述了技术架构,说明从Qt应用到硬件显示的完整流程。然后提供了两种实现方案:推荐使用Qt内置多屏支持方案,包含完整的C++代码示例和配置文件说明;对于需要精细控制的场景,给出了基于libdrm API的底层实现方案。最后重点讨论了屏幕旋转处理和多屏协同工作模式的关键技术要点,包括扩展桌面、镜像模式等实现方法。 阅读详情

相关推荐

电脑蓝牙与ESP32蓝牙连接,让电脑发现ESP32

让PC发现ESP32蓝牙

injre! injre~ 5445

[Java大厂必备面试题] 点滴促就辉煌, 每日三题 [Day2] :Redis篇一

这里是征得哈哈哥本人同意搬运! 我看完一篇就搬运一篇 其中可能会插曲自己的理解   面试题1:Java 中操作字符串都有哪些类?它们之间有什么区别? 正经回答: 深入追问: 追问1:这三者在效率上怎么说? 面试题2:请你说一下Error 和 Exception 区别是什么? 正经回答: 面试题3:== 和 equals 的区别是什么 正经回答: 深入追问: 追问1:如果我们不重写equals() 方法,会怎么样? ========================...

汤圆的博客 281

[原创]Step by step 实现自己的AI知识库问答(二)

对小白很友好的AI智能问答开发保姆级教程,适合初级开发者、学生阅读参考,无限制分享,欢迎转载。在这个章节中,我们使用了百度千帆作为知识库,通过简单的代码调用API实现了智能问答。

BaiRiYiSanJin的博客 1470

纯干货分享!百度Java一、二、三面面经总结,本人已成功拿到offer!

前言 百度一,二,三面面经,回馈牛客,许愿OC。 一面和二面问的问题有部分重复,前面写了后面就没有写出来。 这次面试是春招体验最好的一次,面试官非常和蔼。一些比较深难的知识自己不会,面试官还安慰说没关系。 ???? 三面面试官是一个小姐姐,声音温柔又好听。???? 1面 10:10 【Spring】 Spring的项目介绍一下 加载扫描bean的流程 Spring生命周期 Spring的Bean的作用域 MVC流程,@RequestMapping注解具体怎么实现的? @Transaction注解实现知道吗,

weixin_49494194的博客 6841

Docker网络冲突?手把手教你解决Dify社区版无法访问172.18.0.0网段的问题

本文详细解析了在部署Dify社区版时,因Docker默认网段与局域网冲突导致无法访问172.18.0.0网段的问题。通过剖析Docker网络原理,提供了修改Docker守护进程默认地址池的根治方案,并介绍了在Compose文件中指定自定义网络等备选方法,帮助用户彻底解决网络冲突,保障服务稳定运行。

p8q9r0的博客 484

Unity URP项目里Post Processing死活没效果?别慌,这5个坑我帮你踩过了

本文详细解析了Unity URP项目中Post Processing效果失效的五大常见问题,包括渲染管线配置冲突、Volume作用域误判、摄像机参数漏配、Layer层级冲突和Profile引用异常。通过实际项目案例和代码示例,提供专业级解决方案,帮助开发者快速排查并修复后处理效果不生效的问题。

weixin_33721427的博客 333

Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day2】 —— Redis篇1

百日闭关修炼,每日三道高频面试题。一起冲进大厂!看什么看?快上车!今天是Reds,香

陈哈哈的菜园子 2万+

VMware Horizon 8 2111 部署系列(九)创建即时克隆桌面池

即时克隆桌面池是在 vCenter Server 中使用 vmFork 技术(称为即时克隆 API)从最佳配置映像创建的自动桌面池。即时克隆共享同一个基础映像虚拟机,使用基础映像虚拟机的快照创建的,它使用的存储空间也少于完整虚拟机。 即时克隆始终保持开机状态,并在注销后从当前发布的映像重新创建。...

白昼的技术专栏 4042

【java面试】redis篇

redis集群有哪些方案?主从模式保证不了集群的高可用,主节点宕机之后,就丧失了写数据的能力。Redis提供了哨兵(Sentinel)机制来实现主从集群的自动故障恢复。哨兵的结构和作用如下:主观下线:如果某sentinel节点发现某实例未在规定时间响应,则认为该实例主观下线。客观下线:若超过指定数量(quorum)的sentinel都认为该实例主观下线,则该实例客观下线。quorum值最好超过Sentinel实例数量的一半。哨兵选主规则。

qq_52200849的博客 2261

yolov26改进 | 融合改进篇 | 轻量级移动端网络ShuffleNetV2融合CCFM参数量仅百万(附代码+修改教程)

本文介绍ShuffleNetV2与跨尺度特征融合模块CCFM融合改进的YOLOv26。ShuffleNetV2以硬件效率为导向,通过通道分割、轻量卷积和Channel Shuffle减少冗余计算与内存访问,在降低参数量和GFLOPs的同时保持高效特征提取;CCFM进一步加强不同尺度特征交互,弥补轻量主干语义表达不足的问题。本人在轻量模型上测试后,参数量和计算量明显下降,检测精度有一定提升,适合移动端、边缘设备及实时检测任务。文中提供完整代码、配置文件、模块注册及Codex修改思路,方便复现、对比和二次创新。

Snu77的博客 197

基于STM32设计的便携式心电信号监测系统_474

本课题设计并实现了一种基于STM32单片机的便携式心电信号监测系统。系统以STM32F103C8T6为核心控制单元,结合PulseSensor心率传感器,实现对人体心率信号的采集与处理。通过单片机内部ADC模块对传感器输出的模拟电压信号进行采样,并对采集数据进行分析处理,从而计算得到实时心率值。

159

java面试篇 Redis+MySQL+Spring

联合索引(Composite Index)是数据库中的一种索引类型,它基于表中的多个列创建。与单列索引(基于单个列创建的索引)不同,联合索引可以同时对多个列进行索引,从而提高多列查询的性能。联合索引是数据库中一种强大的工具,可以显著提高多列查询的性能。通过合理设计联合索引,可以优化查询性能,但需要注意索引的维护成本和列的顺序。记录日志:把这些通用代码抽出来,避免跟你的业务代码进行耦合:在 Spring 框架中,代理(Proxy)和动态代理(Dynamic Proxy)

weixin_50261367的博客 2087

【Mini KITTI】KITTI数据集简介 — Mini KITTI

为了快速进行算法调试、训练、评估和验证,以及快速下载,制作了一个mini kitti数据集,数据集的文件目录结构与完整KITTI数据集保持一致。其中,小型的KITTI数据集,即 mini kitti保存了20个训练样本和5个测试样本。下载地址为:。 关于KITTI各个部分的介绍请分别参考以下内容: ...

叶子的博客 7534

【Java面试】一、Redis篇(上)

请求2进来(对应线程2),其进行了update,改库,并删缓存,此时,库中为20,缓存中为null。然后新的请求进来(对应线程2),CPU切到线程2执行,查缓存未命中,线程2去查库 + 写入缓存,线程2执行结束,此时缓存为10,库中为10。缓存未命中,查库前,获取一个互斥锁,获取不到则一直重试,如此,后面的线程走不到查库这一步,直到线程1完成查库+写入Redis,其余线程就会命中缓存。理想状态为:线程1删缓存,再更新数据库,后面请求过来(对应线程2),先查缓存,未命中,去查库 + 写入缓存,一切正常。

llg___的博客 1111

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

JAVA面试Redis篇

Redis经典面试问题

kingandsong的博客 1425

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Java——《面试题——Redis篇》

Redis 是一个开源(BSD 许可)、基于内存、支持多种数据结构的存储系统,可以作为数据库、缓 存和消息中间件。它支持的数据结构有字符串(strings)、哈希(hashes)、列表(lists)、集合 (sets)、有序集合(sorted sets)等,除此之外还支持 bitmaps、hyperloglogs 和地理空间( geospatial )索引半径查询等功能。

行秋的博客 4988

【Java高频面试问题】Redis篇

‌策略‌‌一致性‌‌复杂度‌‌适用场景‌先删缓存,后改库弱高(需补偿)低并发、允许短暂不一致‌先改库,后删缓存‌‌强‌中‌高并发强一致性系统‌‌Binlog监听删除‌‌最终强‌高‌超大规模系统。

weixin_45698637的博客 1619

Java面试题之Redis篇

Java面试题之Redis篇

qq_63274189的博客 844

【Java 面试 八股文】Redis篇

缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库。这将导致这个不存在的数据每次请求都要到 DB 去查询,可能导致 DB 挂掉。这种情况大概率是遭到了攻击。解决方案的话,我们通常都会用缓存空对象或者布隆过滤器来解决它。缓存空对象优点:实现简单,维护方便缺点:额外的内存消耗,可能造成短期的不一致布隆过滤优点:内存占用较少,没有多余key缺点:实现复杂,存在误判可能(有穿透的风险),无法删除数据。

Luo_LA的博客 2670

Java面试之Redis篇(offer 拿来吧你)

现在关于Java面试的资料是层出不穷,对于选择困难症的同学来说,无疑是陷入了一次次的抉择与不安中,担心错过了关键内容,现在小曾哥秉持着"融百家之所长,汇精辟之文档"的思想,整理一下目前主流的一些八股文,以达到1+1 > 2 的效果!...

qq_36317312的博客 2304

Java高频面试之Redis篇

按照这个核心思想,Redis 中的 LRU 策略,会在每个数据对应的 RedisObject 结构体中设置一个 lru 字段,用来记录数据的访问时间戳。缓存击穿是指在使用缓存系统时,某个热门数据过期或被删除后,恰好有大量的并发请求同时访问该数据,导致这些请求都无法命中缓存,直接访问后端存储系统,对后端系统造成巨大压力,可能引发系统崩溃或性能下降的问题。缓存雪崩是指在使用缓存系统时,缓存中大量的数据同时过期或失效,导致大量的请求直接访问后端存储系统,使得后端系统承受巨大的压力,甚至引发系统崩溃的现象。

Java领域优秀创作者 2245

Java面试题超详细整理《Redis篇》

Redis(Remote Dictionary Server)远程字典服务,是一种基于键值对(key-value)的NoSQL数据库,与很多键值对数据库不同,Redis中的值可以是由string(字符串)、list(链表)、set(集合)、zset(有序集合)和hash(哈希类型)等多种数据结构组成,能够满足很多的应用场景,同时Redis会将所有数据都存放在内存中,读写速度非常快。基于键值对、读写速度快、数据结构丰富、简单稳定、支持持久化、支持事务(原子性)、主从复制、高可用与分布式。

mh17680313750的博客 1641

java——《面试题——基础篇》

1、Java语言有哪些特点1、简单易学、有丰富的类库2、面向对象(Java最重要的特性,让程序耦合度更低,内聚性更高)3、与平台无关性(JVM是Java跨平台使用的根本)4、可靠安全5、支持多线程。

行秋的博客 9850

面试官:我们来聊一聊Redis吧,你了解多少就答多少

面试官:我们来聊一聊Redis吧,后面的问题你肯定想不到

真正的大师永远怀着一颗学徒的心 1万+

Java面试八股—Redis篇

双写一致性:当修改了数据库的数据也要同时更新缓存的数据,缓存和数据库的数据要保持一致。由于数据库和缓存的读写操作可能并发执行,导致缓存与数据库不一致,Redis采取不同策略来解决该问题。读操作:缓存命中,直接返回数据;缓存未命中查询数据库,返回之前将数据写入缓存,设定该数据的过期时间。RDB全称Redis Database Backup file(Redis数据备份文件),也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后,从磁盘读取快照文件,恢复数据。

m0_62669698的博客 2632

Redis面试篇

Redis分片集群如何判断某个key应该在哪个实例?将16384个插槽分配到不同的实例根据key计算哈希值,对16384取余余数作为插槽,寻找插槽所在实例即可如何将同一类数据固定的保存在同一个Redis实例?Redis计算key的插槽值时会判断key中是否包含{},如果有则基于{}内的字符计算插槽数据的key中可以加入{类型},例如key都以{typeId}为前缀,这样同类型数据计算的插槽一定相同。

m0_50345460的博客 1335

【java面试题-Redis篇-2024】

Redis,英文全称是 Remote Dictionary Server(远程字典服务),是一个开源的使用 C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。与 MySQL 数据库不同的是,Redis 的数据是存在内存中的。它的读写速度非常快,每秒可以处理超过 10 万次读写操作。因此 Redis 被广泛应用于缓存,另外,Redis 也经常用来做分布式锁。除此之外,Redis 支持事务、持久化、LUA 脚本、多种集群方案。

qq_46023503的博客 1653
上一篇: JAVA面试篇(二)一MYSQL
下一篇: JAVA面试篇(四)一 Spring
star_falling
博客等级 码龄11年 287粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值