【编者按】本文作者为 Xinyu Liu,文章的第一部分重点概述了 Redis 方方面面的特性。在第二部分,将介绍详细的用例。文章系国内 ITOM 管理平台 OneAPM 编译呈现。
把 Redis 当作数据库的用例
现在我们来看看在服务器端 Java 企业版系统中把 Redis 当作数据库的各种用法吧。无论用例的简繁,Redis 都能帮助用户优化性能、处理能力和延迟,让常规 Java 企业版技术栈望而却步。
1. 全局唯一增量计数器
我们先从一个相对简单的用例开始吧:一个增量计数器,可显示某网站受到多少次点击。Spring Data Redis 有两个适用于这一实用程序的类:RedisAtomicInteger
和 RedisAtomicLong
。和 Java 并发包中的 AtomicInteger
和 AtomicLong
不同的是,这些 Spring 类能在多个 JVM 中发挥作用。
列表 3:全局唯一增量计数器
RedisAtomicLong counter =
new RedisAtomicLong("UNIQUE_COUNTER_NAME", redisTemplate.getConnectionFactory());
Long myCounter = counter.incrementAndGet();// return the incremented value
请注意整型溢出并谨记,在这两个类上进行操作需要付出相对较高的代价。
2. 全局悲观锁
时不时的,用户就得应对服务器集群的争用。假设你从一个服务器集群运行一个预定作业。在没有全局锁的情况下,集群中的节点会发起冗余作业实例。假设某个聊天室分区可容纳 50 人。如果聊天室已满,就需要创建新的聊天室实例来容纳另外 50 人。
如果检测到聊天室已满但没有全局锁,集群中的各个节点就会创建自有的聊天室实例,为整个系统带来不可预知的因素。列表 4 介绍了应当如何充分利用 SETNX(SET if N ot eX ists:如果不存在,则设置)这一 Redis 命令来执行全局悲观锁。
列表4:全局悲观锁
public String aquirePessimisticLockWithTimeout(String lockName, int acquireTimeout, int lockTimeout) {
if (StringUtils.isBlank(lockName) || lockTimeout <= 0)
return null;
final String lockKey = lockName;
String identifier = UUID.randomUUID().toString();
Calendar atoCal = Calendar.getInstance();
atoCal.add(Calendar.SECOND, acquireTimeout);
Date atoTime = atoCal.getTime();
while (true) {
// try to acquire the lock
if (redisTemplate.execute(new RedisCallback() { @Override
public Boolean doInRedis(RedisConnection connection) throws DataAccessException {
return connection.setNX(
redisTemplate.getStringSerializer().serialize(lockKey), redisTemplate.getStringSerializer().serialize(identifier));
}
})) { // successfully acquired the lock, set expiration of the lock
redisTemplate.execute(new RedisCallback() { @Override
public Boolean doInRedis(RedisConnection connection) throws DataAccessException {
return connection.expire(redisTemplate
.getStringSerializer().serialize(lockKey),
lockTimeout);
}
});
return identifier;
} else { // fail to acquire the lock
// set expiration of the lock in case ttl is not set yet. if (null == redisTemplate.execute(new RedisCallback() { @Override
public Long
doInRedis(RedisConnection connection)
throws DataAccessException
{
return connection.ttl(redisTemplate
.getStringSerializer().serialize(lockKey));
}
})) { // set expiration of the lock
redisTemplate.execute(new RedisCallback()
{
@Override
public Boolean
doInRedis(RedisConnection connection) throws DataAccessException {
return connection.expire(redisTemplate
.getStringSerializer().serialize(lockKey),
lockTimeout);
}
});
} if (acquireTimeout < 0) // no wait
return null;
else {
try {
Thread.sleep(100l); // wait 100 milliseconds before retry
} catch (InterruptedException ex) {
}
} if (new Date().after(atoTime)) break;
}
} return null;
}
public void
releasePessimisticLockWithTimeout(String lockName, String identifier) { if (StringUtils.isBlank(lockName) || StringUtils.isBlank(identifier)) return;
final String lockKey = lockName;
redisTemplate.execute(new RedisCallback() { @Override
public Void doInRedis(RedisConnection connection) throws DataAccessException {
byte[] ctn = connection.get(redisTemplate
.getStringSerializer().serialize(lockKey)); if(ctn!=null && identifier.equals(redisTemplate.getStringSerializer().deserialize(ctn)))
connection.del(redisTemplate.getStringSerializer().serialize(lockKey)); return null;
}
});
}
如果使用关系数据库,一旦最先生成锁的程序意外退出,锁就可能永远得不到释放。Redis 的 EXPIRE
设置可确保在任何情况下释放锁。
3. 位屏蔽(Bit Mask)
假设 web 客户端需要轮询一台 web 服务器,针对某个数据库中的多个表查询客户指定更新内容。如果盲目地查询所有相应的表以寻找潜在更新,成本较高。为了避免这一做法,可以尝试在 Redis 中给每个客户端保存一个整型作为脏指标,整型的每个数位表示一个表。该表中存在客户所需更新时,设置数位。轮询期间,不会触发对表的查询,除非设置了相应数位。就获取并将这样的位屏蔽设置为 STRING
而言,Redis 非常高效。
4. 排行榜(Leaderboard)
Redis 的 ZSET
数据结构为游戏玩家排行榜提供了简洁的解决方案。ZSET
的工作方式有些类似于 Java 中的 PriorityQueue
,各个对象均为经过排序的数据结构,井井有条。可以按照分数排出游戏玩家在排行榜上的位置。Redis 的 ZSET
定义了一份内容丰富的命令列表,支持灵活有效的查询。例如,ZRANGE(包括 ZREVRANGE)可返回有序集内的指定范围要素。
你可以使用这一命令列出排行榜前 100 名玩家。ZRANGEBYSCORE 返回指定分数范围内的要素(例如列出得分为 1000 至 2000 之间的玩家),ZRNK 则返回有序集内的要素的排名,诸如此类。
5. 布隆(Bloom)过滤器
布隆过滤器 (Bloom filter) 是一种空间利用率较高的概率数据结构,用来测试某元素是否某个集的一员。可能会出现误报匹配,但不会漏报。查询可返回“可能在集内”或“肯定不在集内”。
就在线服务和离线服务包括大数据分析等方面,布隆过滤器数据结构都能派上很多用场。Facebook 利用布隆过滤器进行输入提示搜索,为用户输入的查询提取朋友和朋友的朋友。Apache HBase 则利用布隆过滤器过滤掉不包含特殊行或列的 HFile 块磁盘读取,使读取速度得到明显提升。Bitly 用布隆过滤器来避免将用户重定向到恶意网站,而 Quara 则在订阅后端执行了一个切分的布隆过滤器,用来过滤掉之前查看过的内容。在我自己的项目里,我用布隆过滤器追踪用户对各个主题的投票情况。
借助出色的速度和处理能力,Redis 极好地融合了布隆过滤器。搜索 GitHub,就能发现很多 Redis 布隆过滤器项目,其中一些还支持可调谐精度。
6. 高效的全局通知:发布/订阅渠道
Redis 发布/订阅渠道的工作方式类似于一个扇出消息传递系统,或 JMS 语义中的一个主题。JMS 主题和 Redis 发布/订阅渠道的一个区别是,通过 Redis 发布的消息并不持久。消息被推送给所有相连的客户端后,Redis 上就会删除这一消息。换句话说,订阅者必须一直在线才能接收新消息。Redis 发布/订阅渠道的典型用例包括实时配置分布、简单的聊天服务器等。
在 web 服务器集群中,每个节点都可以是 Redis 发布/订阅渠道的一个订阅者。发布到渠道上的消息也会被即时推送到所有相连节点。这一消息可以是某种配置更改,也可以是针对所有在线用户的全局通知。和恒定轮询相比,这种推送沟通模式显然极为高效。
Redis 性能优化
Redis 非常强大,但也可以从整体上和根据特定编程场景做出进一步优化。可以考虑以下技巧。
存活时间
所有 Redis 数据结构都具备存活时间 (TTL) 属性。当你设置这一属性时,数据结构会在过期后自动删除。充分利用这一功能,可以让 Redis 保持较低的内存损耗。
管道技术
在一条请求中向 Redis 发送多个命令,这种方法叫做管道技术。这一技术节省了网络往返的成本,这一点非常重要,因为网络延迟可能比 Redis 延迟要高上好几个量级。但这里存在一个陷阱:管道中的 Redis 命令列表必须预先确定,并且应当彼此独立。如果一个命令的参数是由先前命令的结果计算得出,管道技术就不起作用。列表 5 给出了 Redis 管道技术的一个示例。
列表 5:管道技术
@Override
public List fetchLeaderboard(String key, String... playerIds) {
final List entries = new ArrayList<>();
redisTemplate.executePipelined(new RedisCallback() { // enable Redis Pipeline
@Override
public Object doInRedis(RedisConnection connection) throws DataAccessException {
for(String playerId : playerIds) {
Long rank = connection.zRevRank(key.getBytes(), playerId.getBytes());
Double score = connection.zScore(key.getBytes(), playerId.getBytes());
LeaderboardEntry entry = new LeaderboardEntry(playerId,
score!=null?score.intValue():-1, rank!=null?rank.intValue():-1);
entries.add(entry);
}
return null;
}
});
return entries;
}
副本集和切分
Redis 支持主从副本配置。和 MongoDB 一样,副本集也是不对称的,因为从节点是只读的,以便共享读取工作量。我在文章开头提到过,也可以执行切分来横向扩展 Redis 的处理能力和存储容量。事实上,Redis 非常强大,据亚马逊公司的内部基准显示,类型 r3.4xlarge 的一个 EC2 实例每秒可轻松处理 100000 次请求。传说还有把每秒 700000 次请求作为基准的。对于中小型应用程序,通常无需考虑 Redis 切分。(请参见这篇非常出色的文章《运行中的 Redis》,进一步了解 Redis 的性能优化和切分。)
Redis 中的事务
Redis 并不像关系数据库管理系统那样能支持全面的 ACID 事务,但其自有的事务也非常有效。从本质上来说,Redis 事务是管道、乐观锁、确定提交和回滚的结合。其思想是执行一个管道中的一个命令列表,然后观察某一关键记录的潜在更新(乐观锁)。根据所观察的记录是否会被另一个进程更新,该命令列表或整体确定提交,或完全回滚。
下面以某个拍卖网站上的卖方库存为例。买方试图从卖方处购买某件商品时,你负责观察 Redis 事务内的卖方库存变化。同时,你要从同一个库存中删除此商品。事务关闭前,如果库存被一个以上进程触及(例如,如果两个买方同时购买了同一件商品),事务将回滚,否则事务会确定提交。回滚后可开始重试。
Spring Data Redis 中的事务陷阱
我在 Spring 的 RedisTemplate
类 redisTemplate.setEnableTransactionSupport(true)
; 中启用 Redis 事务时得到一个惨痛的教训:Redis 会在运行几天后开始返回垃圾数据,导致数据严重损坏。StackOverflow 上也报道了类似情况。
在运行一个 monitor
命令后,我的团队发现,在进行 Redis 操作或 RedisCallback
后,Spring 并没有自动关闭 Redis 连接,而事实上它是应该关闭的。如果再次使用未关闭的连接,可能会从意想不到的 Redis 密钥返回垃圾数据。有意思的是,如果在 RedisTemplate
中把事务支持设为 false,这一问题就不会出现了。
我们发现,我们可以先在 Spring 语境里配置一个 PlatformTransactionManager
(例如 DataSourceTransactionManager
),然后再用 @Transactional
注释来声明 Redis 事务的范围,让 Spring 自动关闭 Redis 连接。
根据这一经验,我们相信,在 Spring 语境里配置两个单独的 RedisTemplate
是很好的做法:其中一个 RedisTemplates 的事务设为 false,用于大多数 Redis 操作,另一个 RedisTemplates 的事务已激活,仅用于 Redis 事务。当然必须要声明 PlatformTransactionManager
和 @Transactional
,以防返回垃圾数值。
另外,我们还发现了 Redis 事务和关系数据库事务(在本例中,即 JDBC)相结合的不利之处。混合型事务的表现和预想的不太一样。
结论
我希望通过这篇文章向其他 Java 企业开发师介绍 Redis 的强大之处,尤其是将 Redis 用作远程数据缓存和用于易挥发数据时。在这里我介绍了 Redis 的六个有效用例,分享了一些性能优化技巧,还说明了我的 Glu Mobile 团队怎样解决了 Spring Data Redis 事务配置不当造成的垃圾数据问题。我希望这篇文章能够激发你对 Redis NoSQL 的好奇心,让你能够受到启发,在自己的 Java 企业版系统里创造出一番天地。
本文系 OneAPM 工程师编译整理。OneAPM 能为您提供端到端的 Java 应用性能解决方案,我们支持所有常见的 Java 框架及应用服务器,助您快速发现系统瓶颈,定位异常根本原因。分钟级部署,即刻体验,Java 监控从来没有如此简单。想阅读更多技术文章,请访问 OneAPM 官方技术博客。
本文转自 OneAPM 官方博客
你可能感兴趣的:(Spring Data Redis 让 NoSQL 快如闪电(2))
蓝桥杯单片机竞赛学习计划(七)
一支兔子
蓝桥杯 单片机 学习
蓝桥杯单片机学习计划之AT24C02目录前言一、存储器介绍1.随机存储器(RAM)2.只读存储器(ROM)二、AT24C02介绍1.引脚介绍2.通信方式三、代码总结前言之前的章节我们把单片机外围最基础的一些外设如流水灯、数码管以及内部资源定时器和中断都学习完了,那么这一节开始我们学习比较重要的几个模块,今天先来学习存储模块AT24C02。一、存储器介绍存储器,通俗点讲就是能够存储数据的器件,我们都
AAAI 2024 | Attentive Eraser:通过自注意力重定向引导释放扩散模型的物体移除潜力
小白学视觉
计算机顶会论文解读 人工智能 计算机视觉 AAAI 论文解读 计算机顶会
论文信息题目:AttentiveEraser:UnleashingDiffusionModel’sObjectRemovalPotentialviaSelf-AttentionRedirectionGuidanceAttentiveEraser:通过自注意力重定向引导释放扩散模型的物体移除潜力作者:WenhaoSun,BenleiCui,Xue-MeiDong,JingqunTang源码:http
Ubuntu20.04下VSCode配置PCL和OpenCV库-C++
Pertance
vscode opencv c++
Ubuntu20.04+VSCode+Cpp+PCL+OpenCV准备工作代码编辑:VSCode开发语言:C++编译工具:CmakeG++依赖需求:PCL/OpenCV安装PCL库sudoaptinstalllibpcl-dev配置OpenCV库安装依赖sudoapt-getinstallbuild-essentialsudoapt-getinstallcmakegitlibgtk2.0-devp
Hive--桶表
XK&RM
Hive hive
目录1.为什么要使用桶表???2.桶表分桶规则3.桶表的创建3.1DLL3.2数据3.3DML3.4查看桶表里面的数据3.5临时表创建并加载数据3.6把临时表的数据加载到桶表里面4.桶表的查询4.1桶表查询全表的数据4.2桶表查看第一个桶里面的数据4.3查看第二个桶里面的数据4.4查看第三个桶里面的数据4.5查看桶表固定行数据4.6桶表查询语法4.7其他查询5桶表、分区表的区别6两个桶表之间的Jo
华为OD-2024年E卷-分批萨[100分]
菲儿啊
华为od
文章目录题目描述输入描述输出描述用例1解题思路Python3源码题目描述吃货"和"馋嘴"两人到披萨店点了一份铁盘(圆形)披萨,并嘱咐店员将披萨按放射状切成大小相同的偶数个小块。但是粗心的服务员将披萨切成了每块大小都完全不同奇数块,且肉眼能分辨出大小。由于两人都想吃到最多的披萨,他们商量了一个他们认为公平的分法:从"吃货"开始,轮流取披萨。除了第一块披萨可以任意选取外,其他都必须从缺口开始选。他俩选
芋道源码(无遮羞布版)Spring Boot 全景指南
m0_74823611
面试 学习路线 阿里巴巴 spring boot 后端 java
芋道源码(无遮羞布版)SpringBoot全景指南项目地址:https://gitcode.com/gh_mirrors/ru/ruoyi-spring-boot-all一、项目目录结构及介绍芋道源码(ruoyi-spring-boot-all)项目基于SpringBoot构建,旨在提供一个全面且易于定制的企业级应用框架。下面是其主要的目录结构及其简介:ruoyi-spring-boot-all/
学习嵌入式必须学习32单片机吗?
嵌入式开发胖胖
单片机 学习 嵌入式硬件
不要去学STM32”。我不是说STM32不好,而是这种为了学习单片机而去学习单片机的思路不对。你问,如何系统地入门学习stm32?这本身就是一个错误的问题。假如你会使用8051,会写C语言,那么STM32本身并不需要刻意的学习。你要考虑的是,我可以用STM32实现什么?为什么使用STM32而不是8051?是因为51的频率太低,无法满足计算需求
面试题——Java中的锁
m0_67265654
面试 学习路线 阿里巴巴 java javascript 开发语言
文章目录谈谈你对线程安全的理解?1、synchronized关键字是怎么用的?1.1构造方法可以使用synchronized关键字修饰么?1.2使用String作为锁对象,会有什么问题?1.3synchronized的底层原理有了解吗?1.4synchronized怎么保证可重入性?可见性?抛异常怎么办?1.4还使用过其他锁吗?(ReentrantLock)1.5ReentrantLock的实现原
【含文档+PPT+源码】基于SpringBoot和Vue的编程学习系统
小咕聊编程
spring boot vue.js 学习
项目介绍本课程演示的是一款基于SpringBoot和Vue的编程学习系统,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。1.包含:项目源码、项目文档、数据库脚本、软件工具等所有资料2.带你从零开始部署运行本套系统3.该项目附带的源码资料可作为毕设使用该SpringBoot+Vue的编程学习系统,后端采用SpringBoot架构,前端采用Vue+ElementUI实现页
Oracle 18c RAC(cdb多租户)+ADG备库部署以及维护
iverycd
DataGuard 18c rac dg
Oracle18cRAC+ADG备库部署以及维护一、环境部署1.1主机配置1.2实施步骤1.3部署FAQ二、DataGuard数据库应用日志模式2.1ActiveDataGuard模式2.2Real-TimeApply实时应用模式2.3备库停止日志应用三、维护使用3.1打开与关闭RAC+DG数据库3.2检查主备库的归档日志号3.3检查备库的归档日志同步情况以及应用指标参数3.4查看主备库的模式3.
Hive Exception: Too many counters: 2001 max=2000 的解决方法
houzhizhen
hive hive hadoop big data
在hive任务的执行过程中,可能出现Toomanycounters的异常。如果执行引擎时tez,则说明当前作业的counters数量超过tez默认的counters限制。Exception:Toomanycounters:2001max=2000atorg.apache.tez.common.counters.Limits.checkCounters(Limits.java:88)atorg.ap
2024华为OD机试真题-数据分类算法(C++/Java/Python)-E卷-100分
2024剑指offer
华为od c++ python java
2024华为OD机试最新E卷题库-(C卷+D卷+E卷)-(JAVA、Python、C++)目录题目描述输入描述输出描述用例1用例2题目解析考点代码c++pythonJava题目描述对一个数据a进行分类,分类方法为:此数据a(四个字节大小)的四个字节相加对一个给定的值b取模如果得到的结果小于一个给定的值c,则数据a为有效类型,其类型为取模的值如果得到的结果大于或者等于c,则数据a为无效类型比如一个数
2024华为OD机试真题-符号运算-(C++/Python)-C卷D卷-200分
2024剑指offer
华为od c++ python java
【华为OD机试】-(C卷+D卷)-2024最新真题目录题目描述给定一个表达式,求其分数计算结果。表达式的限制如下:所有的输入数字皆为正整数(包括0)仅支持四则运算(+-*,/)和括号结果为整数或分数,分数必须化为最简格式(比如6,3/4,7/8,90/7)除数可能为0,如果遇到这种情况,直接输出"ERROR"输入和最终计算结果中的数字都不会超出整型范围用例输入一定合法,不会出现括号匹配的情况输入描
libcurl编译是出现的error LNK2019: 无法解析的外部符号 __imp__IdnToAscii@20解决方法
李洛克07
技术攻关
网上介绍的都是假的,静态库不能编译过。本人在xp32,win732,win764下面均试过,输出同样的结果。只有编译动态库,引用动态库才能成功。一共两种情况,第一,如果是使用nmake/fmakefile.vcmode=staticVC=10,此处为release版本,如果添加DEBUG=yes为debug版本。则在新建工程,使用libcurl库时时出现:1>libcurld.lib(idn_wi
openssl的aes128_ECB加密解密运算实例
李洛克07
openssl gmssl算法接口的使用 算法 开发语言 openssl 网络安全 aes算法
aes128算法ECB接口加密接口注意事项:EVP_EncryptInit_ex初始化算法EVP_aes_128_ecb(),和密钥,key至少16BEVP_EncryptUpdate加密运算,tmplen输出已加密长度EVP_EncryptFinal_ex结束运算,如果在此仍有加密运算,则加密长度tmplen需补充到密文长度中intopenssl_aes128_encrypt_ecb(unsig
【论文笔记】3DGS压缩相关工作2篇
AndrewHZ
深度学习新浪潮 论文阅读 3DGS 计算机图形学 算法 三维高斯飞溅 压缩方法
1.背景介绍:NVS神经辐射场(NeRFs)引入了一种基于多层感知机(MLP)的新型隐式场景表示方法,它将体密度编码作为几何形状和方向辐射的代理量。渲染通过光线行进的方式来执行。这一解决方案为新视图合成(NVS)带来了前所未有的视觉质量,但代价是训练多层感知机的优化过程极为耗时,且渲染速度很慢。有几种方法加速了训练和渲染过程,通常是利用空间数据结构或者像哈希这样的编码方式,不过牺牲了视觉质量。近期
第0篇:基于C++的通讯录管理系统课程实践项目设计
JuicyActiveGilbert
C++项目实战(初级) c++ 开发语言
项目概述开发一个命令行交互式通讯录管理系统,支持联系人增删改查、数据持久化等功能,逐步引入C++核心语法和编程范式,最终实现一个面向对象、内存安全、支持数据序列化的完整应用。规划与知识点分布篇目标题知识点项目实现目标1VS2022环境搭建与第一个C++程序VS安装配置、项目创建、HelloWorld创建项目框架,验证开发环境2C++基础语法与结构体应用数据类型、变量、I/O操作、结构体定义联系人结
ZC3201 耐压40V输出12V 300mA LDO
HPT_Lt
嵌入式硬件
概述ZC3201是一款40V高精度微安级功率LDO稳压器。只有luA的功耗使其适用于大多数高压节电系统。其最大工作电压高达40V.其他功能包括低压差,±1%的极高输出精度,限流保护和高纹波抑制比。ZC3201采用SOT89-3,SOT23-3和SOT23-5封装。特点宽工作电压范围:2.5-40V输出电压:1.8V、2.5V、3.0V、3.3V、3.6V、4.0V、4.2V、5.0V、5.3V、5
Self-Attentive Sequential Recommendation论文阅读笔记
调包调参侠
推荐系统学习 深度学习 机器学习 神经网络 算法
SASRec论文阅读笔记论文标题:Self-AttentiveSequentialRecommendation发表于:2018ICDM作者:Wang-ChengKang,JulianMcAuley论文代码:https://github.com/pmixer/SASRec.pytorch论文地址:https://arxiv.org/pdf/1808.09781v1.pdf摘要顺序动态是许多现代推荐系
AI大模型学习笔记-- 大模型应用技术架构
AI大模型-搬运工
人工智能 学习 笔记 语言模型 大模型 AI大模型 AI
AI大模型学习笔记--大模型应用技术架构大模型就像是大脑,就像孩子从小学习说话和认知世界一样,通过大量的数据学习,能够理解语言、识别图像、玩游戏、写作、作曲等。如果2023年是AI大模型爆发的一年,很多大厂投入到大模型的研发中,很多创业者通过AI大模型拿到了大笔融资,那对于2024年,将是AI大模型应用大爆发的一年,将有更多的普通人加入到这一浪潮中来。今天,请跟着我一起来揭开大模型应用的神秘面纱,
【蓝桥杯单片机】第十二届省赛
promising-w
蓝桥杯 蓝桥杯 单片机 嵌入式硬件
一、真题二、模块构建1.编写初始化函数(init.c)voidCls_Peripheral(void);关闭ledled对应的锁存器由Y4C控制关闭蜂鸣器和继电器由Y5C控制2.编写LED函数(led.c)voidLed_Disp(unsignedcharucLed);将ucLed取反的值赋给P0开启锁存器关闭锁存器3.编写数码管函数(seg.c)voidSeg_Tran(unsignedchar
IP地址查询网站(此类网站失效快,动态更新)
初级代码游戏
软件开发 tcp/ip 网络协议 网络
以前记录的又失效了,感觉这个问题好像没有官方解决方案,都是一些企业和个人基于不知道什么目的做的。my-ip.cc(验证时间2025.2.24)查IPv4地址:https://my-ip.cc/zh-hans/输出为网页。ipw.cn(验证时间2025.2.24)查IPv4地址:curl4.ipw.cn命令行运行,输出:>curl4.ipw.cnStatusCode:200StatusDescrip
2025华为OD机试真题目录【E卷+A卷+B卷+C卷+D卷】持续收录中...
耀耀zz
2025最新华为OD机试题目 华为od 算法
摘要本专栏提供2025最新最全的华为OD机试真题库(E+A+B+C+D卷),包括100分和200分题型。题目包含题目描述、输入描述、用例、备注和解题思路、多种语言解法(Java/JS/Py/C/C++)。希望小伙伴们认真学习、顺利通过。声明本专栏的文章主要包括两部分:第一部分:题目描述、输入描述、用例。第二部分:解题思路、源码。第一部分信息来自互联网,不是本专栏付费内容,如果这一部分内容侵犯了原著
Linux Sed实战指南:从入门到精通
ivwdcwso
运维 linux 运维 服务器
一、Sed核心概念与优势Sed(StreamEditor)是一种非交互式的流式文本编辑器,通过逐行处理实现自动化文本操作。其核心优势包括:无需打开文件:直接通过命令行操作文本流,适用于脚本自动化高效处理大文件:仅将当前处理行加载到内存,资源消耗低支持正则表达式:实现复杂模式匹配与替换原地编辑能力:通过-i选项直接修改源文件©ivwdcwso(ID:u012172506)二、Sed基础操作大全1.文
Hive 3.1 在 metastore 运行的 remote threads
houzhizhen
hive hive hadoop 数据仓库
Remotethreads是仅当Hivemetastore作为单独的服务运行是启动,请求需要开启compactor。有以下几种:1.AcidOpenTxnsCounterService统计当前open的事务数从表TXNS中统计状态为open的事务。此事务数量可以再hivemetrics中。2.AcidHouseKeeperService定期调用txnHandler.performTimeOuts(
Virtual Scrolling 虚拟滚动优化方案
shaoin_2
前端零碎 前端 vue.js
虚拟滚动(VirtualScrolling)是一种优化前端渲染大量数据的技术,它通过按需渲染可见区域的内容,避免一次性创建所有DOM元素,从而解决性能问题。以下是其核心原理:1.核心思想物理世界:假设列表有10,000条数据,传统渲染会生成10,000个DOM节点。虚拟滚动:只渲染用户当前可见的20条数据(视窗区域),其余数据通过占位和位置偏移模拟完整列表。2.实现步骤(1)容器与占位容器高度:设
AcWing 429. 奖学金(寒假每日一题)入门组
程序员朱帅
数据结构 笔记 计算机 c++
题目描述某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金。期末,每个学生都有3门课的成绩:语文、数学、英语。先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序,如果两个同学总分和语文成绩都相同,那么规定学号小的同学排在前面,这样,每个学生的排序是唯一确定的。任务:先根据输入的3门课的成绩计算总分,然后按上述规则排序,最后按排名顺序输出前五名学生的学号
aws aurora vs mysql_GitHub - NageNalock/aws-AuroraVsMySQL: Aurora 与 MySQL 对比试验
俠之大者
aws aurora vs mysql
RDS-Aurora与RDS-MySQL性能对比实验实验目的使用Sysbench对Aurora与MySQL进行基准测试,对比二者的读写性能.本实验大约耗时30分钟,实验区域为俄勒冈(您也可以根据实际情况自行更改)涉及组件RDS-AuroraRDS-MySQLEC2实验步骤重要本实验默认您已经拥有了AWS账户并创建了IAM用户若未执行以上设置,可参考这里配置VPC将安全组的入站规则设置为Type:A
计算机网络socket实验报告2,计算机网络socket编程实验报告.docx
超级爱喝水
Socket编程实验报告一、程序代码(1)服务器端#include#include#pragmacomment(lib,"ws2_32.lib")voidmain(){WORDwVersionRequested;WSADATAwsaData;interr;wVersionRequested=MAKEWORD(1,1);err=WSAStartup(wVersionRequested,&wsaDat
【计算机网络】多路复用
茉菇
php 开发语言
1.定义与核心思想多路复用(Multiplexing)是一种通过单一资源(如一个线程、一个网络连接或一个物理信道)同时处理多个独立任务或数据流的技术。其核心目标是提高资源利用率,避免为每个任务单独分配资源导致的性能瓶颈或资源浪费。2.多路复用的类型根据应用场景和技术实现,多路复用主要分为以下两类:2.1物理层的多路复用(通信领域)用于在单一物理媒介(如光纤、电缆)中同时传输多路信号:频分多路复用(
SAX解析xml文件
小猪猪08
xml
1.创建SAXParserFactory实例
2.通过SAXParserFactory对象获取SAXParser实例
3.创建一个类SAXParserHander继续DefaultHandler,并且实例化这个类
4.SAXParser实例的parse来获取文件
public static void main(String[] args) {
//
为什么mysql里的ibdata1文件不断的增长?
brotherlamp
linux linux运维 linux资料 linux视频 linux运维自学
我们在 Percona 支持栏目经常收到关于 MySQL 的 ibdata1 文件的这个问题。
当监控服务器发送一个关于 MySQL 服务器存储的报警时,恐慌就开始了 —— 就是说磁盘快要满了。
一番调查后你意识到大多数地盘空间被 InnoDB 的共享表空间 ibdata1 使用。而你已经启用了 innodbfileper_table,所以问题是:
ibdata1存了什么?
当你启用了 i
Quartz-quartz.properties配置
eksliang
quartz
其实Quartz JAR文件的org.quartz包下就包含了一个quartz.properties属性配置文件并提供了默认设置。如果需要调整默认配置,可以在类路径下建立一个新的quartz.properties,它将自动被Quartz加载并覆盖默认的设置。
下面是这些默认值的解释
#-----集群的配置
org.quartz.scheduler.instanceName =
informatica session的使用
18289753290
workflow session log Informatica
如果希望workflow存储最近20次的log,在session里的Config Object设置,log options做配置,save session log :sessions run ;savesessio log for these runs:20
session下面的source 里面有个tracing
Scrapy抓取网页时出现CRC check failed 0x471e6e9a != 0x7c07b839L的错误
酷的飞上天空
scrapy
Scrapy版本0.14.4
出现问题现象:
ERROR: Error downloading <GET http://xxxxx CRC check failed
解决方法
1.设置网络请求时的header中的属性'Accept-Encoding': '*;q=0'
明确表示不支持任何形式的压缩格式,避免程序的解压
java Swing小集锦
永夜-极光
java swing
1.关闭窗体弹出确认对话框
1.1 this.setDefaultCloseOperation (JFrame.DO_NOTHING_ON_CLOSE);
1.2
this.addWindowListener (
new WindowAdapter () {
public void windo
强制删除.svn文件夹
随便小屋
java
在windows上,从别处复制的项目中可能带有.svn文件夹,手动删除太麻烦,并且每个文件夹下都有。所以写了个程序进行删除。因为.svn文件夹在windows上是只读的,所以用File中的delete()和deleteOnExist()方法都不能将其删除,所以只能采用windows命令方式进行删除
GET和POST有什么区别?及为什么网上的多数答案都是错的。
aijuans
get post
如果有人问你,GET和POST,有什么区别?你会如何回答? 我的经历
前几天有人问我这个问题。我说GET是用于获取数据的,POST,一般用于将数据发给服务器之用。
这个答案好像并不是他想要的。于是他继续追问有没有别的区别?我说这就是个名字而已,如果服务器支持,他完全可以把G
谈谈新浪微博背后的那些算法
aoyouzi
谈谈新浪微博背后的那些算法
本文对微博中常见的问题的对应算法进行了简单的介绍,在实际应用中的算法比介绍的要复杂的多。当然,本文覆盖的主题并不全,比如好友推荐、热点跟踪等就没有涉及到。但古人云“窥一斑而见全豹”,希望本文的介绍能帮助大家更好的理解微博这样的社交网络应用。
微博是一个很多人都在用的社交应用。天天刷微博的人每天都会进行着这样几个操作:原创、转发、回复、阅读、关注、@等。其中,前四个是针对短博文,最后的关注和@则针
Connection reset 连接被重置的解决方法
百合不是茶
java 字符流 连接被重置
流是java的核心部分,,昨天在做android服务器连接服务器的时候出了问题,就将代码放到java中执行,结果还是一样连接被重置
被重置的代码如下;
客户端代码;
package 通信软件服务器;
import java.io.BufferedWriter;
import java.io.OutputStream;
import java.io.O
web.xml配置详解之filter
bijian1013
java web.xml filter
一.定义
<filter>
<filter-name>encodingfilter</filter-name>
<filter-class>com.my.app.EncodingFilter</filter-class>
<init-param>
<param-name>encoding<
Heritrix
Bill_chen
多线程 xml 算法 制造 配置管理
作为纯Java语言开发的、功能强大的网络爬虫Heritrix,其功能极其强大,且扩展性良好,深受热爱搜索技术的盆友们的喜爱,但它配置较为复杂,且源码不好理解,最近又使劲看了下,结合自己的学习和理解,跟大家分享Heritrix的点点滴滴。
Heritrix的下载(http://sourceforge.net/projects/archive-crawler/)安装、配置,就不罗嗦了,可以自己找找资
【Zookeeper】FAQ
bit1129
zookeeper
1.脱离IDE,运行简单的Java客户端程序
#ZkClient是简单的Zookeeper~$ java -cp "./:zookeeper-3.4.6.jar:./lib/*" ZKClient
1. Zookeeper是的Watcher回调是同步操作,需要添加异步处理的代码
2. 如果Zookeeper集群跨越多个机房,那么Leader/
The user specified as a definer ('aaa'@'localhost') does not exist
白糖_
localhost
今天遇到一个客户BUG,当前的jdbc连接用户是root,然后部分删除操作都会报下面这个错误:The user specified as a definer ('aaa'@'localhost') does not exist
最后找原因发现删除操作做了触发器,而触发器里面有这样一句
/*!50017 DEFINER = ''aaa@'localhost' */
原来最初
javascript中showModelDialog刷新父页面
bozch
JavaScript 刷新父页面 showModalDialog
在页面中使用showModalDialog打开模式子页面窗口的时候,如果想在子页面中操作父页面中的某个节点,可以通过如下的进行:
window.showModalDialog('url',self,‘status...’); // 首先中间参数使用self
在子页面使用w
编程之美-买书折扣
bylijinnan
编程之美
import java.util.Arrays;
public class BookDiscount {
/**编程之美 买书折扣
书上的贪心算法的分析很有意思,我看了半天看不懂,结果作者说,贪心算法在这个问题上是不适用的。。
下面用动态规划实现。
哈利波特这本书一共有五卷,每卷都是8欧元,如果读者一次购买不同的两卷可扣除5%的折扣,三卷10%,四卷20%,五卷
关于struts2.3.4项目跨站执行脚本以及远程执行漏洞修复概要
chenbowen00
struts WEB安全
因为近期负责的几个银行系统软件,需要交付客户,因此客户专门请了安全公司对系统进行了安全评测,结果发现了诸如跨站执行脚本,远程执行漏洞以及弱口令等问题。
下面记录下本次解决的过程以便后续
1、首先从最简单的开始处理,服务器的弱口令问题,首先根据安全工具提供的测试描述中发现应用服务器中存在一个匿名用户,默认是不需要密码的,经过分析发现服务器使用了FTP协议,
而使用ftp协议默认会产生一个匿名用
[电力与暖气]煤炭燃烧与电力加温
comsci
在宇宙中,用贝塔射线观测地球某个部分,看上去,好像一个个马蜂窝,又像珊瑚礁一样,原来是某个国家的采煤区.....
不过,这个采煤区的煤炭看来是要用完了.....那么依赖将起燃烧并取暖的城市,在极度严寒的季节中...该怎么办呢?
&nbs
oracle O7_DICTIONARY_ACCESSIBILITY参数
daizj
oracle
O7_DICTIONARY_ACCESSIBILITY参数控制对数据字典的访问.设置为true,如果用户被授予了如select any table等any table权限,用户即使不是dba或sysdba用户也可以访问数据字典.在9i及以上版本默认为false,8i及以前版本默认为true.如果设置为true就可能会带来安全上的一些问题.这也就为什么O7_DICTIONARY_ACCESSIBIL
比较全面的MySQL优化参考
dengkane
mysql
本文整理了一些MySQL的通用优化方法,做个简单的总结分享,旨在帮助那些没有专职MySQL DBA的企业做好基本的优化工作,至于具体的SQL优化,大部分通过加适当的索引即可达到效果,更复杂的就需要具体分析了,可以参考本站的一些优化案例或者联系我,下方有我的联系方式。这是上篇。
1、硬件层相关优化
1.1、CPU相关
在服务器的BIOS设置中,可
C语言homework2,有一个逆序打印数字的小算法
dcj3sjt126com
c
#h1#
0、完成课堂例子
1、将一个四位数逆序打印
1234 ==> 4321
实现方法一:
# include <stdio.h>
int main(void)
{
int i = 1234;
int one = i%10;
int two = i / 10 % 10;
int three = i / 100 % 10;
apacheBench对网站进行压力测试
dcj3sjt126com
apachebench
ab 的全称是 ApacheBench , 是 Apache 附带的一个小工具 , 专门用于 HTTP Server 的 benchmark testing , 可以同时模拟多个并发请求。前段时间看到公司的开发人员也在用它作一些测试,看起来也不错,很简单,也很容易使用,所以今天花一点时间看了一下。
通过下面的一个简单的例子和注释,相信大家可以更容易理解这个工具的使用。
2种办法让HashMap线程安全
flyfoxs
java jdk jni
多线程之--2种办法让HashMap线程安全
多线程之--synchronized 和reentrantlock的优缺点
多线程之--2种JAVA乐观锁的比较( NonfairSync VS. FairSync)
HashMap不是线程安全的,往往在写程序时需要通过一些方法来回避.其实JDK原生的提供了2种方法让HashMap支持线程安全.
Spring Security(04)——认证简介
234390216
Spring Security 认证 过程
认证简介
目录
1.1 认证过程
1.2 Web应用的认证过程
1.2.1 ExceptionTranslationFilter
1.2.2 在request之间共享SecurityContext
1
Java 位运算
Javahuhui
java 位运算
// 左移( << ) 低位补0
// 0000 0000 0000 0000 0000 0000 0000 0110 然后左移2位后,低位补0:
// 0000 0000 0000 0000 0000 0000 0001 1000
System.out.println(6 << 2);// 运行结果是24
// 右移( >> ) 高位补"
mysql免安装版配置
ldzyz007
mysql
1、my-small.ini是为了小型数据库而设计的。不应该把这个模型用于含有一些常用项目的数据库。
2、my-medium.ini是为中等规模的数据库而设计的。如果你正在企业中使用RHEL,可能会比这个操作系统的最小RAM需求(256MB)明显多得多的物理内存。由此可见,如果有那么多RAM内存可以使用,自然可以在同一台机器上运行其它服务。
3、my-large.ini是为专用于一个SQL数据
MFC和ado数据库使用时遇到的问题
你不认识的休道人
sql C++ mfc
===================================================================
第一个
===================================================================
try{
CString sql;
sql.Format("select * from p
表单重复提交Double Submits
rensanning
double
可能发生的场景:
*多次点击提交按钮
*刷新页面
*点击浏览器回退按钮
*直接访问收藏夹中的地址
*重复发送HTTP请求(Ajax)
(1)点击按钮后disable该按钮一会儿,这样能避免急躁的用户频繁点击按钮。
这种方法确实有些粗暴,友好一点的可以把按钮的文字变一下做个提示,比如Bootstrap的做法:
http://getbootstrap.co
Java String 十大常见问题
tomcat_oracle
java 正则表达式
1.字符串比较,使用“==”还是equals()? "=="判断两个引用的是不是同一个内存地址(同一个物理对象)。 equals()判断两个字符串的值是否相等。 除非你想判断两个string引用是否同一个对象,否则应该总是使用equals()方法。 如果你了解字符串的驻留(String Interning)则会更好地理解这个问题。
SpringMVC 登陆拦截器实现登陆控制
xp9802
springMVC
思路,先登陆后,将登陆信息存储在session中,然后通过拦截器,对系统中的页面和资源进行访问拦截,同时对于登陆本身相关的页面和资源不拦截。
实现方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23