Tianyi's Blog Tianyi's Blog
首页
  • 计算机网络
  • 操作系统
  • 计算机科学
  • Nginx
  • Vue框架
  • 环境配置
  • Java
  • JVM
  • Spring框架
  • Redis
  • MySQL
  • RabbitMQ
  • Kafka
  • Mirror Sites
  • Dev Tools
  • Docker
  • Jenkins
  • Scripts
  • Windows
  • 科学上网
  • 旅行
  • 网站日记
  • 软件
  • 电子产品
  • 杂野
  • 分类
  • 友情链接
GitHub (opens new window)

Tianyi

一直向前,永不停止
首页
  • 计算机网络
  • 操作系统
  • 计算机科学
  • Nginx
  • Vue框架
  • 环境配置
  • Java
  • JVM
  • Spring框架
  • Redis
  • MySQL
  • RabbitMQ
  • Kafka
  • Mirror Sites
  • Dev Tools
  • Docker
  • Jenkins
  • Scripts
  • Windows
  • 科学上网
  • 旅行
  • 网站日记
  • 软件
  • 电子产品
  • 杂野
  • 分类
  • 友情链接
GitHub (opens new window)
  • Java

  • Golang

  • JVM的奇妙世界

  • Spring

  • Spring增强封装

  • Redis

    • Redis迭代演化
    • Redis安装配置
      • Install
        • 编译安装-推荐
        • Docker
      • Redis 命令
        • redis.conf
      • Redis 开发规约
        • Key的设计
        • 不同类型的应用场景
        • Redis的安全建议
      • Redis 内存
        • info memory
        • redis 安全与事务
        • 缓存管理机制
    • Redis数据结构
    • Spring集成Redis组件
    • Spring Cache
    • Redis持久化
    • Bloom Filter
    • Cluster-主从模式
    • Cluster-Sentinel
    • Cluster-三主三从
    • Redis理论知识
  • MySQL

  • RabbitMQ

  • Kafka

  • 分享

  • 后端
  • Redis
tianyi
2024-03-04
目录
Install
编译安装-推荐
Docker
Redis 命令
redis.conf
Redis 开发规约
Key的设计
不同类型的应用场景
Redis的安全建议
Redis 内存
info memory
redis 安全与事务
缓存管理机制

Redis安装配置

不建议任何其他操作系统的安装

# Install

# 编译安装-推荐

  1. 安装步骤
    • 更新 GCC:GCC 是 Linux C 语言编译器,Redis 需最新版 GCC 才能编译通过,执行yum install -y gcc-c++ autoconf automake进行安装。
    • 获取并编译 Redis 源码:依次执行cd /usr/local/、wget http://download.redis.io/redis-stable.tar.gz、tar xvzf redis-stable.tar.gz、cd redis-stable、make ,并在编译完成后会显示redis installed。
    • 修改配置文件:在配置文件中添加bind * -::* 。
    • 放行端口:通过firewall-cmd --zone=public --add-port=6379/tcp --permanent和firewall-cmd --reload命令,在防火墙中放行 6379 端口。
    • 启动配置文件:执行./redis-server ../redis.conf启动 Redis。

# Docker

docker pull redis:6.2.4

docker run -itd --name redis -p 8882:6379 -v /mydata/redis/data:/data redis:6.2.4 \
--requirepass ty88888888 \
--maxmemory 512mb \
--maxmemory-policy allkeys-lru \
--appendonly yes \
--appendfsync everysec \
--bind 0.0.0.0
1
2
3
4
5
6
7
8
9

# Redis 命令

