redis通俗理解

本文介绍了Redis,它是支持多种数据结构的存储系统,用ANSI C语言编写,基于内存可持久化。阐述了其应用场景,如会话缓存、消息队列等,介绍了五种数据类型,还说明了发布与订阅模式、持久化的两种方式(快照和AOF),并提及自带性能测试工具。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一,redis是什么

redis是一种支持Key-Value等多种数据结构的存储系统。可用于缓存,事件发布或订阅,高速队列等场景。该数据库使用ANSI C语言编写,支持网络,提供字符串,哈希,列表,队列,集合结构直接存取,基于内存,可持久化。

二,支持的语言
在这里插入图片描述
三,redis的应用场景有哪些
1,会话缓存(最常用)
2,消息队列,
比如支付3,活动排行榜或计数
4,发布,订阅消息(消息通知)
5,商品列表,评论列表等

四,redis数据类型
Redis一共支持五种数据类:string(字符串),hash(哈希),list(列表),set(集合)和zset(sorted set有序集合)。
1)字符串(字符串)
它是redis的最基本的数据类型,一个键对应一个值,需要注意是一个键值最大存储512MB。
在这里插入图片描述
(2)hash(哈希)
redis hash是一个键值对的集合,是一个string类型的field和value的映射表,适合用于存储对象
在这里插入图片描述

(3)表(列表)
是redis的简单的字符串列表,它按插入顺序排序

在这里插入图片描述

(4)组(集合)
是字符串类型的无序集合,也不可重复
在这里插入图片描述

(5)zset(sorted set有序集合)
是string类型的有序集合,也不可重复
有序集合中的每个元素都需要指定一个分数,根据分数对元素进行升序排序,如果多个元素有相同的分数,则以字典序进行升序排序,sorted set因此非常适合实现排名
在这里插入图片描述
6,redis的发布与订阅

redis的发布与订阅(发布/订阅)是它的一种消息通信模式,一方发送信息,一方接收信息。
下图是三个客户端同时订阅同一个频道

在这里插入图片描述
下图是有新信息发送给频道1时,就会将消息发送给订阅它的三个客户端
在这里插入图片描述
7,redis的持久化

redis持久有两种方式:快照(快照),仅附加文件(AOF)

快照(快照)

1,将存储在内存的数据以快照的方式写入二进制文件中,如默认dump.rdb中
2,保存900 1

#900秒内如果超过1个Key被修改,则启动快照保存
3,保存300 10

#300秒内如果超过10个Key被修改,则启动快照保存
4,保存60 10000

#60秒内如果超过10000个重点被修改,则启动快照保存

仅附加文件(AOF)

1,使用AOF持久时,服务会将每个收到的写命令通过写函数追加到文件中(appendonly.aof)
2,AOF持久化存储方式参数说明
appendonly yes

       #开启AOF持久化存储方式 
appendfsync always 

     #收到写命令后就立即写入磁盘,效率最差,效果最好
appendfsync everysec

     #每秒写入磁盘一次,效率与效果居中
appendfsync no 

     #完全依赖操作系统,效率最佳,效果没法保证

8,redis的的的的性能测试

自带相关测试工具
在这里插入图片描述
实际测试同时执行100万的请求
在这里插入图片描述

