数据库——redis

news2025/6/12 1:39:31

一、Redis 介绍

1. 概述

Redis(Remote Dictionary Server)是一个开源的、高性能的内存键值数据库系统,具有以下核心特点:

  • 内存存储架构:数据主要存储在内存中,提供微秒级的读写响应

  • 多数据结构支持

    • 基础类型:字符串(Strings)

    • 集合类型:列表(Lists)、集合(Sets)、有序集合(Sorted Sets)

    • 复合类型:哈希表(Hashes)

    • 特殊类型:位图(Bitmaps)、超日志(HyperLogLogs)

    • 空间数据:地理空间索引(Geospatial)

  • 多功能应用

    • 高性能数据库

    • 分布式缓存系统

    • 消息中间件

    • 实时数据处理平台

2. 核心特性

2.1 卓越性能
  • 内存存储架构实现微秒级响应

  • 单节点可达10万+ QPS

  • 单线程模型避免锁竞争

2.2 数据持久化
  • RDB:定时快照,适合备份

  • AOF:日志追加,保证数据安全

  • 混合持久化策略可选

2.3 高级数据结构
  • 支持7种核心数据结构

  • 提供160+操作命令

  • 支持Lua脚本扩展

2.4 消息系统
  • 完整的发布/订阅模式

  • 阻塞式列表队列

  • Stream数据类型支持

2.5 事务处理
  • MULTI/EXEC事务机制

  • WATCH乐观锁控制

  • 所有命令原子性执行

2.6 高可用架构
  • Redis Sentinel自动故障转移

  • Redis Cluster分布式部署

  • 支持水平扩展和数据分片

3. 典型应用场景

3.1 缓存系统
  • 热点数据缓存

  • 全页缓存(FPC)

  • 分布式会话存储

3.2 实时应用
  • 实时排行榜

  • 计数器系统

  • 秒杀系统实现

3.3 消息服务
  • 任务队列

  • 事件通知系统

  • 消息广播

3.4 空间计算
  • 地理位置查询

  • 附近的人功能

  • 地理围栏实现

3.5 大数据处理
  • 实时统计分析

  • 用户画像标签

  • 布隆过滤器实现

Redis以其卓越的性能、丰富的数据结构和灵活的部署方式,已成为现代分布式系统架构中的核心组件。

4.Redis 基础指令

连接redis

# 终端输入以下命令
redis-cli

# 进入到交互模式后进行服务测试
ping

切换数据仓库:redis 默认存在十六个数据仓库,仓库编号从零计算

select 10

二、数据操作

1.数据类型

在正式操作 redis 之前,我们需要了解一下 redis 数据库中常用的数据类型:

1.字符串类型:string

2.哈希类型:hash

3.列表类型:list

4.集合类型:set

5.有序集合类型:zset 

数据类型适用场景不适用场景
String简单键值、计数器复杂对象存储
Hash对象属性存储需要单独过期时间的字段
List消息队列、最新列表随机访问场景
Set标签系统、好友关系需要排序的场景
Zset排行榜、优先级队列简单去重场景

2.字符串类型操作

如果设置的键不存在则为添加,如果设置的键已经存在则修改 

# set key value
set name tuling

设置键值及过期时间,以秒为单位

# setex key seconds value
setex name 3 小黑猪

设置多个键值

# mset key1 value1 key2 value2 ...
mset name 小孩 age 18 gender 女

根据键获取值,如果不存在则返回nil

# get key
get name

根据多个键获取多个值 

# mget key1 key2 key3 ...
mget name age gender

键指令

查询所有存在的键 

# keys pattern
keys *

 查询包含字母 n 的键

# keys <regex>
keys n*

判断键是否存在,如果存在返回1;否则返回0

# exists key
exists name
exists address

查看键对应的值的类型 

# type key
type age

删除键值对 

# del key1 key2 ...
del age gender

3.hash 类型

hash 用于存储对象,对象的结构为:属性、值(string)

设置单个属性

# hset key field value
hset user name tuling

设置多个属性

# hmset key field1 value1 field2 value2 ...
# 属性有两个:name、age
hmset py_stu name tuling age 10

获取指定键的所有字段 

# hkeys key
hkeys py_stu

获取一个字段对应的值

