# redis笔记202509
**Repository Path**: nieps/redis-notes-202509
## Basic Information
- **Project Name**: redis笔记202509
- **Description**: redis笔记
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2025-09-04
- **Last Updated**: 2025-09-10
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Redis笔记
> 关系型数据库:
>
> * mysql
> * postgresql ( gis )
> * oracle
> * 达梦(国产的)
高并发场景下,只使用关系型数据库 满足不了我们的需求
借助中间件:
* 缓存的 数据库 NoSQL (not only sql )
* MQ
## Redis介绍
Redis 全称 Remote Dictionary Server(即远程字典服务),它是一个**基于内存**实现的**键值型**非关系(NoSQL)数据库。
QPS: query per second
## Redis 的核心特征
Redis 之所以成为主流的高性能存储解决方案,源于其独特且实用的核心特性:
### 1. 基于内存的超高性能
- 数据主要存储在内存中,读写操作响应时间可达微秒级
- 单节点支持每秒 10 万 + 次操作,远超传统磁盘数据库
- 采用单线程模型避免线程切换开销,同时通过 IO 多路复用处理并发请求
### 2. 丰富的数据结构支持
提供 8 种核心数据结构,满足多样化业务需求:
- **String**:字符串 / 数字,支持自增自减
- **Hash**:键值对集合,适合存储对象
- **List**:有序列表,支持两端操作
- **Set**:无序集合,支持交集、并集等操作
- **Sorted Set**:带分数的有序集合,适合排序场景
- **Bitmap**:位操作,适合布尔型数据统计
- **HyperLogLog**:基数统计,高效计算独立元素数量
- **Geospatial**:地理空间数据,支持位置距离计算
### 3. 完善的持久化机制
确保内存数据不会因重启而丢失:
- **RDB**:定时生成内存快照,适合备份和快速恢复
- **AOF**:记录所有写操作,支持实时或每秒持久化
- 混合持久化:结合 RDB 和 AOF 的优点,平衡性能和安全性
### 4. 高可用与分布式支持
- **主从复制**:实现数据备份和读写分离
- **哨兵机制**:自动监控节点状态,实现故障转移
- **Redis Cluster**:分布式集群方案,支持数据分片和水平扩展
### 5. 其他重要特性
- 支持事务和 Lua 脚本,保证操作原子性
- 提供过期键自动删除机制
- 发布 / 订阅功能,支持消息通信
- 支持数据过期策略和内存淘汰机制
## Redis 的典型应用场景
### 1. 缓存系统(最主要场景)
- 存储高频访问的数据,减轻数据库负担
- 示例:电商商品详情、用户信息、热门文章等
- 优势:响应速度快,支持设置过期时间自动更新
### 2. 会话存储
- 存储用户登录状态和会话信息
- 解决分布式系统中会话共享问题
- 支持设置过期时间,实现自动登出
### 3. 实时排行榜
- 基于 Sorted Set 实现各类排名功能
- 示例:游戏积分排名、商品销量排行、用户贡献榜
- 优势:支持实时更新和快速查询,复杂度为 O (logN)
### 4. 计数器与限流
- 利用 String 的 INCR 命令实现原子计数
- 示例:文章阅读量、点赞数、接口请求次数统计
- 结合过期时间实现接口限流功能,防止恶意请求
### 5. 消息队列
- 基于 List 实现简易消息队列
- 支持生产者 - 消费者模式
- 示例:异步任务处理、系统解耦
- (注:复杂场景建议使用专业消息队列)
### 6. 地理位置服务
- 基于 Geospatial 数据结构实现位置相关功能
- 示例:附近的人、商家定位、地理围栏
- 支持距离计算和范围查询
### 7. 分布式锁
- 利用 SET 命令的 NX(不存在才设置)特性实现
- 解决分布式系统中的并发资源竞争问题
- 示例:秒杀系统、库存扣减
### 8. 数据去重与统计
- 基于 Set 实现数据去重
- 利用 HyperLogLog 高效统计 UV(独立访客)
- 示例:网站访问量统计、用户行为分析
## 安装
### ubuntu安装
~~~shell
#前提更新软件包列表 apt update -y
#搜索redis
apt list |grep redis
#安装
apt install redis-server -y
#查看状态
service redis status
~~~
### docker安装
> redis端口号:6379
~~~shell
#安装
docker run -d --name redis -p 6379:6379 redis
#连接
docker exec -it redis /bin/bash
#进入redis
redis-cli
#测试 redis是否正常
ping #返回pong 说明服务正常
~~~
## 配置项
* 配置文件
> 1. linux /etc/redis/redis.conf 查看或更改配置项 永久更改 更改后要重启redis服务器
* 命令
> ~~~shell
> #查看所有配置项
> config get *
> #查看具体配置
> config get key # key 配置项名称
> #如查看日志级别
> config get loglevel
>
> #设置配置
> config set key value #给配置项设置值 临时的 如果redis重启 值就会失效
> #示例
> config set loglevel 'debug'
> ~~~
>
>
## 常用命令
### 字符串(string)
* String 是 Redis 最基本的数据类型,一个 key 对应一个 value
* string 类型是二进制安全的
* string 类型的值最大能存储 512MB
应用场景:缓存、限流、分布式锁、计数器、分布式 Session 等。
#### set命令
~~~shell
SET key value [NX | XX] [GET] [EX seconds | PX milliseconds |
EXAT unix-time-seconds | PXAT unix-time-milliseconds | KEEPTTL]
~~~
选项:(常用 的加粗)
* **NX** 如果对应的key值不存在,设置成功 (实现分布式锁)
> ~~~shell
> set name abc nx #如果key=name 在redis中不存在 ,保存name=abc ,如果存在不保存
> ~~~
* XX 如果对应的key存在,设置成功(只做更新,不做新增)
> ~~~shell
> set age 23 xx #如果内存中没有key=age 失败,如果有修改值为23
> ~~~
* GET 返回key对应的老值,如果不存在返回nil
* **EX** seconds 以秒为单位 设置过期时间 (场景:订单30分钟未支付 自动取消 )
> 查看key剩余时间: **TTL key** 返回剩余的秒数
* `PX` *milliseconds* 以毫秒为单位 ,设置过期时间
> **PTTL key** 返回剩余的毫秒时间
* EXAT unix-time-seconds 设置key在指定时间戳过期(精确到秒)
> 时间戳: 指从1970年1月1日 0:0:0 开始到 现在的秒时间
>
> linux获取秒时间戳:
>
> ~~~shell
> date +%s
> ~~~
* PXAT unix-time-milliseconds 设置key在指定时间戳过期(精确到豪秒)
> ~~~shell
> date +%s%3N #毫秒
> ~~~
* KEEPTTL 保留key之前的过期时间
#### get命令
get key 返回key的值

