2026年2月

今天打开 cf 说看一下网站流量,结果找不到以前的一些功能了。
本来流量统计这里,是有按照维度聚合的,比如 ip、请求头啥的,可是今天突然没有了,昨天还有的。
有朋友知道他是砍了还是挪到别的地方去了吗
image]

昨晚列了一下 2026 要做的事,发现好多都是比较大的想法。

比如什么副业,健身、结婚等等,还要继续拆到最小落地的计划

大家 2026 都有什么计划?是怎么把拆分落地的?

一、为什么需要IP地址SSL证书?

在许多企业级应用和开发场景中,IP直连是刚需:

  1. 无域名的内部系统:企业的ERP、OA后台或工业控制面板,往往仅通过内网IP访问,没有配置域名 。
  2. 开发与测试环境:开发人员在本地或云服务器调试代码时,使用IP地址配置HTTPS可以更真实地模拟生产环境 。
  3. API接口与设备通信:物联网设备、银行专线接口等,通常直接与固定IP进行加密数据传输。
  4. 避免域名暴露:某些高安全需求场景下,使用IP而非域名可以减少子域名枚举攻击的风险。

二、IP证书与域名证书有何不同?

IP地址SSL证书的原理与域名证书类似,都是通过CA(证书颁发机构)验证所有权后,绑定公网IP并实现HTTPS加密。但IP证书的申请门槛更高:

  • 必须是公网IP:CA机构需要能够访问该IP的80或443端口进行验证,内网IP(如192.168.x.x)无法申请公共信任的SSL证书。
  • 验证方式特殊:由于IP无法做DNS解析,IP证书通常仅支持文件验证(HTTP验证)。
  • 供应商较少:并非所有CA都支持IP证书签发,选择时需要特别甄别 。

三、为什么选择JoySSL申请IP证书?

IP证书申请入口

在众多SSL品牌中,JoySSL凭借其对IP证书的友好支持和本土化服务,成为无域名用户的理想选择。

  1. 支持IP证书签发
    JoySSL是国内较早支持公网IP地址SSL证书申请的CA机构之一,无论是DV(域名验证型)还是OV(企业验证型)IP证书,都能提供完整的解决方案 。
  2. 提供免费测试版本
    对于个人开发者或初期测试环境,JoySSL提供IP证书的免费试用版。用户只需在注册时填写特定注册码230970,即可获得申请权限,极大降低了试错成本。
  3. 数据不出境,合规更安心
    JoySSL作为国产CA,其验签服务器部署在国内。对于政府、教育、金融等有数据合规要求的领域,使用JoySSL意味着敏感信息无需出境,满足等保合规要求 。
  4. 自动化管理工具
    JoySSL平台提供证书到期预警和一键部署脚本,帮助用户避免因证书忘记续期而导致的业务中断 。

四、JoySSL IP证书申请全流程(四步搞定)

如果您手头只有一个公网IP,别担心,跟着以下步骤即可快速实现IP HTTPS加密。

第一步:注册账号并获取权限
  • 访问JoySSL官方网站,点击“注册”。
  • 在注册过程中,填写特定注册码 230970(免费证书申请必填),完成账号创建 。
第二步:选择IP证书并下单
  • 登录后台,在证书选择界面找到“IP SSL证书”或“IP地址证书”。
  • 根据需求选择证书类型:

    • DV IP证书:验证最快,适用于个人或测试环境。
    • OV IP证书:验证企业身份,适用于商业系统。
  • 提交您的公网IP地址,完成下单(试用版免费)。