# hget key field
hget py_stu name

获取多个字段对应的值 

# hmget key field1 field2 ...
hmget py_stu name age

获取指定键的所有字段对应的值 

# hvals key
hvals py_stu

删除字段:字段对应的值会被一起删除 

# hdel key field1 field2 ...
hdel py_stu age

# 如果想要删除整个hash数据则使用del
del py_stu

4.list类型

从列表左侧插入数据

# lpush key value1 value2 ...
lpush name_1 a b c

从列表右侧插入数据

# rpush key value1 value2 ...
rpush name_2 a b c

数据获取:获取列表数据的方向只能从左往右

# lrange key start stop

# 获取列表name_1、name_2中的所有元素
lrange name_1 0 -1
lrange name_2 0 -1

# start、stop为元素的索引
# 1.索引从左侧开始,第一个元素为0
# 2.索引可以是负数,表示从尾部开始计数,如-1表示最后一个元素

删除指定元素

# lrem key count value

# 根据索引count删除对应的值
# count > 0:从左往右删除
# count < 0:从右往左删除
# count = 0:删除所有

# 创建测试列表并左插入三组a、b
lpush test_list a b a b a b 
# 查看列表数据
lrange test_list 0 -1
# 从test_list列表中的右侧开始删除2个b字母
lrem test_list -2 b
# 查看删除效果
lrange test_list 0 -1

5.set 类型

集合类型是无序的,并且集合中的元素类型为 string。在集合中的元素具有唯一性,不能重复,并且集合类型没有修改操作。

添加元素

# sadd key member1 member2 ...
sadd user_name_1 zhangsan lisi wangwu

获取元素

# smembers key

# 获取集合中的所有元素
smembers user_name_1

删除元素

# srem key

# 删除指定键user_name_1中的元素:wangwu
srem user_name_1 wangwu

6.zset类型

zset 类型是一个有序集合,元素为 string 类型。和无序集合一样,元素具有唯一性,不能重复,并没有修改操作。在有序集合中的每个元素都会关联一个 double 类型的 score,表示权重,通过权重将元素从小到大排序。

添加元素

# zadd key socre1 member1 socre2 member2 ...

# 向键user_name_2集合中添加元素:lisi、wangwu、zhaoliu、zhangsan 权重分别为 4 5 6 3
zadd user_name_2 4 lisi 5 wangwu 6 zhaoliu 3 zhangsan 

获取数据 

# zrange key start stop


# start、stop为元素的索引
# 1.索引从左侧开始,第一个元素索引为0
# 2.索引可以是负数,表示从尾部开始计数,如-1表示最后一个元素

# 获取键user_name_2集合中的所有元素
zrange user_name_2 0 -1

删除数据

# zrem key member1 member2 ...

# 删除user_name_2集合中的元素: zhangsan
zrem user_name_2 zhangsan

三、第三方客户端-redis-py

1.概述

redis-py 是 redis 数据库的一个 python 客户端库,允许你从 python 应用程序中连接到 redis 服务器并与之交互。这个库提供了一个简单易用的接口来执行 redis 命令,管理数据、处理订阅和发布消息等。redis-py 支持 Redis 的高级功能,如管道(pipelining)、发布订阅(pub/sub)系统、事务和自动重连。

2.准备工作

使用前需要先下载安装:pip install redis

from redis import Redis


"""
host:redis服务端ip
port:redis服务端端口
db:仓库号
"""
redis_obj=Redis(host='localhost',port=6379,db=0)

创建代码目录文件夹,在文件夹中创建redis_string.py文件 

from redis import Redis

if __name__=='__main__':
    try:
        # host port db 等参数是可选项
        redis_obj=Redis()
    except Exception as e:
        print(e)

3.添加数据

如果添加成功返回True,否则返回False

from redis import Redis

if __name__=='__main__':
    try:
        # host port db 等参数是可选项
        redis_obj=Redis()
        # 添加数据
        result=redis_obj.set('name','小孩')

        # 如果添加成功则返回True
        print(result)
    except Exception as e:
        print(e)

4.获取数据

如果键存在返回对应的值,否则返回None

from redis import Redis

