数据库 - Redis数据库

目录

前言

一、Redis 的主要特点

二、Redis常见应用场景

三、Redis的局限性

四、Redis的操作

(一)安装redis-py

(二)基本连接

(三)常用操作

(四)关闭连接

五、总结


前言

Redis(Remote Dictionary Server)是一个开源的、基于内存的键值存储数据库,支持多种数据结构,具有高性能、持久化等特点。它常被称为 "NoSQL" 数据库之一,专为快速访问和处理大量数据设计,广泛应用于缓存、实时分析、消息队列等场景。


一、Redis 的主要特点

Redis的特点主要有以下几种:

1. 内存存储,持久化支持

  • Redis 的核心是一个内存数据库,所有数据存储在内存中,因此具有极高的读写速度。
  • 它同时支持将内存中的数据以快照(snapshot)或追加日志(AOF, Append Only File)的方式持久化到磁盘,以防止数据丢失。

2.多种数据结构

  • Redis 不仅支持简单的键值对,还支持丰富的数据结构,包括:
  1. 字符串(String)
  2. 列表(List)
  3. 集合(Set)
  4. 有序集合(Sorted Set)
  5. 哈希(Hash)
  6. 位图(Bitmap)
  7. HyperLogLog
  8. Stream(流)

3.持久化

  • Redis 提供了两种持久化机制
  1. RDB (Redis Database Backup):将数据定时快照保存到磁盘。
  2. AOF (Append Only File):以日志形式记录每次写操作,适用于高可靠性的数据恢复需求。

4.高性能

  • 由于所有操作都在内存中完成,Redis 的读写性能非常高。通常,每秒能够处理数十万到数百万的请求。

5.分布式与高可用

  • Redis 支持主从复制(Replication),可以通过 Master-Slave 架构实现数据的冗余备份和读取负载均衡。
  • Redis Sentinel:提供高可用性监控和自动故障转移。
  • Redis Cluster:允许在多个 Redis 节点之间进行数据分片(Sharding),支持横向扩展。

6.Lua 脚本支持

  • Redis 支持通过 Lua 脚本来实现复杂的事务逻辑,保证操作的原子性。

7.事务支持

  • 虽然 Redis 不支持传统的 SQL 类型的事务,但它通过命令 MULTI、EXEC、WATCH 提供了一定程度上的事务控制。

二、Redis常见应用场景

Redis的常用场景主要有5种,详情如下:

1.缓存

  • Redis 常用于缓存系统,因其高速读写能力,适合作为缓存层,存储热点数据以减少后端数据库的访问压力。

2.会话管理

  • Redis 被广泛用于存储用户会话数据,特别是在 web 应用中,Redis 能快速存取用户状态,并且通过 TTL(生存时间)机制自动清理过期会话数据。

3.消息队列

  • Redis 支持列表、发布订阅和流(Stream)等特性,因此可以作为高效的消息队列系统,处理任务队列和实时数据流。

4.排行榜、计数器

  • 利用 Redis 的有序集合,能够轻松实现排行榜系统,常用于游戏、社交平台等需要进行分数排序的应用。
  • Redis 的原子性递增/递减操作非常适合用于计数器场景,如网站点击量统计、流量监控等。

5.实时数据分析

  • 由于 Redis 是内存数据库,处理实时数据(如实时流量统计、实时分析系统)是它的强项。Redis 提供的 HyperLogLog 数据结构可以用于独立数据计数,减少内存消耗。

三、Redis的局限性

Redis的局限性有以下几点:

  • 内存依赖性

    • Redis 所有数据都存储在内存中,虽然这带来了极高的速度,但也意味着内存容量将成为 Redis 能存储的数据量的瓶颈。
  • 持久化风险

    • 虽然 Redis 提供了多种持久化机制,但由于其核心是内存数据库,仍有可能因为一些意外情况导致数据丢失。例如,AOF 日志文件损坏可能导致恢复过程中的数据丢失。
  • 分布式复杂性

    • Redis Cluster 虽然提供了分片和横向扩展,但其配置和维护相对复杂,对于大规模分布式系统的用户,可能需要额外的架构设计和运维支持。