第三步:完成IP所有权验证
  • 验证方式:IP证书通常采用文件验证。您需要在IP地址对应的网站根目录下,创建指定的验证文件(例如:http://您的IP/.well-known/pki-validation/xxx.txt)。
  • 关键点:确保该IP的80端口(HTTP服务)能够被公网访问,且未开启强制HTTPS跳转,否则CA无法读取验证文件 。
  • 提交验证后,通常10分钟至几小时内即可完成审核。
第四步:下载证书并部署到服务器
  • 审核通过后,在JoySSL后台下载证书压缩包(包含Nginx、Apache、IIS等主流服务器格式)。

本篇所录,仅为笔者基于个人生活与工作经历的点滴所思。囿于自身有限的阅历、所处的行业环境,以及个人在认知、智力与情感维度上的局限,文中所涉收藏相关话题的观点与认同,难免带有个人视角的色彩。权当一份阶段性的思考笔记,未必周全,贵在真实。

https://github.com/hoochanlon/hamuleite

局限:

  • 大千世界无奇不有,以及笔者想不到的内容;期望能够做到记录一生经历的话题,至少做到记录下一个 30 年
  • 仅基于笔者个人经历的所思所想,受限于笔者的生活/工作环境与职业经历,以及个人的智商、情商维度,收藏相关话题的观点认同

之前申请了一直没用,最近换手机 tg 登不上了,之前用澳门蓝卡注册的,卡过期了找不回来了。看最近都说 gg 封号,这个号能注册 tg 么?

引言:内网安全升级的必然选择

在数字化转型加速推进的当下,内网安全已成为企业核心竞争力的关键组成部分。传统RSA算法因密钥长度不足、抗量子计算能力弱等问题,逐渐暴露出安全隐患。与此同时,我国自主研发的SM2算法凭借其高安全性、高效率及自主可控特性,成为内网加密生态升级的核心技术支撑。国密IP证书作为SM2算法的载体,通过绑定内网IP地址与设备身份,构建起“身份认证+数据加密+访问控制”三位一体的安全防护体系,为内网安全提供了全新解决方案。

国密算法内网IP证书,满足密评需要,支持免费试用,注册码230959

一、RSA算法的局限性:内网安全的潜在风险

1. 密钥长度与计算效率的矛盾

RSA算法的安全性依赖于大整数分解的难度。随着计算能力的提升,1024位RSA密钥已可被破解,2048位密钥虽能满足当前需求,但其密钥长度(2048位)远超SM2算法的256位,导致计算效率低下。例如,在金融交易场景中,RSA签名验证耗时是SM2的3-5倍,难以满足高并发需求。

2. 抗量子计算能力的缺失

量子计算的发展对RSA构成致命威胁。Shor算法可在多项式时间内分解大整数,使现有RSA密钥体系崩溃。相比之下,SM2基于椭圆曲线离散对数问题,在量子计算环境下具有更强的抗攻击能力,为内网安全提供了长期保障。

3. 实现漏洞与后门风险

RSA算法在实现过程中存在诸多漏洞,如随机数生成缺陷、填充方案漏洞等。例如,2012年Android系统因随机数生成器熵不足,导致数万设备共享同一RSA密钥,引发大规模数据泄露。此外,国际算法可能存在技术后门,威胁国家信息安全。

二、SM2算法的优势:内网加密的革新力量

1. 高安全性与短密钥

SM2采用256位椭圆曲线密钥,其安全强度相当于3072位RSA密钥,但计算效率提升3倍以上。例如,在政务信息化场景中,SM2签名验证耗时仅0.5ms,较RSA缩短70%,显著提升系统吞吐量。

2. 自主可控与合规性

SM2是我国自主研发的密码算法,符合国家密码管理局标准,可避免国际算法的技术封锁与后门风险。在等保三级要求中,SM2已成为内网加密的强制标准,助力企业通过合规审计。

3. 多功能集成与灵活性

SM2支持数字签名、密钥交换与公钥加密,可覆盖内网全场景需求。例如:

  • 数字签名:确保数据来源可靠性与完整性,防止伪造与篡改;
  • 密钥交换:通过椭圆曲线Diffie-Hellman协议实现安全会话密钥协商;
  • 公钥加密:结合SM4对称加密算法,实现端到端数据保护。

三、国密IP证书的核心价值:重塑内网安全生态

1. 身份认证:从IP地址到可信凭证

国密IP证书将内网IP地址与设备身份强绑定,形成唯一数字标识。例如,在医疗机构信息系统中,医护人员通过证书访问电子病历,系统可精准追溯操作行为,防止数据泄露。

2. 数据加密:全流程安全防护

国密IP证书结合SSL/TLS协议,实现内网通信全流程加密。以金融机构交易后台为例,用户发起转账请求后,数据从客户端到银行服务器的传输过程中,均采用SM2加密与SM3哈希校验,确保交易安全。

3. 访问控制:精细化权限管理

基于证书属性,企业可实施最小权限原则。例如,在教育机构校园网中,重点实验室仅允许授权设备访问实验数据采集平台,通过证书吊销机制实时阻断非法访问。

4. 审计追溯:安全事件快速定位

国密IP证书记录所有操作日志,包括认证时间、访问设备与行为内容。在工业互联网场景中,若发生设备异常,管理人员可通过审计日志快速定位问题IP与操作人,缩短响应时间。

四、国密IP证书申请与部署:五步实现安全升级

1. 选择合规CA机构

优先选择获得国家密码管理局认证的CA机构,如JoySSL、CFCA、上海CA等。国际CA机构通常不提供国密算法证书,需避免选择。

2. 提交申请与验证

  • 生成密钥对:使用GmSSL、OpenSSL等工具生成SM2密钥对,妥善保管私钥;
  • 提交CSR文件:在CA平台填写内网IP、组织信息,上传证书签名请求文件;
  • 完成验证:OV证书需人工审核企业资料,DV证书通过技术手段自动验证(如放置验证文件至目标IP服务器)。

3. 签发与下载证书

审核通过后,CA签发包含SM2签名证书与加密证书的文件包。例如,CFCA签发的证书包通常包含.crt(证书文件)与.key(私钥文件)。

4. 服务器部署与配置

以Nginx为例:

nginx
server {
    listen 443 ssl;
    ssl_certificate /path/to/sm2.crt;
    ssl_certificate_key /path/to/sm2.key;
    ssl_protocols TLSv1.3;
    ssl_ciphers ECC-SM2-WITH-SM4-SM3;
}
  • 禁用弱算法:仅启用国密套件,避免降级攻击;
  • 测试验证:使用GmSSL工具测试握手协议,确认无弱算法使用记录。

5. 自动化运维与监控

  • 证书生命周期管理:通过内部PKI体系实现证书自动更新与吊销;
  • 日志审计:记录所有SSL握手事件,满足等保三级要求;
  • 可视化监控:部署安全运营中心(SOC),实时监控证书状态与加密流量。

五、未来展望:国密算法的星辰大海

随着《密码法》与信创产业的推进,SM2算法将在更多关键领域替代RSA。例如:

  • 量子计算融合:研发抗量子SM9算法,提前布局后量子时代;
  • 物联网轻量化:优化证书格式,适配低功耗设备;
  • 云原生集成:与Kubernetes等云平台深度融合,实现动态证书管理。

结语:守护内网安全的中国方案

国密IP证书不仅代表着密码技术的升级,更象征着企业安全理念与管理模式的深刻变革。从RSA到SM2的转型,是企业构建自主可控内网安全体系的必由之路。那些率先采用国密IP证书的企业,正在通过“身份可信、数据加密、访问可控”的三维防护,筑牢数字时代的安全防线,将技术投入转化为实实在在的竞争优势。

大家好,我是 Java陈序员

无论是打工人的日常工作排期,还是小团队的项目合作,都需要一款任务管理工具。用商用工具,高级功能不仅需要付费,而且担心隐私泄漏;用简易代办工具,又满足不了团队协作、多视图管理的需求。

今天,给大家介绍一款自托管的全能代办协作工具,同时适合团队和个人使用!

关注微信公众号:【Java陈序员】,获取开源项目分享、AI副业分享、超200本经典计算机电子书籍等。

项目介绍

vikunja —— 一款开源的、可自托管的待办事项/任务管理应用,旨在帮助个人或团队组织工作任务,支持多平台部署和丰富的任务管理功能。

功能特色

  • 私有化部署灵活:支持 Docker/K8s/Debain 部署、源码构建、预编译包安装等多种方式,个人服务器即可轻量运行
  • 多维度任务视图:提供列表、甘特图、表格、看板多种任务视图,支持拖拽式操作
  • 沉浸式操作体验:提供富文本编辑器,支持 Markdown、表格、图片、代码高等,并提供快捷键操作
  • 精细化权限控制:支持团队权限分级、API 令牌精细化管控,同时可生成带密码/无密码的共享链接,外部人员无需注册即可访问

技术栈

  • 后端:Go + Sqlite/MySQL
  • 前端:Vue + TypeScript

快速上手

vikunja 支持 Docker 部署,可使用 Docker 快速部署。

1、拉取镜像

docker pull vikunja/vikunja

2、创建挂载目录并设置权限

mkdir -p /data/software/vikunja/{files,db}

chown 1000 /data/software/vikunja/files /data/software/vikunja/db

3、运行容器

docker run -d \
    --name vikunja \
    -p 3456:3456 \
    -v /data/software/vikunja/files:/app/vikunja/files \
    -v /data/software/vikunja/db:/db \
    -e VIKUNJA_CORS_ENABLE=false \
    vikunja/vikunja

4、容器启动成功后,浏览器访问

http://{IP/域名}:3456

5、首次使用,需要先创建账户后再登录使用

功能体验

  • 概览

  • 即将开始

  • 项目

  • 代办事项

  • 团队

  • 甘特图

  • 看板

可以说,vikunja 这款开源免费的代码事项应用,既能满足个人日常任务管理需求,也能支撑团队高效协作。如果你想要一款自托管的任务管理工具,不妨试试!快去部署体验吧~

项目地址:https://github.com/go-vikunja/vikunja

最后

推荐的开源项目已经收录到 GitHub 项目,欢迎 Star

https://github.com/chenyl8848/great-open-source-project

或者访问网站,进行在线浏览:

https://chencoding.top:8090/#/

我创建了一个开源项目交流群,方便大家在群里交流、讨论开源项目

但是任何人在群里打任何广告,都会被 T 掉

如果你对这个交流群感兴趣或者在使用开源项目中遇到问题,可以通过如下方式进群

关注微信公众号:【Java陈序员】,回复【开源项目交流群】进群,或者通过公众号下方的菜单添加个人微信,并备注【开源项目交流群】,通过后拉你进群

大家的点赞、收藏和评论都是对作者的支持,如文章对你有帮助还请点赞转发支持下,谢谢!

👉arp

👉github


把这段复制给你的🦞

Install ARP on this machine by following the instructions here:
https://arp.offgrid.ing/SKILL.md

然后和🦞说 “发个消息给 9R1hQxfHGYVaZe47efefJZticDsXbLkpRYF5bdpZ4mfU 明天一起去吃饭”就可以了


原本是一个之前和朋友之间用的工具,现在夜深人静整理后分享出来,我已经嘱咐过上面这个 agent 要回复你们所有人的消息,睡了祝你们聊的愉快。


如果要收到回复,需要要么改成接收所有人消息,要么把这个地址添加到联系人,不用管具体怎么做,让 agent 去做就行,skill 里有教。

一、为什么要折腾“内网穿透”

不知道你有没有遇到过这种情况:

  • 在公司突然想连一下家里的 NAS,发现根本进不去
  • 出门在外,想远程连家里某台电脑,却卡在“内网环境”
  • 好不容易搭了个小应用,想分享给朋友,结果一句话劝退:

    「你这是内网,我访问不了……」

以前我也觉得,这事得上服务器、搞隧道、折腾一堆工具。

后来才发现,其实对大多数家庭用户来说:

只要路由器拨号 + DDNS,就够了。

不用买服务器,不用跑中转,不用折腾复杂方案,
稳定、省事,而且成本几乎为零。


二、什么是“路由器拨号 + DDNS”

先别被名词劝退,我们拆开来说。

① 路由器拨号是啥?

简单点讲,就是把原本由光猫完成的拨号动作,交给路由器来做

这样做有一个非常关键的好处:

👉 公网 IP 会直接落在路由器上

后面所有端口映射、远程访问,都会顺很多。


② DDNS 又是干嘛的?

家用宽带有个特点:
公网 IP 经常变,路由器一重启,IP 可能就不一样了。

DDNS 的作用一句话就能说清:

把“经常变化的 IP”,绑定到一个固定的域名上

你以后只记住域名就行,
IP 怎么变,DDNS 会帮你自动处理。


三、开始动手前,需要准备什么

别急着进路由器后台,先对一下清单。

你需要准备这些东西:

  • 如果你家现在是光猫拨号,需要联系运营商改成路由器拨号
  • 一台支持 PPPoE 拨号的路由器
  • 运营商给你的宽带账号 + 密码
  • 一个 DDNS 服务(具体看路由器支持哪些)

常见、好用的 DDNS 服务有:

  • 花生壳(有随机域名,也支持自定义域名)
  • Cloudflare(免费、稳定、功能多)
  • 路由器厂商自带的 DDNS(不少品牌都支持)

PixPin_2026-02-24_19-19-43.png


四、路由器拨号,其实就三步

不同路由器界面不一样,但思路基本一致。

① 进入路由器后台

后台地址、账号/密码一般在路由器背面的贴纸上,比如:192.168.31.1


② 上网方式选择 PPPoE(宽带拨号)

把运营商给你的账号和密码填进去。


③ 保存并重启

PixPin_2026-02-24_12-58-30.png

重启完成后,去路由器的上网状态页看看:

  • ✅ 已联网
  • WAN 口获取到公网 IP

看到这里,说明一件事:

外网,已经真正进到你家路由器了。

五、DDNS 配置:最关键,但真的不难

这里以「路由器自带 DDNS + 花生壳」为例,说一下通用流程。

① 注册 DDNS(以花生壳为例)

完成实名认证后,会分配一个随机域名给你。
如果你有自己的域名,也可以绑定过来用。

PixPin_2026-02-24_13-15-34.png


② 打开路由器 DDNS 功能

一般在:

高级设置 → DDNS

③ 填写服务商信息

需要填写的无非这几项:

  • DDNS 服务商
  • 域名(比如 home.xxx.com
  • 账号 / 密码 / 域名信息
    PixPin_2026-02-24_13-19-02.png

配置完成后,路由器会自动做一件事:

只要公网 IP 发生变化,就立刻同步到你的域名

从这一刻开始,你基本可以忘掉 IP 这回事了。


④ 端口转发

最后一步,也是很多人容易忽略的一步。

路径一般在:

高级设置 → 端口转发

填写内容很简单:

  • 外网端口
  • 内网 IP
  • 内网端口

PixPin_2026-02-24_13-30-51.png

保存后,对应服务就能从外网访问了。


六、外网访问能干嘛?几个真实使用场景

配置完成后,你会发现这套方案真的很实用。

场景一:远程访问 NAS

  • https://home.xxx.com:5200
  • 不用再查 IP,不用再折腾

场景二:远程桌面 / SSH

  • 域名 + 端口
  • 比记一串数字舒服太多

场景三:自建服务测试

  • 本地服务直接暴露到外网
  • 对开发者来说非常友好

之前文章《别再给音箱充会员了!手把手教你把小爱音箱变成“私人点唱机”》

如果你暴露 xiaomusic 到外网,记得安全性配置。

PixPin_2026-02-24_17-42-41.png


七、写在最后

很多人一听到“内网穿透”,
下意识就觉得是高门槛、高成本、高复杂度

但真折腾下来你会发现:

最好用的方案,往往是最朴素的。

路由器拨号 + DDNS,不复杂,但足够稳定、省心。

如果你的目标只是:

  • 随时访问家里的设备
  • 稳定、长期可用
  • 不想维护一堆服务

那这套方案,就已经够用了。

点赞 + 关注 + 收藏 = 学会了

整理了一个NAS小专栏,有兴趣的工友可以关注一下 👉 《NAS邪修》

现在要下载音乐实在不容易了,这次推 Musicn,能用多久用多久吧~

我用飞牛 NAS 部署的,其他品牌的操作步骤也差不多。

在“文件管理”找到“docker”文件夹,在里面创建一个“Musicn”文件夹。

打开“Docker”应用,在“Compose”板块新建一个项目,选项如下图所示。

这是代码:

services:
 musicn:
  image: k1483162508/musicn:latest
  container_name: musicn
  ports:
   - 2336:7478
  restart: unless-stopped

项目构建完成后,在浏览器输入 NAS的IP:2336 就能访问了。如果 2336 这个端口和其他项目冲突的话,上面那份代码的 2336 改成其他数字再重新构建吧。

页面左上角可以切换音乐源(咪咕、网易云、酷狗),无法下载的音乐,换个源看看。


以上就是本文的全部内容啦,有疑问可以在评论区讨论~

想了解更多NAS玩法可以关注《NAS邪修》👏

点赞 + 关注 + 收藏 = 学会了

Notepadpp

百度搜索,注意到非广告条目同样也有仿冒网站

np

np

必应搜索,非广告条目都有一堆仿冒网站

np

np

np

PuTTY

百度搜索

假冒版本似乎只在广告条目当中出现

相关网址在文末

必应搜索

只有搜索“putty 中文”才会出现假冒网站,排名在第一页靠后

np

WinSCP

百度搜索

假冒版本似乎只在广告条目当中出现

相关网址在文末

必应搜索“WinSCP”、“WinSCP 中文”,搜索结果都会出现同样的假冒网站,好在并非第一条结果

np

假冒网站 URL

若要下载文件,请务必谨慎

Notepadpp

搜索结果中还有个疑似假冒网站,但我还没验证,请大家看一看:

np

另外在搜狗搜索广告中也有假冒网站:

PuTTY

WinSCP

0xF

作为开发者,日常工作中总会遇到一些很简单但又不可避免的小任务,比如 Base64 解码、计算 MD5 、格式化代码等等。

这些事情并不复杂,但每次出现,我几乎都在重复同样的流程:打开搜索引擎,在一堆搜索结果里找到一个“看起来能用”的网站,用完就关掉,下次再重复一遍。

我知道命令行也能解决不少问题,但有时候会忘记具体命令或参数,还是得临时查一下。虽然都不算大问题,但多少会打断思路。

于是我把这些常用的小工具整理在一起,做成了一个网站:

  • 完全开源
  • 不需要账号
  • 没有付费功能
  • 浏览器本地处理

每款工具都仔细打磨过,在交互上尽量保持简单直接,不增加不必要的步骤。

0xF 主页:0xf.com

GitHub 仓库:github.com/jsthon/0xf

如果觉得有用,欢迎在 GitHub 点个 Star 。项目也刚上线 Product Hunt,感谢支持!

截图

0xF-v2ex

题⽬描述

输⼊数字 n ,按顺序打印出从 1 到最⼤的 n 位⼗进制数。⽐如输⼊ 3 ,则打印出 1 、2 、3⼀直到最⼤的 3 位数 999 。

  1. ⽤返回⼀个整数列表来代替打印
  2. n 为正整数

示例1
输⼊:1
返回值:[1,2,3,4,5,6,7,8,9]

思路及解答

直接计算

不太清楚这道题是要考察什么(苦笑),⼏乎都是⼀个循环能解决的事情,仔细想了⼀下,也并没有想到其他⽐较令⼈⽿⽬⼀新的做法,⽤Math.pow(10, n) - 1 取出最⼤的边界条件

public class Solution {

    public int[] printNumbers(int n) {
        double len = Math.pow(10, n) - 1;
        int[] result = new int[(int) len];
        for (int i = 0; i < len; i++) {
            result[i] = i + 1;
        }
        return result;
    }
}
  • 时间复杂度:O(10ⁿ),需要生成10ⁿ-1个数字
  • 空间复杂度:O(10ⁿ),需要存储所有数字

当n≥10时,10ⁿ-1会超过int范围,导致溢出

字符串模拟

针对大数问题,使用字符串来模拟数字的生成。

import java.util.ArrayList;
import java.util.List;

public class Solution {
    public int[] printNumbers(int n) {
        if (n <= 0) return new int[0];
        
        // 使用List存储结果,再转为数组
        List<Integer> list = new ArrayList<>();
        char[] number = new char[n];  // 存储当前数字的字符表示
        
        // 递归生成所有n位数
        generateNumbers(number, 0, list);
        
        // 转换为数组(去掉前导0)
        int[] result = new int[list.size()];
        for (int i = 0; i < list.size(); i++) {
            result[i] = list.get(i);
        }
        
        return result;
    }
    
    private void generateNumbers(char[] number, int index, List<Integer> list) {
        if (index == number.length) {
            // 将字符数组转换为整数
            int num = convertToInt(number);
            if (num != 0) {  // 跳过0
                list.add(num);
            }
            return;
        }
        
        // 当前位置可以填0-9
        for (char c = '0'; c <= '9'; c++) {
            number[index] = c;
            generateNumbers(number, index + 1, list);
        }
    }
    
    private int convertToInt(char[] number) {
        int result = 0;
        boolean leadingZero = true;
        
        for (char c : number) {
            if (c != '0' || !leadingZero) {
                if (leadingZero) leadingZero = false;
                result = result * 10 + (c - '0');
            }
        }
        
        return result;
    }
}
  • 时间复杂度:O(n×10ⁿ)
  • 空间复杂度:O(n×10ⁿ)

优化版本:

public class Solution {
    public int[] printNumbers(int n) {
        if (n <= 0) return new int[0];
        
        int max = (int) Math.pow(10, n) - 1;
        int[] result = new int[max];
        
        // 直接计算并填充,避免字符串转换开销
        for (int i = 0; i < max; i++) {
            result[i] = i + 1;
        }
        
        return result;
    }
    
    // 处理大数的版本(返回字符串列表)
    public String[] printNumbersBig(int n) {
        if (n <= 0) return new String[0];
        
        int max = (int) Math.pow(10, n) - 1;
        String[] result = new String[max];
        
        for (int i = 0; i < max; i++) {
            result[i] = String.valueOf(i + 1);
        }
        
        return result;
    }
}

递归回溯

利用递归生成所有可能的数字组合。

import java.util.ArrayList;
import java.util.List;

public class Solution {
    private List<Integer> result;
    private char[] number;
    
    public int[] printNumbers(int n) {
        if (n <= 0) return new int[0];
        
        result = new ArrayList<>();
        number = new char[n];
        
        // 从第0位开始递归生成
        dfs(0);
        
        // 转换为数组
        int[] arr = new int[result.size()];
        for (int i = 0; i < result.size(); i++) {
            arr[i] = result.get(i);
        }
        return arr;
    }
    
    private void dfs(int index) {
        if (index == number.length) {
            // 将字符数组转换为整数
            int num = 0;
            boolean isZero = true;
            
            for (int i = 0; i < number.length; i++) {
                if (number[i] != '0' || !isZero) {
                    if (isZero) isZero = false;
                    num = num * 10 + (number[i] - '0');
                }
            }
            
            // 跳过0
            if (num > 0) {
                result.add(num);
            }
            return;
        }
        
        // 当前位置可以填0-9
        for (char c = '0'; c <= '9'; c++) {
            number[index] = c;
            dfs(index + 1);
        }
    }
}
  • 时间复杂度:O(10ⁿ)
  • 空间复杂度:O(n) - 递归栈深度

Change Redis Max Memory

要配置 Redis 使用的最大内存量,你可以在 Redis 配置文件(redis .conf)中使用 maxmemory 指令。该指令接受一个整数值,表示 Redis 将用于在内存中存储数据的最大字节数。

例如,要将最大内存设置为 1GB(或 1024 1024 1024 字节),可以使用以下配置:

maxmemory 1073741824

你也可以使用 maxmemory-policy 指定当达到最大内存限制时,Redis 应该如何处理这种情况的策略。该指令取值说明如下:

  • noeviction: 当达到最大内存限制,添加一个新键时,Redis 将返回一个错误。
  • allkeys-lru: Redis 将删除最近最少使用的键,以便为新键腾出空间。
  • volatile-lru: Redis 将删除最近使用最少的带有过期设置的键,以便为新的关键空间。
  • allkeys-random: Redis 将随机选择要删除的键,以便为新键腾出空间。
  • volatile-random: Redis 将随机选择带有过期设置的键来删除,以便为新键腾出空间。
  • volatile-ttl: Redis 将删除存活时间最短的键,以便为新键腾出空间。

例如,要将 maxmemory-policy 设置为 allkeys-lru,可以使用以下配置:

maxmemory-policy allkeys-lru

我的开源项目

酷瓜云课堂-开源知识付费解决方案