if __name__=='__main__':
    try:
        # host port db 等参数是可选项
        redis_obj=Redis()
        # 添加数据
        result=redis_obj.set('name','小孩')

        # 获取数据
        result1=redis_obj.get('name')
        print(result1)
    except Exception as e:
        print(e)

5.数据修改

 如果键存在则进行修改,否则创建新数据

from redis import Redis

if __name__=='__main__':
    try:
        # host port db 等参数是可选项
        redis_obj=Redis()
        # 添加数据
        result=redis_obj.set('name','小孩')

        # 获取数据
        result1=redis_obj.get('name')

        # 数据修改
        redis_obj.set('name','小黑猪')
        result2 = redis_obj.get('name')
        print(result2)
    except Exception as e:
        print(e)

6.数据删除

使用 delete 方法删除键值对,如果删除成功则返回受影响的键的数量,否则返回0

from redis import Redis

if __name__=='__main__':
    try:
        # host port db 等参数是可选项
        redis_obj=Redis()
        
        result = redis_obj.delete('name')
        print(result)
    except Exception as e:
        print(e)

7.获取键

from redis import Redis


if __name__=='__main__':
    try:
        redis_obj = Redis()
        
        result = redis_obj.keys()
        print(result)
    except Exception as e:
        print(e)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java后端检查空条件查询

通过抛出运行异常&#xff1a;throw new RuntimeException("请输入查询条件&#xff01;");BranchWarehouseServiceImpl.java // 查询试剂交易&#xff08;入库/出库&#xff09;记录Overridepublic List<BranchWarehouseTransactions> queryForReagent(Branch…

PH热榜 | 2025-06-08

1. Thiings 标语&#xff1a;一套超过1900个免费AI生成的3D图标集合 介绍&#xff1a;Thiings是一个不断扩展的免费AI生成3D图标库&#xff0c;目前已有超过1900个图标。你可以按照主题浏览&#xff0c;生成自己的图标&#xff0c;或者下载整个图标集。所有图标都可以在个人或…

C++--string的模拟实现

一,引言 string的模拟实现是只对string对象中给的主要功能经行模拟实现&#xff0c;其目的是加强对string的底层了解&#xff0c;以便于在以后的学习或者工作中更加熟练的使用string。本文中的代码仅供参考并不唯一。 二,默认成员函数 string主要有三个成员变量&#xff0c;…

聚六亚甲基单胍盐酸盐市场深度解析:现状、挑战与机遇

根据 QYResearch 发布的市场报告显示&#xff0c;全球市场规模预计在 2031 年达到 9848 万美元&#xff0c;2025 - 2031 年期间年复合增长率&#xff08;CAGR&#xff09;为 3.7%。在竞争格局上&#xff0c;市场集中度较高&#xff0c;2024 年全球前十强厂商占据约 74.0% 的市场…

【iOS】 Block再学习

iOS Block再学习 文章目录 iOS Block再学习前言Block的三种类型__ NSGlobalBlock____ NSMallocBlock____ NSStackBlock__小结 Block底层分析Block的结构捕获自由变量捕获全局(静态)变量捕获静态变量__block修饰符forwarding指针 Block的copy时机block作为函数返回值将block赋给…

Mysql故障排插与环境优化

前置知识点 最上层是一些客户端和连接服务&#xff0c;包含本 sock 通信和大多数jiyukehuduan/服务端工具实现的TCP/IP通信。主要完成一些简介处理、授权认证、及相关的安全方案等。在该层上引入了线程池的概念&#xff0c;为通过安全认证接入的客户端提供线程。同样在该层上可…

STM32标准库-ADC数模转换器

文章目录 一、ADC1.1简介1. 2逐次逼近型ADC1.3ADC框图1.4ADC基本结构1.4.1 信号 “上车点”&#xff1a;输入模块&#xff08;GPIO、温度、V_REFINT&#xff09;1.4.2 信号 “调度站”&#xff1a;多路开关1.4.3 信号 “加工厂”&#xff1a;ADC 转换器&#xff08;规则组 注入…

何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡

何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡 背景 我们以建设星云智控官网来做AI编程实践&#xff0c;很多人以为AI已经强大到不需要程序员了&#xff0c;其实不是&#xff0c;AI更加需要程序员&#xff0c;普通人…