四、Redis的指令操作

(一)基本键值对操作

  • 设置键值对
#将 key 设置为 value,如果键已经存在则覆盖
SET key value
  • 获取键的值
#获取键 key 的值
GET key
  • 删除键
#删除指定的键 key
DEL key
  • 检查键是否存在
#返回 1 表示存在,0 表示不存在
EXISTS key
  • 设置键的过期时间
#为键 key 设置过期时间(单位为秒)。到期后,键会被自动删除
EXPIRE key seconds
  • 查看键的剩余生存时间
#返回键 key 的剩余生存时间,单位为秒
TTL key
  • 获取所有匹配的键
#返回与模式 pattern 匹配的所有键,例如 KEYS user* 匹配所有以 user 开头的键
KEYS pattern

(二)字符串操作

  • 增加数值
#将键 key 的值加 1,如果键不存在,默认值为 0 后再加 1
INCR key
  • 增加指定数值
#将键 key 的值增加指定的整数 increment
INCRBY key increment
  • 减小数值
#将键 key 的值减 1
DECR key
  • 减小指定数值
#将键 key 的值减去指定的整数 decrement
DECRBY key decrement
  • 追加字符串
#在键 key 的值末尾追加 value
APPEND key value

(三)列表操作

  • 在列表左侧插入元素
#将 value 插入到列表 key 的左侧
LPUSH key value
  • 在列表右侧插入元素
#将 value 插入到列表 key 的右侧
RPUSH key value
  • 从列表左侧弹出元素
#移除并返回列表 key 的最左侧元素
LPOP key
  • 从列表右侧弹出元素
#移除并返回列表 key 的最右侧元素
RPOP key
  • 获取列表中的元素
#返回列表 key 中指定范围的元素,start 和 stop 为索引,0 表示第一个元素,-1 表示最后一个元素
LRANGE key start stop
  • 获取列表长度
#返回列表 key 的长度
LLEN key

(四)集合操作

  • 向集合中添加元素
#向集合 key 中添加成员 member,如果成员已存在则不添加
SADD key member
  • 获取集合中的所有元素
#返回集合 key 中的所有成员
SMEMBERS key
  • 删除集合中的元素
#从集合 key 中移除指定的成员 member
SREM key member
  • 检查成员是否存在于集合中
#返回 1 表示 member 存在于集合 key 中,0 表示不存在
SISMEMBER key member
  • 集合的交集
#返回给定集合的交集
SINTER key1 key2 ... keyN
  • 集合的并集
#返回给定集合的并集
SUNION key1 key2 ... keyN
  • 集合的差集
#返回 key1 和 key2 集合的差集,即 key1 中有而 key2 中没有的元素
SDIFF key1 key2

(五)哈希操作

  • 设置哈希字段值
#将哈希表 key 中的字段 field 设置为 value,如果字段不存在则创建
HSET key field value
  • 获取哈希字段的值
#返回哈希表 key 中字段 field 的值
HGET key field
  • 获取哈希表中的所有字段和值
#返回哈希表 key 中的所有字段及其对应的值
HGETALL key
  • 删除哈希表中的字段
#删除哈希表 key 中的字段 field
HDEL key field

(六)有序集合操作

  • 向有序集合中添加成员
#向有序集合 key 中添加成员 member,并设置其分数为 score
ZADD key score member
  • 获取有序集合中的成员
#返回有序集合 key 中,指定索引范围内的成员,按分数升序排列
ZRANGE key start stop
  • 获取有序集合中指定分数范围的成员
#返回有序集合 key 中,分数在 min 和 max 之间的成员
ZRANGEBYSCORE key min max
  • 删除有序集合中的成员
#移除有序集合 key 中的成员 member
ZREM key member

(七)事务操作

Redis 支持事务,通过 MULTIEXEC 组合使用。

  • 开启事务
#开始事务
MULTI
  • 执行事务
#提交事务,执行所有事务内的命令
EXEC
  • 放弃事务