### List
* Redis List 中的元素是字符串类型
* 元素按照插入顺序进行排列,允许重复插入
* 可以添加一个元素到列表的头部(左边)或者尾部(右边)
* 最多可插入的元素个数为 2^32 -1 个(大约40亿个)
应用场景:简单队列、关注列表时间轴。

数据结构:
* 队列 FIFO 先进先出
> 方案:
>
> 1. lpush rpop
>
> 
>
> 2. rpush lpop
* 栈 FILO 先进后出
> 方案:
>
> 1. lpush lpop
>
> 
>
> 2. rpush rpop

### Hashes 哈希
* Redis hash 是一个键值(key=>value)对集合
* Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。
存储: key---field----value
应用场景: 用户信息、用户主页访问量、组合查询等。

### Set
* Redis Set 是一个字符串类型元素构成的**无序**集合,**不允许重复**
* 集合是通过哈希映射表实现的,所以无论是添加元素、删除元素,亦或是查找元素,它们的时间复杂度都为 O(1)。
应用场景: 赞、踩、标签等 交集 并集 差集

### Sorted set 有序集合
* Redis zset 是一个字符串类型元素构成的**有序集合**,**不允许重复**
* 每个元素会关联一 个 double 类型的分数,该分数允许重复,redis正是通过分数来为集合中的成员进行从小到大的排序
应用场景: 排行榜、好友关系链表。
#### zadd
~~~shell
ZADD key [NX | XX] [GT | LT] [CH] [INCR] score member [score member
...]
~~~
选项:
* NX 对应元素不存在 添加
* XX 如果元素存在更新,不存在失败
* GT (**greater than**) 如果元素存在,新分数大于当前分数,更新 ;如果元素不存在 新增
* LT (less than )如果元素存在,新分数小于当前分数,更新 ;如果元素不存在 新增
* CH 元素更新的数量 元素分数修改或新增的数量
* INCR 在已有元素的分数基础上增加分数
### 查看key

