redis学习笔记

Database

  • 默认数据库数量:Redis 默认提供 16 个数据库(编号 0-15),而非 10 个(可通过修改 redis.conf 的 databases 16 调整数量)。
  • 默认操作库:未指定时,所有命令在 数据库 0 执行。
  • 隔离性:不同数据库之间的数据完全隔离(键名相同也不会冲突)。
  • ​
    # 1. 切换到数据库5
    SELECT 5
    
    # 2. 添加测试数据
    SET project "Redis Training"
    HSET config timeout 30
    
    # 3. 查看当前库键数量
    DBSIZE          # 返回 2
    
    # 4. 返回数据库0并验证隔离性
    SELECT 0
    DBSIZE          # 返回原库0的键数(未变化)
    
    # 5. 清空数据库5(谨慎操作!)
    SELECT 5
    FLUSHDB
    DBSIZE          # 返回 0
    
    ​

一、哈希(Hash)

1. 核心概念
  • 用途:存储对象(如用户信息),每个键对应多个字段(field)和值(value)。
  • 类比:类似 JSON 对象或 Python 字典。
  • 优势:可单独操作字段,无需读取整个对象。
2. 练习:用户信息管理
# 1. 添加用户信息(user:1001 是键,name/age/city 是字段)
HSET user:1001 name "Alice" age 30 city "New York"
# 返回:3(成功设置3个字段)

# 2. 获取单个字段值
HGET user:1001 name
# 返回:"Alice"

# 3. 获取所有字段和值
HGETALL user:1001
# 返回:name Alice age 30 city New York(按字段顺序显示)

# 4. 修改年龄为31
HSET user:1001 age 31
# 返回:0(字段已存在,仅更新值)

# 5. 删除 city 字段
HDEL user:1001 city
# 返回:1(成功删除1个字段)

# 6. 检查剩余字段
HGETALL user:1001
# 返回:name Alice age 31

二、列表(List)

1. 核心概念
  • 用途:有序元素集合,允许重复值(例如消息队列、时间线)。
  • 特点:可从两端(左/右)插入或弹出元素。
  • 索引:从左到右从 0 开始,-1 表示最后一个元素。
    # 1. 从左侧插入三个任务
    LPUSH tasks "write report" "debug code" "meeting"
    # 返回:3(列表当前元素数)
    
    # 2. 查看列表所有元素(0到-1表示全部)
    LRANGE tasks 0 -1
    # 返回:1) "meeting" 2) "debug code" 3) "write report"(LPUSH 左侧插入,所以顺序反转)
    
    # 3. 从右侧添加新任务
    RPUSH tasks "review PR"
    # 返回:4(当前元素数)
    
    # 4. 查看更新后的列表
    LRANGE tasks 0 -1
    # 返回:1) "meeting" 2) "debug code" 3) "write report" 4) "review PR"
    
    # 5. 弹出左侧第一个任务(处理最早的任务)
    LPOP tasks
    # 返回:"meeting"
    
    # 6. 查看剩余任务
    LRANGE tasks 0 -1
    # 返回:1) "debug code" 2) "write report" 3) "review PR"
    

    三、集合(Set)

    1. 核心概念
  • 用途:存储唯一元素的无序集合(例如标签系统、好友列表)。
  • 特性:自动去重,支持集合运算(交集、并集、差集)。
  • # 1. 为文章ID=2001添加标签
    SADD article:2001:tags "tech" "database" "redis"
    # 返回:3(添加了3个不重复标签)
    
    # 2. 检查标签是否存在
    SISMEMBER article:2001:tags "redis"
    # 返回:1(存在)
    
    # 3. 获取所有标签(无序)
    SMEMBERS article:2001:tags
    # 返回:1) "database" 2) "tech" 3) "redis"(顺序可能不同)
    
    # 4. 错误示例:重复添加 "tech"
    SADD article:2001:tags "tech"
    # 返回:0(未新增元素)
    
    # 5. 删除 "database" 标签
    SREM article:2001:tags "database"
    # 返回:1(成功删除)
    
    # 6. 查看最终标签
    SMEMBERS article:2001:tags
    # 返回:1) "tech" 2) "redis"
    
    # 7. 集合运算
    sadd article "ai" "cloud"
    sadd text "ai" "front_end"
    sinter article text
    # 返回:1) "ai"
    

    四、Sorted Set

  • 特点:每个成员(member)关联一个分数(score),按分数排序(默认升序),成员唯一但分数可重复
  • 典型场景:排行榜、优先级队列、带权重的投票系统。
# 1. 创建游戏活动排行榜,有效期为1小时
ZADD event_2025 5000 "Player1" 4800 "Player2"
EXPIRE event_2025 3600

# 2. 更新分数并刷新过期时间
ZINCRBY event_2025 300 "Player2"  # Player2 分数+300
EXPIRE event_2025 3600  # 重置过期时间

# 3. 查看当前排名(降序)
ZREVRANGE event_2025 0 -1 WITHSCORES

# 4. 手动清理(立即过期)
EXPIRE event_2025 0

Redis AOF 持久化:核心原理与使用指南