#取消事务,放弃所有在事务中的命令
DISCARD

(八)发布订阅

  • 发布消息
#向频道 channel 发布消息 message
PUBLISH channel message
  • 订阅频道
#订阅频道 channel,当有新消息发布时,客户端会接收到消息
SUBSCRIBE channel
  • 取消订阅
#取消对频道 channel 的订阅
UNSUBSCRIBE channel

(九)持久化操作

Redis 提供了多种持久化方式以防止数据丢失,包括 RDB(快照)和 AOF(追加文件)两种持久化机制。

  • 手动保存快照
#手动保存 Redis 数据到磁盘
SAVE
  • 异步保存快照
#以后台异步方式保存 Redis 数据到磁盘
BGSAVE
  • 停止持久化
#清除 Redis 中的所有数据
FLUSHALL

(十)管理操作

  • 获取 Redis 信息
#返回 Redis 服务器的状态和统计信息
INFO
  • 查看客户端连接
#列出所有连接到 Redis 的客户端信息
CLIENT LIST
  • 查看内存使用情况
#获取当前 Redis 的内存使用情况
MEMORY STATS
  • 重启 Redis
#关闭 Redis 服务器
SHUTDOWN

(十一)总结

Redis 提供了丰富的指令操作,涵盖基本的键值存储、列表、集合、有序集合、哈希等常用数据结构的操作。同时,Redis 还支持事务、持久化、发布订阅等功能。熟练掌握这些 Redis 的指令操作,可以帮助你在各种场景下高效管理和操作 Redis 数据库。


五、使用Python代码操作Redis

Redis 是一个高效的键值存储系统,Python 中有专门的库来与 Redis 交互,最常用的是 redis-py 库。redis-py 提供了对 Redis 数据库的大部分功能的支持,包括基本的键值存储、队列、发布订阅等操作。

(一)安装redis-py

在 Python 中使用 Redis 首先需要安装 redis-py 库。可以使用 pip 命令进行安装:

pip install redis

(二)基本连接

要连接到 Redis 服务器,需要创建一个 Redis 对象并指定连接的参数,默认情况下,Redis 运行在 localhost:6379,例如:

import redis

# 创建一个 Redis 连接对象
r = redis.Redis(host='localhost', port=6379, db=0)

(三)常用操作

  • 字符串操作

Redis 最基本的存储类型是字符串,以下是一些常见的操作:

# 设置键值对
r.set('name', 'Alice')

# 获取键的值
name = r.get('name')
print(name)  # 输出: b'Alice' (Redis 默认返回字节类型)

# 删除键
r.delete('name')
  • 列表操作

Redis 支持列表类型,可以进行队列操作:

# 向列表中从左插入元素
r.lpush('mylist', 1, 2, 3)  # 列表: [3, 2, 1]

# 从列表右边弹出一个元素
value = r.rpop('mylist')
print(value)  # 输出: b'1'

# 获取列表的所有元素
elements = r.lrange('mylist', 0, -1)  # 获取整个列表
print(elements)  # 输出: [b'3', b'2']
  • 集合操作

Redis 也支持无序集合类型:

# 添加集合成员
r.sadd('myset', 'apple', 'banana', 'cherry')

# 获取集合中的所有成员
members = r.smembers('myset')
print(members)  # 输出: {b'apple', b'banana', b'cherry'}

# 从集合中删除一个成员
r.srem('myset', 'banana')
  • 哈希操作

哈希可以看作是一个键对应多个字段的键值对集合:

# 设置哈希表中的字段
r.hset('myhash', 'field1', 'value1')
r.hset('myhash', 'field2', 'value2')

# 获取哈希表中的字段值
value = r.hget('myhash', 'field1')
print(value)  # 输出: b'value1'

# 获取哈希表中所有字段和值
all_values = r.hgetall('myhash')
print(all_values)  # 输出: {b'field1': b'value1', b'field2': b'value2'}
  • 有序集合操作

有序集合支持按分数排序的元素:

# 添加有序集合的成员
r.zadd('myzset', {'apple': 1, 'banana': 2, 'cherry': 3})

# 获取按分数排序的集合成员
members = r.zrange('myzset', 0, -1)
print(members)  # 输出: [b'apple', b'banana', b'cherry']

# 获取某个成员的分数
score = r.zscore('myzset', 'banana')
print(score)  # 输出: 2.0
  • 发布订阅

Redis 支持发布订阅消息机制:

# 发布消息
r.publish('mychannel', 'hello world')

# 订阅频道
pubsub = r.pubsub()
pubsub.subscribe('mychannel')

# 接收消息
for message in pubsub.listen():
    print(message)
    # 输出: {'type': 'message', 'pattern': None, 'channel': b'mychannel', 'data': b'hello world'}

(四)关闭连接

当不再需要使用 Redis 时,可以关闭连接:

r.close()

六、总结

Redis 是一个非常高效、灵活的 NoSQL 数据库,广泛用于需要高速读写的场景,如缓存、消息队列、会话管理、排行榜等。通过丰富的数据结构、内存存储的特性、以及多种持久化和高可用性解决方案,Redis 在现代 web 应用和大型系统中占据了重要位置。然而,在使用 Redis 时,也需要注意内存管理、数据持久化和集群部署的复杂性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/886532.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java中创建不可变集合