两种方法:
* keys * 查看所有的key 在生产环境,很少用, 该命令会阻塞 (适用于平进查看少量数据)
* SCAN cursor [MATCH pattern] [COUNT count] [TYPE type]
> 迭代或扫描,参数说明:
>
> * cursor 游标 当游标设置为0时,迭代开始,当服务器返回的游标为0时,迭代结束
> * MATCH pattern 返回符合指定模式的key 如 match a* 匹配以a开头的所有key 类似于分页显示
> * COUNT count 每次迭代显示key的数量 (类似于每页记录数 默认是10)
>
> > `SCAN`命令以及其衍生命令并不保证每一轮迭代返回的元素数量,但是可以使用`COUNT`属性凭经验调整`SCAN`命令的行为。`COUNT`指定每次调用应该完成遍历的元素的数量,以便于遍历集合,本质只是一个提示值。
> >
> > 1. `COUNT`默认值为10。
> > 2. 当遍历的目标`Set`、`Hash`、`Sorted Set`或者`Key`空间足够大可以使用一个哈希表表示并且不使用`MATCH`属性的前提下,`Redis`服务端会返回`COUNT`或者比`COUNT`大的遍历元素结果集合。
> > 3. 当遍历只包含`Integer`值的`Set`集合(也称为`intsets`),或者`ziplists`类型编码的`Hash`或者`Sorted Set`集合(说明这些集合里面的元素占用的空间足够小),那么`SCAN`命令会返回集合中的所有元素,直接忽略`COUNT`属性。

### Key命令
#### expire
~~~shell
EXPIRE key seconds [NX | XX | GT | LT]
~~~
选项:
* NX 如果指定 的key没有过期 时间 设置成功
* XX 如果指定的key有过期时间 ,更新成功
* GT 如果新的过期时间大于当前 时间更新成功
* LT 如果新的过期时间小于当前 时间更新成功

### 其它
~~~shell
#清除当前数据库中所有的key
flushdb
#清除所有 数据库
flushall
#清屏
clear
#退出
exit
#查看当前库中所有的key
keys *
~~~
## 在SpringBoot中使用Redis
### starter引入
~~~xml
org.springframework.boot
spring-boot-starter-data-redis
2.7.4
~~~
### 配置文件
~~~yaml
spring:
redis:
# Redis服务器地址 写你的ip
host: 127.0.0.1
# Redis服务器连接端口
port: 6379
# Redis服务器连接密码(默认为空)
password:
jedis:
pool:
# 连接池最大连接数(使用负值表示没有限制 类似于mysql的连接池
max-active: 200
# 连接池最大阻塞等待时间(使用负值表示没有限制) 表示连接池的链接拿完了 现在去申请需要等待的时间
max-wait: -1
# 连接池中的最大空闲连接
max-idle: 10
# 连接池中的最小空闲连接
min-idle: 0
# 连接超时时间(毫秒) 去链接redis服务端
timeout: 6000
~~~
### RedisTemplate配置
~~~java
@Configuration
public class RedisConfig {
/**
* 向容器注入自定义的工具类
*
* @return
*/
@Bean
public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate redisTemplate = new RedisTemplate();
redisTemplate.setConnectionFactory(redisConnectionFactory);
//设置序列化器
StringRedisSerializer srs = new StringRedisSerializer();//字符串序列化
//设置rediskey
redisTemplate.setKeySerializer(srs);
//设置hash field
redisTemplate.setHashKeySerializer(srs);
//value用javabean
Jackson2JsonRedisSerializer