NoSQL型数据库
NoSQL(Not Only SQL)是指一类不使用传统关系型数据库结构的数据库。NoSQL数据库通常用于大规模数据存储、处理和快速访问的场景。与关系型数据库不同,NoSQL数据库不要求数据必须存储为表格形式,也不需要固定的模式(schema)。它们通常具有更高的扩展性、灵活性和适应性。
四大分类
- 键值存储(Key-Value Stores):
- 数据以键值对的形式存储。
- 适合快速访问单个值。
- 例如:Redis、Amazon DynamoDB。
- 列族存储(Column Family Stores):
- 数据按列而非行来存储。
- 高效地存储和查询大规模的、非结构化的数据。
- 例如:Apache Cassandra、HBase。
- 文档存储(Document Stores):
- 存储类似JSON、BSON或XML的文档数据,文档中可以包含嵌套的数据。
- 适合存储和查询灵活的、层次化的数据。
- 例如:MongoDB、CouchDB。
- 图数据库(Graph Databases):
- 以图形结构(节点、边和属性)存储数据,用于表示实体之间的关系。
- 适合复杂的关系型数据查询。
- 例如:Neo4j、ArangoDB。
与SQL数据库的对比
SQL | NoSQL | |
---|---|---|
数据结构 | 结构化 | 非结构化 |
数据关联 | 不同数据之间具有关联性 | 无关联性 |
查询方式 | SQL标准 | 无标准 |
事务特性 | ACID | BASE |
存储方式 | 磁盘 | 内盘 |
拓展性 | 垂直 | 水平 |
使用场景 | 数据结构固定 相关业务对数据安全性,一致性要求较高 |
数据结构不固定 对一致性、安全性要求不高 对性能要求 |
Redis缓存中间件
Redis(Remote Dictionary Server)是一个开源的内存数据库,遵守 BSD 协议,它提供了一个高性能的键值(key-value)存储系统,常用于缓存、消息队列、会话存储等应用场景。
基本特点
- 性能极高: Redis 以其极高的性能而著称,能够支持每秒数十万次的读写操作24。这使得Redis成为处理高并发请求的理想选择,尤其是在需要快速响应的场景中,如缓存、会话管理、排行榜等。
- 丰富的数据类型: Redis 不仅支持基本的键值存储,还提供了丰富的数据类型,包括字符串、列表、集合、哈希表、有序集合等。这些数据类型为开发者提供了灵活的数据操作能力,使得Redis可以适应各种不同的应用场景。
- 原子性操作: Redis 的所有操作都是原子性的,这意味着操作要么完全执行,要么完全不执行。这种特性对于确保数据的一致性和完整性至关重要,尤其是在高并发环境下处理事务时。
- 持久化: Redis 支持数据的持久化,可以将内存中的数据保存到磁盘中,以便在系统重启后恢复数据。这为 Redis 提供了数据安全性,确保数据不会因为系统故障而丢失。
- 支持发布/订阅模式: Redis 内置了发布/订阅模式(Pub/Sub),允许客户端之间通过消息传递进行通信。这使得 Redis 可以作为消息队列和实时数据传输的平台。
- 单线程模型: 尽管 Redis 是单线程的,但它通过高效的事件驱动模型来处理并发请求,确保了高性能和低延迟。单线程模型也简化了并发控制的复杂性。
- 主从复制: Redis 支持主从复制,可以通过从节点来备份数据或分担读请求,提高数据的可用性和系统的伸缩性。
使用场景
-
缓存 :Redis 最常用的场景是作为缓存层,以减少数据库的负载,提高数据读取速度。
- 因为 Redis 是基于内存的,其读写速度比 MySQL 基于磁盘的方式要快很多,所以其作为热点数据的缓存是非常合适的。使用 Redis 缓存可以极大地提高应用的响应速度和吞吐量。
-
实时系统 :
- Redis 支持快速的数据写入和读取,非常适合用于实时分析,如网站点击统计、实时排行榜等。
-
消息队列 :
- 利用 Redis 的 List 和 Pub/Sub 功能,可以实现轻量级的消息队列,适用于任务处理和异步消息传递。
-
分布式锁:
- Redis 可以用作分布式锁的实现,确保在分布式系统中资源的安全访问,避免竞态条件。
-
计数器 :
- Redis 的原子性操作非常适合用作计数器。
Redis的服务端命令
进入redis的安装根目录的命令行可以启动redis服务
- 启动临时redis服务(不会在window Service列表出现Redis服务名称和状态,此窗口关闭,服务会自动关闭。):
redis-server.exe redis.windows.conf
- 注册redis服务:
redis-server.exe --service-install redis.windows.conf --service-name redisserver1 --loglevel verbose
- 启动服务:
redis-server.exe --service-start --service-name redisserver1
- 停止服务:
redis-server.exe --service-stop --service-name redisserver1
- 卸载服务:
redis-server.exe --service-uninstall--service-name redisserver1
可以在主机中配置多个端口的redis服务,参见博客
Redis的客户端命令
redis
在安装后就自带命令行客户端 redis-cli
,客户端的通用命令格式为
|
|
常见的option如下
-h ip_address
:指定要连接的redis节点的IP地址,默认是127.0.0.1(回环地址,表示访问本机)-p port
:指定要连接的redis节点的端口,默认是6379-a password
:指定redis的访问密码
commands是redis的操作命令
Redis的基本数据结构
Redis 提供了丰富的数据类型。
基本的有五种数据类型
- String(字符串) :Redis中最基本的数据类型,可以存储任何类型的数据,包括文本、数字和二进制数据。它的最大长度为512MB。
- 缓存:存储临时数据,如用户会话、页面缓存。
- 计数器:用于统计访问量、点赞数等,通过原子操作增加或减少。
- Hash(哈希) :哈希是一个键值对集合,适合存储对象的属性。Redis内部使用哈希表实现,适合小规模数据。
- 商品详情:存储商品的各个属性,方便快速检索。
- List(列表) :列表是有序的字符串集合,支持从两端推入和弹出元素,底层实现为双向链表。
- 消息队列:用于简单任务调度、消息传递等场景,通过
LPUSH
和RPOP
操作实现生产者消费者模式。 - 历史记录:存储用户操作的历史记录,便于快速访问。
- 消息队列:用于简单任务调度、消息传递等场景,通过
- Set(集合) :集合是无序且不重复的字符串集合,使用哈希表实现,支持快速查找和去重操作。
- 标签系统:存储用户的兴趣标签,避免重复。
- 唯一用户集合:记录访问过某个页面的唯一用户,方便进行分析。
- Zset(有序集合) :有序集合类似于集合,但每个元素都有一个分数(score),用于排序。底层使用跳表实现,支持快速的范围查询。
- 排行榜:存储用户分数,实现实时排行榜。
- 任务调度:根据任务的优先级进行排序,方便调度执行。
后面又支持了四种数据类型:
- BitMap :BitMap 是一种以位为单位存储数据的高效方式,适合用来表示布尔值(如存在性、状态等)。每个 bit 可以表示一个状态(0 或 1),使用空间少且操作快速。
- 统计每天用户的在线状态,可以用 Bitmap 记录每个用户是否在线:
- HyperLogLog :HyperLogLog 是一种概率性数据结构,主要用于估算基数(不同元素的数量),内存占用固定,适合处理大规模数据的去重和计数。
- GEO :GEO 是 Redis 提供的一种用于存储地理位置信息的数据结构,可以存储经纬度信息并支持空间查询,例如计算距离和获取范围内的坐标。
- Stream :Stream 是 Redis 提供的一种日志数据结构,适合于存储时间序列数据或消息流。支持高效的消息生产和消费模式,具有持久性和序列化特性。
Redis的通用命令
Keys命令
Redis 键命令用于管理 redis 的键。
基本格式
|
|
常见操作
- 删除键
- 删除已存在的键:
DEL KEY_NAME
- 返回值:被删除 key 的数量。
- 不存在的 key 会被忽略
- 删除已存在的键:
- 查找键
- 检查键是否存在:
EXISTS KEY_NAME
- 返回值:若 key 存在返回 1 ,否则返回 0 。
- 查找符合格式的键:
KEYS PATTERN
- 返回值:符合给定模式的 key 列表 (Array)。
- 查看键的过期时间:
TTL KEY_NAME
- 返回值:当 key 不存在时,返回 -2 。 当 key 存在但没有设置剩余生存时间时,返回 -1 。 否则,以秒为单位,返回 key 的剩余生存时间。
- 检查键是否存在:
- 设置键
- 设置键的过期时间:
Expire KEY_NAME TIME_IN_SECONDS
- 返回值:设置成功返回 1 。 当 key 不存在返回 0 。
- 移除键的过期时间:
PERSIST KEY_NAME
- 返回值:当过期时间移除成功时,返回 1 。 如果 key 不存在或 key 没有设置过期时间,返回 0 。
- 将当前数据库的 key 移动到给定的数据库 db 当中:
MOVE KEY_NAME DESTINATION_DATABASE
- 返回值:移动成功返回 1 ,失败则返回 0 。
- 将键重新命名:
RENAME OLD_KEY_NAME NEW_KEY_NAME
- 返回值
- 改名成功时提示 OK
- 失败时候返回一个错误。当 OLD_KEY_NAME 和 NEW_KEY_NAME 相同,或者 OLD_KEY_NAME 不存在时,返回一个错误。
- 返回值
- 设置键的过期时间:
提示
Key的层级结构
在 Redis 中,Key 的层级格式 其实是一种命名约定,并没有真正的“层级”结构(不像关系型数据库中的表或目录结构)。
通常使用 :
分隔层级
|
|
数据库命令
Redis默认有16个数据库,默认使用编号为0的数据库
- 切换数据库:
select db_num
- 查看当前数据库key的数量:
DBSIZE
- 清除当前数据库:
flushdb
- 清除所有数据库:
flushall