1. AOF(Append Only File)是什么?
  • 核心机制:AOF 以日志形式记录 所有写操作命令(如 SETHMSET 等),重启时通过 重放命令 重建数据。
  • 与 RDB 的区别
    • RDB:定时生成数据快照(二进制文件),恢复快但可能丢失最后一次快照后的数据。
    • AOF:记录逐条操作,数据完整性更高,但文件体积通常更大,恢复速度较慢。

2. AOF 工作流程
  1. 命令追加:每次写操作后,将命令以 Redis 协议格式追加到内存缓冲区。
  2. 文件写入:根据配置的 appendfsync 策略,将缓冲区内容写入磁盘的 AOF 文件。
  3. 文件重写(Rewrite):定期压缩 AOF 文件,删除冗余命令(例如重复的 SET 操作),生成更精简的新文件。

3. 配置 AOF 持久化

修改 redis.conf 配置文件

# 启用 AOF(默认关闭)
appendonly yes

# 同步策略(重要!)
appendfsync everysec  # 可选值:always(每次写都同步)、everysec(每秒同步,默认)、no(由系统决定)

# 自动触发重写的条件
auto-aof-rewrite-percentage 100  # 当前AOF文件大小超过上次重写后大小的100%时触发
auto-aof-rewrite-min-size 64mb   # AOF文件最小达到64MB才触发重写
4. 手动管理 AOF
  • 立即触发重写
    BGREWRITEAOF  # 后台异步执行,不影响主进程
    

    修复损坏的 AOF 文件

    redis-check-aof --fix appendonly.aof  # 自动尝试修复
    

    关闭 AOF:

    CONFIG SET appendonly no  # 动态修改配置(需手动持久化到配置文件)
    
    5. AOF 文件示例
*3
$3
SET
$5
mykey
$7
myvalue


#格式说明:使用 Redis 序列化协议(RESP),*3 表示该命令有 3 个参数,$3 表示后续字符串长度为 3。

一些笔记

1.Redis 是单线程还多线程?

这要从不同角度和不同版本分析了;我们平常所说 Redis 是单线程是指 Redis 执行核心指令操作的方式是通过串行的方式单线程执行的;在 Redis6 之前是纯单线程模型,但是随着其请求量的增大和硬件平台的升级 redis 也开始逐步引入了多线程,这些多线程主要用于处理网络 IO、数据备份和集群支持等方面,但是核心指令执行依然是单线程;

2.单线程有哪些好处

单线程的好处:

  • 没有线程切换的开销对 CPU 友好
  • 没有并发操作不用担心数据并发安全
  • 无锁的竞争效率更高

3.单线程好处这么多为什么需要引入多线程

随着 CPU 多核化还有整体硬件水平的提升,如果依然使用单线程的方式处理那么硬件系统的利用率就会很低,最明显的就是网络 IO 会变成 Redis 的瓶颈,因为 Redis 是内存操作并且数据结构的设计优秀所以瓶颈不会在内存和 CPU,但是高并发的场景下如果一个请求的处理时间过长或者执行了 AOF 刷盘或则 RDB 快照那么就会将串行等待时间变长导致性能变低;

4.为什么 Redis 设计成单线程也能这么快?

从硬件层面来说:Redis 是工作在内存上的读写操作很快对 CPU 友好; 从数据结构层面来说:Redis 为了追求高性能底层的数据结构都优秀比如 skipList、listpack 都是在有限的内存上做到了极致的性能; 从线程层面上来说:Redis 在核心指令执行是单线程的,这样不会有锁的竞争、不会有上下文的切换也不用考虑并发安全问题;Redis 的网络 IO、数据备份和集群支持等方面采用的是多线程,尤其是在大数据量的请求下 epoll 方式的网络 io 多路复用大大提升了整体的性能;



 

Simulink中缩小步长可以通过修改仿真参数来实现。仿真参数可以在Simulink模型的仿真设置中进行调整。具体来说,可以使用"仿真时间"和"仿真步长"两个参数来控制仿真的时间和步长。 首先,通过设置"仿真时间",可以控制Simulink仿真的总时间。仿真时间是模型中的仿真时间,而不是真实的时间。可以根据需要将仿真时间设置为所需的值。比如,如果需要缩小步长,可以减少仿真时间。 其次,通过设置"仿真步长",可以调整Simulink仿真步长大小。仿真步长Simulink中每一步的时间间隔。可以根据模型的精度要求将仿真步长设置为较小的值,以获得更精确的结果。 在Simulink中,可以选择定步长仿真或变步长仿真。定步长仿真是按照固定的步长进行仿真,而变步长仿真可以在仿真过程中根据需要自动调整步长。根据具体的需求和系统的特性,可以选择适合的仿真模式。 综上所述,要在Simulink中缩小步长,可以通过调整仿真时间和仿真步长来实现。这样可以获得更精确的仿真结果。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Simulink步长、powergui采样时间、模块采样时间、控制周期的关系](https://blog.csdn.net/weixin_44162637/article/details/122147328)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [Matlab Simulink步长,控制周期,和采样频率之间的关系(附实例)](https://blog.csdn.net/JeSuisDavid/article/details/119347254)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值