一.应用场景 二.创建不可变集合的书写格式(List,Set,Map) List集合 package com.njau.d9_immutable;import java.util.Iterator; import java.util.List;/*** 创建不可变集合:List.of()方法* "张三","李四","王五…

每日OJ题_牛客_游游的水果大礼包_枚举_C++_Java

目录 牛客_游游的水果大礼包 题目解析 C代码 Java代码 牛客_游游的水果大礼包 游游的水果大礼包 (nowcoder.com) 描述: 游游有n个苹果,m个桃子。她可以把2个苹果和1个桃子组成价值a元的一号水果大礼包,也可以把1个苹果和2个桃子…

拆解维修飞科剃须刀

原因 用了好几年的剃须刀,经过一次更换电池。后来上面的盖帽松动,无法合盖,经过把弹片矫正后修复。最近一次”大力出奇迹“的操作直接断送了这个老伤员最后的可能性。最终只能花了将近十块大洋买了一套盖着和中间座。简单更换了一下。 记录…

Unity NetCode 客户端连接不上服务器,局域网模式 Failed to connect to server.

报错代码: Failed to connect to server. 报错截图: 解决办法: 服务端:绑定127.0.0.1和端口 客户端:写好对应服务端ip和端口 如何查看服务端所在局域网IP,192.xxx.xxx.xx,就不用教了吧。 注意这个钩,得点下,默认不勾选。 意…

【注册/登录安全分析报告:孔夫子旧书网】

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞…

docker运行arm64架构的镜像、不同平台镜像构建

背景 Docker 允许开发者将应用及其依赖打包成一个轻量级、可移植的容器,实现“一次构建,到处运行”的目标。然而,不同的操作系统和硬件架构对容器镜像有不同的要求。例如,Linux 和 Windows 系统有不同的文件系统和系统调用&#…

【Xcode Command Line Tools】安装指南

安装指令 xcode-select --install安装 完成安装 验证 $ xcode-select -p /Library/Developer/CommandLineTools

OpenCV-图像拼接

文章目录 一、基本原理二、步骤三、代码实现1.定义函数2.读取图像3.图像配准(1).特征点检测(2).特征匹配 4.透视变换5.图像拼接 四、图像拼接的注意事项 图像拼接是一种将多张有重叠部分的图像合并成一张无缝的全景图或高分辨率图…

Ascend C算子加速:优化与创新

Ascend C算子加速:优化与创新 随着大模型的迅速发展和人工智能计算需求的剧增,优化硬件性能变得尤为重要。针对这一需求,昇腾推出了Ascend Operator Library(AOL)算子加速库,专注于为开发者提供高效的算子…

C++ | 定长内存池 | 对象池

文章目录 C | 定长内存池 | 对象池一、内存池的引入二、代码中的内存池实现 - ObjectPool类(一)整体结构(二)内存分配 - New函数(三)内存回收 - Delete函数 三、内存池在TreeNode示例中的性能测试演示四、脱…

数据结构编程实践20讲(Python版)—03栈

本文目录 03 栈 StackS1 说明S2 示例基于列表的实现基于链表的实现 S3 问题:复杂嵌套结构的括号匹配问题求解思路Python3程序 S4 问题:基于栈的阶乘计算VS递归实现求解思路Python3程序 S5 问题:逆波兰表示法(后缀表达式)求值求解思路Python3程…

进度条(倒计时)Linux

\r回车(回到当前行开头) \n换行 行缓冲区概念 什么现象? 什么现象?? 什么现象??? 自己总结: #pragma once 防止头文件被重复包含 倒计时 在main.c中,windows.h是不可以用的&…

【数据结构】什么是平衡二叉搜索树(AVL Tree)?

🦄个人主页:修修修也 🎏所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 📌AVL树的概念 📌AVL树的操作 🎏AVL树的插入操作 ↩️右单旋 ↩️↪️右左双旋 ↪️↩️左右双旋 ↪️左单旋 🎏AVL树的删…

C++ | Leetcode C++题解之第451题根据字符出现频率排序

题目&#xff1a; 题解&#xff1a; class Solution { public:string frequencySort(string s) {unordered_map<char, int> mp;int maxFreq 0;int length s.size();for (auto &ch : s) {maxFreq max(maxFreq, mp[ch]);}vector<string> buckets(maxFreq 1)…

如何让 Android 的前端页面像 iOS 一样“优雅”?

作者:方英杰&#xff08;崇之&#xff09; 最近在调研前端页面适配 Android 端异形屏的方案&#xff0c;调研过程中发现了一些比较有意思的点&#xff0c;本文主要是做一个总结。 一、提出问题 首先&#xff0c;我们需要知道 Android 上的前端适配面临着什么问题。 问题其实很…

基础岛第3关:浦语提示词工程实践

模型部署 使用下面脚本测试模型 from huggingface_hub import login, snapshot_download import osos.environ[HF_ENDPOINT] https://hf-mirror.comlogin(token“your_access_token")models ["internlm/internlm2-chat-1_8b"]for model in models:try:snapsh…

【Linux】环境变量(初步认识环境变量)

文章目录 1. 环境变量1.1 基本概念 2. 认识常见环境变量2.1 PATH2.2 HOME2.3 SHELL2.4 PWD2.5 USER 3. 理解环境变量 1. 环境变量 在main函数的命令行参数中&#xff0c;有argc、argv、env三个参数。 argc&#xff1a;命令行参数的个数argc&#xff1a;存放每个参数的具体数值…

TOGAF框架在企业数字化转型中从理论到实践的全面应用指南

数字化转型的背景与意义 随着全球技术的快速发展&#xff0c;数字化已成为现代企业生存和发展的核心驱动力。企业数字化转型不仅意味着引入新技术&#xff0c;还要求在业务模式、组织架构和运营方式上进行深度变革。然而&#xff0c;数字化转型的实施通常面临诸多挑战&#xf…

vmvare虚拟机centos 忘记超级管理员密码怎么办?

vmvare虚拟机centos 忘记超级管理员密码怎么办?如何重置密码呢? 一、前置操作 重启vmvare虚拟机的过程中,长按住Shift键 选择第一个的时候,按下按键 e 进入编辑状态。 然后就会进入到类似这个界面中。 在下方界面 添加 init=/bin/sh,然后按下Ctrl+x进行保存退出。 init=/bi…

Unity开发绘画板——04.笔刷大小调节

笔刷大小调节 上面的代码中其实我们已经提供了笔刷大小的字段&#xff0c;即brushSize&#xff0c;现在只需要将该字段和界面中的Slider绑定即可&#xff0c;Slider值的范围我们设置为1~20 代码中只需要做如下改动&#xff1a; public Slider brushSizeSlider; //控制笔刷大…