Redis通用命令,用于数据库管理、键操作、设置过期时间等,具体内容如下:

  1. select:用于切换Redis数据库,Redis 默认拥有0 - 15号数据库 ,如select 0切换到0号数据库。
  2. keys:查询符合复合表达式要求的Redis key,但由于时间复杂度是0(n),会进行"全库扫描",执行效率差,不建议使用,如keys he[h-l]*。
  3. exists:判断key是否存在,存在返回1,不存在返回0,如EXISTS hello。
  4. expire:设置key过期时长(单位为秒),过期后该key自动删除,如expire helloworld 3600。
  5. ttl:查询key剩余有效期,如ttl helloworld 。
  6. del:删除指定key,如del helloworld。
  7. flushdb和flushall:flushdb用于清空当前数据库;flushall用于清空所有数据库,这两个命令都需谨慎使用 ,如flushdb和flushall 。

# redis.conf

image-20250304002738286

# 面向所有IP开放
bind * -::*
# 绑定端口号
port 6379
# 采用后台方式运行
daemonize yes
# 数据库总量
databases 16
# 日志文件存储路径
logfile ./redis_log.log
# 数据文件保存路径
dir ./
# 设置访问密码
requirepass 123456
1
2
3
4
5
6
7
8
9
10
11
12
13
14

如需修改,直接编辑对应行的参数值即可。比如要修改端口号,将port 6379中的6379改成目标端口;修改密码则更改requirepass后的123456为新密码 。

# Redis 开发规约

# Key的设计

  1. 可读性和可管理性:建议采用“业务名:表名:id”的格式,如“blog:article:1” 。
  2. 减小key的长度:建议不要超过39字节,
    1. 例如将“humanresource:employee:88301”简化为“hr:emp:88301” 。
    2. 要使用缩写,而不是全称
  3. 简洁性:不要包含特殊字符(空格、换行、引号等),建议使用英文与数字 。

# 不同类型的应用场景

Java redis类型 说明 适用场景
JavaBean string 保存对象JSON序列化字符串,优点是使用简单、节省key;缺点是序列化/反序列化需额外计算,无法局部调整 保存稳定数据,如档案信息、设备参数、产品描述
JavaBean hash 最符合JavaBean特征的保存方式,优点是key松散管理,可局部调整;缺点是hash->object需要额外编码(涉及到反射之类的编码) 保存稳定数据,如档案信息、设备参数、产品描述
List Set string json序列化存储小数据、修改频度低的集合,优点是节省空间;缺点是无法局部调整 富豪排行榜、各种TOP10、TOP100
List Set n/a 变化频度高、单个对象很大或数量很多,不建议放入Redis 实时股票行情、货币汇率、实时运算

# Redis的安全建议

加强防御 && 容灾备份

  1. 网络访问限制:不要让Redis在外网被访问,禁止使用“bind 0.0.0.0”,可绑定内网IP,如“bind 192.168.132.128” 。
  2. 端口设置:更改Redis默认端口6379,例如设置为“port 8838” 。
  3. 启动用户:要使用非root用户启动Redis 。
  4. 密码设置:设置密码,且不要与登录密码相同,使用“requirepass”和“masterauth” 。
  5. 数据备份:定期使用“save命令”进行备份 。
  6. 防火墙设置:配置好Linux防火墙规则 。

# Redis 内存

  1. 客户端缓冲区
    • 输入缓冲区:暂存客户端发送的待执行命令,位于服务器内存。
    • 输出缓冲区:保存待返回给客户端的响应结果,同样位于服务器内存。
  2. 复制缓冲区(同步缓冲区)
    • 主从同步时用于临时存储同步数据的区域,提升主从节点数据交换效率。
  3. AOF 缓冲区(日志缓冲区域)
    • 缓存 AOF 持久化的写操作命令,积累到一定量后批量写入磁盘,避免频繁磁盘 I/O。
  4. 对象内存(内容缓冲区域)
    • Redis 实际存储数据的内存区域(如字符串、哈希、列表等数据结构)。

# info memory