【若依】框架项目部署笔记

参考【SpringBoot】【Vue】项目部署_no main manifest attribute, in springboot-0.0.1-sn-CSDN博客 多一个redis安装 准备工作&#xff1a; 压缩包下载&#xff1a;http://download.redis.io/releases 1. 上传压缩包&#xff0c;并进入压缩包所在目录&#xff0c;解压到目标…

2025年- H71-Lc179--39.组合总和(回溯,组合)--Java版

1.题目描述 2.思路 当前的元素可以重复使用。 &#xff08;1&#xff09;确定回溯算法函数的参数和返回值&#xff08;一般是void类型&#xff09; &#xff08;2&#xff09;因为是用递归实现的&#xff0c;所以我们要确定终止条件 &#xff08;3&#xff09;单层搜索逻辑 二…

Java数组Arrays操作全攻略

Arrays类的概述 Java中的Arrays类位于java.util包中&#xff0c;提供了一系列静态方法用于操作数组&#xff08;如排序、搜索、填充、比较等&#xff09;。这些方法适用于基本类型数组和对象数组。 常用成员方法及代码示例 排序&#xff08;sort&#xff09; 对数组进行升序…

链式法则中 复合函数的推导路径 多变量“信息传递路径”

非常好&#xff0c;我们将之前关于偏导数链式法则中不能“约掉”偏导符号的问题&#xff0c;统一使用 二重复合函数&#xff1a; z f ( u ( x , y ) , v ( x , y ) ) \boxed{z f(u(x,y),\ v(x,y))} zf(u(x,y), v(x,y))​ 来全面说明。我们会展示其全微分形式&#xff08;偏导…

rm视觉学习1-自瞄部分

首先先感谢中南大学的开源&#xff0c;提供了很全面的思路&#xff0c;减少了很多基础性的开发研究 我看的阅读的是中南大学FYT战队开源视觉代码 链接&#xff1a;https://github.com/CSU-FYT-Vision/FYT2024_vision.git 1.框架&#xff1a; 代码框架结构&#xff1a;readme有…

高分辨率图像合成归一化流扩展

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 1 摘要 我们提出了STARFlow&#xff0c;一种基于归一化流的可扩展生成模型&#xff0c;它在高分辨率图像合成方面取得了强大的性能。STARFlow的主要构建块是Transformer自回归流&#xff08;TARFlow&am…

算法—栈系列

一&#xff1a;删除字符串中的所有相邻重复项 class Solution { public:string removeDuplicates(string s) {stack<char> st;for(int i 0; i < s.size(); i){char target s[i];if(!st.empty() && target st.top())st.pop();elsest.push(s[i]);}string ret…

leetcode73-矩阵置零

leetcode 73 思路 记录 0 元素的位置&#xff1a;遍历整个矩阵&#xff0c;找出所有值为 0 的元素&#xff0c;并将它们的坐标记录在数组zeroPosition中置零操作&#xff1a;遍历记录的所有 0 元素位置&#xff0c;将每个位置对应的行和列的所有元素置为 0 具体步骤 初始化…

向量几何的二元性:叉乘模长与内积投影的深层联系

在数学与物理的空间世界中&#xff0c;向量运算构成了理解几何结构的基石。叉乘&#xff08;外积&#xff09;与点积&#xff08;内积&#xff09;作为向量代数的两大支柱&#xff0c;表面上呈现出截然不同的几何意义与代数形式&#xff0c;却在深层次上揭示了向量间相互作用的…

归并排序:分治思想的高效排序

目录 基本原理 流程图解 实现方法 递归实现 非递归实现 演示过程 时间复杂度 基本原理 归并排序(Merge Sort)是一种基于分治思想的排序算法&#xff0c;由约翰冯诺伊曼在1945年提出。其核心思想包括&#xff1a; 分割(Divide)&#xff1a;将待排序数组递归地分成两个子…

Xcode 16 集成 cocoapods 报错

基于 Xcode 16 新建工程项目&#xff0c;集成 cocoapods 执行 pod init 报错 ### Error RuntimeError - PBXGroup attempted to initialize an object with unknown ISA PBXFileSystemSynchronizedRootGroup from attributes: {"isa">"PBXFileSystemSynchro…