Redis课程笔记
Redis
安装
前台启动
后台启动
- 1)备份redis.conf
- 2)修改配置:deamonize yes
- 3)执行 redis-server 配置文件的目录
key键操作
select [dbindex]
- 切换库
keys *
- 查所有key
exists keyname
type keyname
- key的数据类型
del keyname
- 删除key的数据
unlink keyname
- 先在keyspace中删除,后续通过异步删除实际数据
expire keyname 秒数
- 设置key的过期时间
ttl keyname
- 查看多少秒后过期 -1不会过期 -2过期了
dbsize
- 查看key的数量
flushdb
- 清空db
flushall
- 清全部库
五大数据类型
字符串
-
常用命令
-
二进制安全,一个value最大可以是512m
-
set key value 添加键值对
-
get key 查询value
-
append key value 将给定的value追加到原值的末尾
-
strlen key 获取value的长度
-
setnx key value 只有key不存在才设置key的值
-
incr key 将value存的数值加1;如果为空,新增值为1
-
decr key 将value存的数值减1
-
incrby/decr key 步长 将value存的数值增减指定的步长
-
mset key1 value1 key2 value2... 设置多个key-value
- 有一个失败则全失败
-
mget key1 key2 key3
- 有一个失败则全失败
-
msetnx k1 v1 k2 v2 ...
- 有一个失败则全失败
-
getrange key 起始位置 终止位置 获取value在范围中的数据,等于Java的subString
-
setrange key 起始位置 value 从起始位置开始用value覆盖原来位置的值
-
setex key 过期时间 value 设置键值的同时设备过期时间
-
getset key value 设置新值的同时获得旧值
-
-
数据结构
- String的数据结构为简单动态字符串(Simple Dynamic String,缩写SDS)。是可以修改的字符串,内部结构实现上类似于Java的ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配
列表 List
-
简介
- 单键多值
-
常用命令
-
lpush/rpush k1 v1 k2 v2 kn vn 左边或者右边插入多个值
-
lpop/rpop key 从左边或右边吐出一个值
-
rpoplpush k1 k2 从k1列表右边吐出一个值放到k2列表左边
-
lrange key 起始位置 终止位置 按照索引下标获得元素(从左到右)
- lrange key 0 -1 表示取所有
-
lindex key index 按照索引下标获得元素(从左到右)
-
llen key 获得列表的长度
-
linsert key before value newValue 在value的前面插入newValue
-
lrem key n value 从左开始删除n个value
- 图示
-
lset key index value 将下标index的值替换为value
-
-
数据结构
- 快速链表quickList
集合 Set
-
简介
- 自动排重、无序集合;底层是一个value为null的hash表
-
常用命令
- sadd key v1 v2 添加多个值
- smembers key 取出所有值
- sismember key value 判断是否存在该值 有1 无0
- scard key 查询元素个数
- srem key v1 v2 v3 ... 删除多个值
- spop key 随机取一个值
- srandmember key n 随机获得n个值,不从集合删除
- smove sourceKey DestKey value 把value从sourceKey挪到destKey
- sinter k1 k2 返回两个集合的交集
- sunion k1 k2 返回并集
- sdiff k1 k2 返回差集(在k1中,不在k2中的)
-
数据结构
- 结构是dict字典,字典底层使用hash表实现,所有的value指向同一个对象
哈希 Hash
-
简介
- 键值对集合、等同于Java的Map,特别适合存储对象
-
常用命令
- hset key field value 给field赋值
- hget key field 取field值
- hmset key f1 v1 f2 v2 ... 批量设置值
- hexists key field 查看field是否存在
- hkeys key 列出所有field
- hvals key 列出所有field的value
- hsetnx key field value 设置值为value仅当field不存在的时候
- hincrby key field increment 将field的值加increment
-
数据结构
- ziplist和hashtable。当field-value长度较短且个数较少时,使用ziplist,否则使用hashtable。
有序集合 Zset
-
简介
- 和set非常相似,不过zset每一个成员都关联一个评分score,score可以重复,评分被用来排序
-
常用命令
-
zadd key score1 v1 score2 v2... 将多个元素加入到key中
-
zrange key 起始位置 终止位置 [withscores]
- 获取区间的元素,加上WITHSCORES标志可以返回的时候带上分数
-
zrangebyscore key minmax [withscore] [limit offset count]
- 获取score在min和max之间的元素(包括min和max),score递增排序
-
zrevrangebyscore key maxmin [withscore] [limit offset count]
- 获取score在min和max之间的元素(包括min和max),score递减排序
-
zincrby key increment value 为元素加上增量
-
zrem key value 删除指定value的元素
-
zcount key min max 统计分数区间元素的个数
-
zrank key value 返回该值的排序,从0开始计数
-
-
数据结构
-
使用了hash和跳跃表
-
跳跃表
- 图示
- 图示
-
配置文件
单位Unit
- 开头定义了一些基本的度量单位,只支持bytes,不支持bit,大小写不敏感
加载其他配置 Includes
网络 Network
-
bind
- 图示
- 图示
-
protected-mode
-
port
-
tcp-backlog
- 连接队列
- 连接队列
-
timeout
- 一个空闲的客户端维持多少秒会关闭,0表示关闭该功能,即永不关闭
-
tcp-keepalive
- tcp心跳监测连接周期,默认300s
通用 General
-
deamonize yes
- yes为开启后台运行
-
pidfile
- 存放pid文件的位置,每个实例会产生一个不同的 pid文件
-
loglevel
- 日志级别,共4个级别,默认notice
-
logfile
- 输出日志的路径
-
database
安全 SECURITY
限制 Limits
-
maxclients
- 设置redis可以同时和多少个client进行连接,默认10000。如果满了,redis会拒绝新请求,并回复"max number of clients reached"
-
maxmemory
- 图示
- 图示
-
maxmemory-policy
- 图示
- 图示
-
maxmemory-samples
- 图示
- 图示
发布与订阅
参考链接
https://www.cnblogs.com/duanxz/p/14747968.html
新数据类型
Bitmaps
-
简介
-
命令
-
setbit key offset 0/1 设置偏移量的值为0或1
- 偏移量从0开始计数
-
getbit key offset 获取偏移量的值
-
bitcount key [起始字节 终止字节] 统计数据中bit=1的个数
- 图示
- 图示
-
bitop
- 图示
- 图示
-
-
Bitmaps和Set做对比
-
月活量高用有优势
-
缺点
-
HyperLogLog
-
简介
-
第一部分
-
基数
-
-
命令
- pfadd key element [element...] 添加元素到HyperLogLog中
- pfcount key [key...] 计算HLL的近似基数
- pfmerge destKey sourceKey [sourceKey...] 将一个或者多个HLL的结果合并到另一个HLL中
Geospatial
-
简介
- 图示
- 图示
-
命令
-
geoadd key lon lat member [lon lat member] 添加地理位置信息(经度 纬度 名称)
- 示例
- 示例
-
geopos key member [member...] 获得地区的经纬度
-
geodist key member1 member2 [m|km|ft|mi] 获得两个地点之间的直线距离
- 实例
- 实例
-
georadius key lon lat radius m|km|ft|mi 以给定的经纬度为中心,radius为半径找范围内的元素
- 实例
- 实例
-
Jedis
Jedis操作
示例: Jedis验证码
- 图示
事务操作
事务定义
- 图示
Redis事务三特性
-
单独的隔离操作
- 事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断
-
没有隔离级别的概念
- 队列中的命令没有提交之前都不会实际被执行,因为事务提交前任何指令都不会被实际执行
-
不保证原子性
- 事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚
Multi、Exec、Discard、Watch
- 图示
事务的错误处理
事务冲突的问题
-
悲观锁
- 图示
- 图示
-
乐观锁
- 图示
- watch key [key...] 在执行multi之前,先执行watch命令可以监视多个key,如果在事务执行之前某些被监视的key 被其他命令所改动,那么事务将被打断
秒杀案例
-
图示
-
Apache Bench工具模拟并发
-
超卖问题
-
使用乐观锁解决超卖问题
-
乐观锁造成库存遗留问题
-
解决方案1:LUA脚本
-
图示
-
LUA脚本在Redis中优势
- 图示
- 图示
-
-
-
-
超时问题
- 连接池解决超时问题,双重检查锁搞一个单例模式的连接池工具类
- 连接池解决超时问题,双重检查锁搞一个单例模式的连接池工具类
持久化操作
RDB(Redis Database)
Redis 默认开启RDB持久化方式,在指定的时间间隔内,执行指定次数的写操作,则将内存中的数据写入到磁盘中。
RDB 持久化适合大规模的数据恢复但它的数据一致性和完整性较差。
Redis 需要手动开启AOF持久化方式,默认是每秒将写操作日志追加到AOF文件中。
-
简介
-
在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话讲的 Snapshot快照,它恢复时是将快照文件直接读到内存里
-
持久化过程
- 图示
- 图示
-
-
-
如何进行持久化
-
图示
-
Fork
- 图示
- 图示
-
-
RDB配置规则
- 图示
- 图示
-
dump.rdb文件配置参数
- 图示
- 图示
-
压缩配置参数
- 图示
- 图示
-
-
RDB的优势
- 图示
-
RDB的劣势
-
图示
-
注意:由于Redis使用fork来复制一份当前进程,那么子进程就会占有和主进程一样的内存资源,比如说主进程8G内存,那么在备份的时候,必须保证有16G的内存,要不然会启用虚拟内存,性能非常的差
-
-
如何停止
- 动态停止RDB : redis-cli config set save ""
save后给空值,表示禁用保存策略
AOF(Append Of File)
-
简介
- 图示
- 图示
-
持久化流程
- 客户端的请求写命令会被append追加到AOF缓冲区内
- AOF缓冲区根据AOF持久化策略[always,everysec,no]将操作sync同步到磁盘的AOF文件中
- AOF文件大小超过重写策略或手动重写时,会对 AOF文件rewrite重写,压缩AOF文件容量
- Redis服务重启时,会重新load 加载AOF文件中的写操作达到数据恢复的目的
-
AOF默认不开启
- 可以在redis.conf 中配置文件名称,默认为appendonly.aof,AOF 文件的保存路径,同RDB的路径一致。
-
AOF和RDB同时开启,Redis怎么选择
- AOF和RDB同时开启,系统默认取AOF的数据(数据不会存在丢失)
-
AOF启动、恢复、修复
-
AOF的备份机制和性能虽然和RDB不同,但是备份和恢复的操作同RDB一样,都是拷贝备份文件,需要恢复时再拷贝到Redis工作目录下,启动系统即加载
-
正常恢复
- 修改默认的appendonly no,改为yes
- 将有数据的aof文件复制一份保存到对应目录
(查看目录: config get dir). - 重启redis,然后重新加载
-
异常恢复
- 修改默认的appendonly no,改为yes
- 如遇到AOF文件损坏,通过/usr/local/bin/redis-check-aof --fix appendonly.aof 进行恢复
- 备份被写坏的AOF文件
- 恢复:重启redis,然后重新加载
-
-
AOF同步频率设置
-
appendfsync always
- 始终同步,每次 Redis 的写入都会立刻记入日志;性能较差但数据完整性比较好
-
appendfsync everysec
- 每秒同步,每秒记入日志一次,如果宕机,本秒的数据可能丢失
-
appendfsync no
- redis不主动进行同步,把同步时机交给操作系统
-
-
Rewrite 重写压缩
-
AOF优势
- 图示
- 图示
-
AOF劣势
- 比起 RDB占用更多的磁盘空间
- 恢复备份速度要慢。
- 每次读写都同步的话,有一定的性能压力。
- 存在个别 Bug,造成恢复不能
主从复制
简介
- 主机数据更新后根据配置和策略,自动同步到备机的master/slaver的机制,Master以写为主,Slave以读为主
- 参考链接
作用
- 读写分离,性能扩展
- 容灾快速恢复
配从不配主
- 在从机上执行slaveof 主机ip 端口号
复制原理
薪火相传
反客为主
- 手动执行 slaveof no one 将从机变主机
哨兵模式 Sentinel
-
反客为主的自动版,能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库
-
使用步骤
-
调整为一主二仆模式,6379带着6380、6381
-
自定义的/myredis目录下新建sentinel.conf 文件,名字绝不能错
- 编辑哨兵配置文件,填写内容
sentinel monitor mymaster 127.0.0.16379 1
其中mymaster为监控对象起的服务器名称,1为至少有多少个哨兵同意迁移的数量。
- 编辑哨兵配置文件,填写内容
-
启动哨兵
-
复制延时
故障恢复
- 偏移量是指获得原主机数据最全的,每个redis 实例启动后都会随机生成一个40位的runid
主从复制
- 图示
集群
简介
- 数据被分在各个master上。即使连接的不是主机,集群会自动切换主机存储。主机写,从机读。无中心化主从集群。无论从哪台主机写的数据,其他主机上都能读到数据。
集群搭建
-
Cluster配置修改
- 图示
- 图示
-
合体
- 图示
- 图示
-
分配原则
- 尽量保证每个主数据库运行在不同的IP地址,每个从库和主库不在一个IP地址上。
-
搭建集群参考
集群操作
-
多个值存储按组计算插槽
- 图示
- 图示
-
查询集群中的值
- 图示
- 图示
集群故障恢复
- 图示
集群Jedis开发
- 图示
集群的好处与坏处
-
好处
- 实现扩容
- 分摊压力
- 无中心配置相对简单
-
坏处
- 多键操作是不被支持的·
- 多键的Redis事务是不被支持的。lua脚本不被支持
- 由于集群方案出现较晚,很多公司已经采用了其他的集群方案,而代理或者客户端分片的方案想要迁移至redis cluster,需要整体迁移而不是逐步过渡,复杂度较大。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异