要监控内存使用情况,可以通过 INFO MEMORY 命令查看关键指标。其中 used_memory 表示当前数据占用的内存字节数,used_memory_human 会转换成更易读的 MB/GB 单位。used_memory_rss 反映了操作系统实际分配给 Redis 的内存总量(包括碎片),而 mem_fragmentation_ratio 是内存碎片率(计算方式为 rss 内存除以实际数据内存),建议保持在 1-1.5 之间。如果碎片率过高,可以启用 Redis 的自动碎片整理功能。此外,该命令还能看到内存使用的峰值、Lua 脚本引擎占用的内存等信息。

  • 内存碎片率(= used_memory_rss / used_memory),正常范围为 1~1.5。
    • 过高(>1.5):建议启用 activedefrag yes 自动整理碎片。
192.168.42.128:6379> info memory
# Memory
used_memory:2594560
used_memory_human:2.47M
used_memory_rss:7950336
used_memory_rss_human:7.58M
used_memory_peak:2609784
used_memory_peak_human:2.49M
used_memory_peak_perc:99.42%
used_memory_overhead:2312364
used_memory_startup:2279016
used_memory_dataset:282196
used_memory_dataset_perc:89.43%
used_memory_lua:31744
used_memory_vm_eval:31744
used_memory_lua_human:31.00K
mem_fragmentation_ratio:3.09
mem_fragmentation_bytes:5376448
mem_not_counted_for_evict:0
192.168.42.128:6379> config set activedefrag yes
OK
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

Redis性能篇(四)Redis内存碎片 https://www.cnblogs.com/liang24/p/14232890.html

指标 说明
used_memory:13490096 数据占用了多少内存(字节)
used_memory_human:12.87M 数据占用了多少内存(单位)
used_memory_rss:13490096 操作系统已分配的内存量
used_memory_peak:15301192 占用内存的峰值(字节)
used_memory_peak_human:14.59M 占用内存的峰值(带单位的)
used_memory_lua:31744 lua引擎所占用的内存大小(字节)
mem_fragmentation_ratio:1.00 内存碎片率

# redis 安全与事务

Linux系统

编辑 redis.conf文件,找到下面进行保存修改

  • 在配置文件中,将 requirepass 后面的值设置为您希望设置的密码。例如:requirepass 自定义密码

重启Redis服务,访问时,使用带密码的命令:

  • redis-cli -a 自定义密码

  • redis-cli -h your_redis_host -p your_redis_port -a your_password 
    
    1

否则会提示: (error)NOAUTH Authentication required.

Window系统

跟Linux系统一样,区别是,window系统的文件是 redis.window-service.config

# 缓存管理机制

定时删除+惰性删除+内存淘汰

缓存管理机制的主要目的是有效管理过期的缓存,以避免占用过多内存空间。Redis采用随机删除算法,每隔一定时间进行随机删除,但这种算法有一定概率永远无法删除某些键,因此需要惰性删除。惰性删除在键被调用时检查是否过期,并删除过期的键,但未满足过期条件的键仍无法删除。

过长的过期时间可能导致无用数据一直存在,因此引入了内存淘汰策略,包括LRU(最近最少使用)、LFU(最不经常使用)和过期键删除等算法,以保证内存中存储的键是高效有用的。然而,这些策略也会出现问题,如缓存击穿和缓存雪崩。

缓存击穿指客户端请求未命中缓存,反复请求数据库,可以通过布隆过滤器有效防止。而缓存雪崩则是指大量热点数据同时过期或删除,为了解决这个问题,可以采用设置随机过期时间、增加热点数据永不过期等策略,以确保热点数据不会在同一时间被删除,有效解决了缓存雪崩问题。

完善页面 (opens new window)
Redis迭代演化
Redis数据结构

← Redis迭代演化 Redis数据结构→

最近更新
01
JDK
02-23
02
BadTasteCode && 优化
09-11
03
Gradle 实践操作指南及最佳实践
09-11
更多文章>
Theme by Vdoing | Copyright © 2021-2025 Tandy | 粤ICP备2023113440号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式