<think>我们首先解释Redis的SCAN命令。SCAN命令用于迭代数据库中的key集合。由于Redis是单线程的,使用KEYS命令(它会一次性返回所有匹配的key)在处理大量key时可能会阻塞服务器,因此SCAN命令被设计出来以渐进式、迭代的方式获取key,从而避免长时间阻塞。 SCAN命令的基本特点: - 它每次执行都返回一个游标(cursor)和本次迭代获得的部分key。 - 游标用于下一次迭代,从0开始,当游标返回0时表示迭代结束。 - 它不会保证每次迭代返回固定数量的key,但可以指定COUNT参数来提示期望返回的数量。 - 由于SCAN命令是在整个字典(键空间)上进行的,而字典可能会在迭代过程中发生改变(增删改),所以SCAN命令只能提供弱一致性的保证(即可能会返回重复的key或者遗漏一些key)。 SCAN命令的语法: ``` SCAN cursor [MATCH pattern] [COUNT count] [TYPE type] ``` - cursor:本次迭代开始的游标,0表示开始一次新的迭代。 - MATCH pattern:可选参数,用于匹配key的模式(glob风格)。 - COUNT count:可选参数,提示每次迭代返回key的数量,但实际返回的数量可能不同。默认是10。 - TYPE type:可选参数,用于指定key的类型,如string, list, set, zset, hash, stream等(Redis 6.0及以上版本支持)。 SCAN命令返回一个包含两个元素的数组: - 第一个元素是下一次迭代的游标(如果为0则表示迭代结束)。 - 第二个元素是一个数组,包含本次迭代返回的key。 示例: 假设我们有以下key:key1, key2, key3, ... key10。 使用SCAN命令迭代: ``` SCAN 0 ``` 可能返回: 1) "5" # 下一次迭代的游标 2) 1) "key1" 2) "key8" 3) "key3" 然后我们使用游标5继续迭代: ``` SCAN 5 ``` 可能返回: 1) "0" # 表示迭代结束 2) 1) "key5" 2) "key2" 3) "key10" 注意:实际返回的key和顺序是不确定的。 使用MATCH和COUNT的示例: ``` SCAN 0 MATCH user:* COUNT 5 ``` 表示从游标0开始,匹配以"user:"开头的key,并提示每次返回5个key。 现在,我们使用Python代码来演示如何使用SCAN命令(使用redis-py库):</think>### Redis SCAN 命令详解 **通俗解释:** SCAN 是 Redis 中用于**安全遍历大量键**的命令。想象你有一个装满百万钥匙的仓库,`KEYS *` 命令相当于一次性打开所有抽屉找钥匙——这会导致仓库(Redis)暂时瘫痪。而 `SCAN` 就像派一个智能机器人分批检查抽屉:每次只查一小部分,记下进度后暂停,等下次指令再继续,避免长时间阻塞仓库运作。 #### 核心特点: 1. **渐进式遍历**:分批返回键,避免阻塞服务器 2. **游标机制**:每次返回新游标,下次从该位置继续 3. **弱一致性**:遍历期间数据可能变化(可能返回重复/遗漏键) 4. **模式匹配**:支持 `MATCH` 按模式过滤键 5. **数量提示**:`COUNT` 参数建议每批返回数量(实际可能不同) --- ### 代码示例(Python + redis-py) ```python import redis # 连接Redis r = redis.Redis(host='localhost', port=6379, db=0) def safe_scan_keys(pattern='*', count=100): """安全遍历匹配模式的键""" cursor = 0 keys = [] while True: # 执行SCAN命令 cursor, partial_keys = r.scan( cursor=cursor, match=pattern, count=count ) keys.extend(partial_keys) # 游标为0表示遍历完成 if cursor == 0: break return keys # 示例:查找所有以 "user:session:" 开头的键 session_keys = safe_scan_keys(pattern="user:session:*") print(f"Found {len(session_keys)} session keys") ``` #### 代码解释: 1. **游标初始化**:`cursor=0` 表示开始新遍历 2. **循环扫描**: - `r.scan()` 返回新游标和部分键列表 - 当游标回归 `0` 时终止循环 3. **参数说明**: - `match="user:session:*"`:匹配会话键 - `count=100`:建议每批返回约100个键(实际数量可能浮动) 4. **安全优势**:即使数据库有百万键,内存占用始终很小 --- ### 关键注意事项: 1. **重复可能性**:遍历期间新增的键可能被返回多次 2. **COUNT非精确**:实际返回数量可能大于/小于指定值 3. **最佳实践**: - 生产环境**永远不要用** `KEYS` 命令 - 对于集合/哈希等类型,用 `SSCAN`/`HSCAN` 替代 - 大库遍历可能跨越多轮网络请求 4. **时间复杂度**:每次调用 O(1),完整遍历 O(N) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值