当前位置: 首页 > news >正文

Redis数据类型,使用场景,事物及分布式锁

文章目录

  • 关于Redis
  • 1.常用数据类型
    • 1.字符串(String)
    • 2.哈希(Hash)
    • 3.列表(List)
    • 4.集合(Set)
    • 5.有序集合(Sorted Set)
    • 6.位图(Bitmap)
    • 7.超日志(HyperLogLog)
    • 8.地理空间(Geo)
  • 2.Redis持久化
  • 3.Redis事务
  • 4.Redis分布式锁


关于Redis

Redis是一种高性能的键值数据库,支持多种数据类型,每种数据类型都有其特定的使用场景
下面是使用Python和Redis的redis-py库结合各种数据类型的示例代码


提示:安装redis库,可以通过以下命令安装和使用

pip install redis
import redis
# 连接到Redis
redis_client = redis.Redis(host = 'localhost', port = 6379, db = 0)

1.常用数据类型

1.字符串(String)

字符串是Redis中最简单的数据类型,可以存储任何类型的数据,如文本、二进制数据等
使用场景:

  1. 缓存数据:可以用来缓存数据库查询结果
  2. 计数器:可以实现访问计数、点赞数等功能
  3. 会话存储:存储用户会话信息
# 设置字符串
redis_client.set('name', 'john')# 获取字符串
name = redis_client.get('name')# 输出:john
print(name.decode())

2.哈希(Hash)

哈希是一个键值对集合,适合存储对象
使用场景:

  1. 用户信息:可以存储用户的属性,如用户名、邮箱等
  2. 配置管理:存储应用的配置参数
  3. 统计数据:存储某个实体的多个属性,如商品的库存、价格等
# 设置哈希
redis_client.hset('user:1000', mapping={'name': 'Alice', 'age': 30})# 获取哈希字段
user_name = redis_client.hget('user:1000', 'name')
print(user_name.decode())  # 输出:Alice# 获取整个哈希
user_info = redis_client.hgetall('user:1000')
print({k.decode(): v.decode() for k, v in user_info.items()})

3.列表(List)

列表是一个按插入顺序排序的字符串集合,支持从两端插入和删除

  1. 消息队列:可以用作生产者-消费者模型的队列
  2. 时间线:存储用户的活动记录或消息历史
  3. 排行榜:维护用户积分或游戏分数的排行榜
# 添加元素到列表
redis_client.lpush('person_list', 'john')
redis_client.lpush('person_list', 'alice')# 获取列表元素
elements = redis_client.lrange('person_list', 0, -1)
print([elem.decode() for elem in elements])  # 输出:['alice', 'john']

4.集合(Set)

集合是一个无序且唯一的字符串集合
使用场景:

  1. 标签系统:存储用户的标签或兴趣爱好
  2. 交集、并集、差集计算:如用户共同关注的商品
  3. 去重:存储访问过的用户IP地址等
# 添加元素到集合
redis_client.sadd('myset', 'item1', 'item2', 'item3')# 获取集合元素
set_members = redis_client.smembers('myset')
print([item.decode() for item in set_members])  # 输出:['item1', 'item2', 'item3']

5.有序集合(Sorted Set)

有序集合与集合类似,但每个元素都有一个分数,元素按分数排序
使用场景:

  1. 排行榜:例如游戏得分榜,按照得分排序
  2. 任务调度:按优先级排序的任务队列
  3. 时间戳事件:按时间顺序存储事件
# 添加元素到有序集合
redis_client.zadd('myzset', {'member1': 1, 'member2': 2, 'member3': 3})# 获取有序集合元素
sorted_members = redis_client.zrange('myzset', 0, -1, withscores=True)
print([(member.decode(), score) for member, score in sorted_members])  # 输出:[('member1', 1.0), ('member2', 2.0), ('member3', 3.0)]

6.位图(Bitmap)

位图是一个位数组,可以用来进行位操作
使用场景:

  1. 用户活跃度统计:记录用户的在线状态
  2. A/B测试:记录不同用户的分组
# 设置位图
redis_client.setbit('mybitmap', 0, 1)
redis_client.setbit('mybitmap', 1, 1)# 获取位图的值
bit0 = redis_client.getbit('mybitmap', 0)
bit1 = redis_client.getbit('mybitmap', 1)
print(bit0, bit1)  # 输出:1 1

7.超日志(HyperLogLog)

用于基数估算的数据结构,能够快速统计唯一元素的数量
使用场景:

  1. 统计网站独立访客数
  2. 统计唯一商品访问量
# 添加元素到超日志
redis_client.pfadd('myhll', 'item1', 'item2', 'item3', 'item1')  # 'item1'重复添加# 获取唯一元素的估计数量
unique_count = redis_client.pfcount('myhll')
print(unique_count)  # 输出:3

8.地理空间(Geo)

用于存储地理位置信息,支持地理位置的计算和查询
使用场景:

  1. 位置服务:查找附近的商家或用户
  2. 位置分析:用户活动的地理分布分析
# 添加地理位置
redis_client.geoadd('locations', 13.361389, 38.115556, 'Palermo')
redis_client.geoadd('locations', 15.087269, 37.502669, 'Catania')# 获取位置
distance = redis_client.geodist('locations', 'Palermo', 'Catania', unit = 'km')
print(distance)  # 输出:两地之间的距离(单位为公里)

2.Redis持久化

Redis主要支持两种持久化机制:RDB(快照)和AOF(追加文件)
在Python中可以通过配置Redis服务器的redis.conf文件来设置持久化选项

RDB持久化:配置save选项以定义快照的频率
AOF持久化:设置appendonly yes来启用AOF持久化
import redis# 连接到Redis
redis_client = redis.Redis(host='localhost', port=6379, db=0)# 设置键值对
redis_client.set('name', 'Alice')
redis_client.set('age', 30)# 手动触发持久化
redis_client.bgsave()  # 触发RDB快照

3.Redis事务

Redis事务通过MULTI,EXEC,DISCARD,WATCH命令来实现,事务中的所有命令会在执行时打包在一起,保证原子性

# 使用事务
pipeline = redis_client.pipeline()# 开始事务
pipeline.multi()# 执行多个命令
pipeline.set('name', 'Bob')
pipeline.set('age', 25)# 提交事务
pipeline.execute()# 获取值
name = redis_client.get('name')
age = redis_client.get('age')
print(name.decode(), age.decode())  # 输出:Bob 25

4.Redis分布式锁

Redis可以实现简单的分布式锁,确保在高并发环境中某个资源的独占访问,可以使用SETNX命令创建锁,使用EXPIRE设置锁的过期时间

import time
import uuid# 获取唯一锁名
lock_name = "my_lock"
lock_value = str(uuid.uuid4())  # 生成唯一标识
lock_timeout = 10  # 锁超时时间# 获取锁的函数
def acquire_lock():while True:# 尝试获取锁if redis_client.set(lock_name, lock_value, nx=True, ex=lock_timeout):print("锁已获得")return Truetime.sleep(0.1)  # 等待重试# 释放锁的函数
def release_lock():if redis_client.get(lock_name) == lock_value:redis_client.delete(lock_name)print("锁已释放")# 使用锁
if acquire_lock():try:# 执行临界区代码print("执行临界区代码")time.sleep(5)  # 模拟操作finally:release_lock()

根据具体需求,选择合适的数据类型来存储和处理数据,通过适当地配置Redis持久化策略,可以确保数据安全性
使用事务可以保证一组操作的原子性;
实现分布式锁则可以确保高并发环境下的资源安全
确保在实际应用中,根据具体需求调整锁的超时时间和持久化策略

相关文章:

Redis数据类型,使用场景,事物及分布式锁

文章目录 关于Redis1.常用数据类型1.字符串(String)2.哈希(Hash)3.列表(List)4.集合(Set)5.有序集合(Sorted Set)6.位图(Bitmap)7.超日…...

目标检测系列(一)什么是目标检测

目录 一、相关名词解释 二、目标检测算法 三、目标检测模型 四、目标检测应用 五、目标检测数据集 六、目标检测常用标注工具 一、相关名词解释 关于图像识别的计算机视觉四大类任务: 分类(Classification):解决“是什么&…...

STM32CubeIDE | 使用HAL库的ADC读取内部传感器温度

1、cubemx配置 1.1、系统配置 1.2、GPIO配置 PB2设置为“GPIO_Output” user label设置为“LED” 1.3、串口配置 模式选择为“Asynchronous”,其他默认 1.4、时钟树配置 全部保持默认 2、ADC配置 通道选择“Temperature Sensor Channel”,其他默认 …...

茶思屋直播|TinyEngine+AI:聚焦主航道,在实践中探索低代码技术黑土地

低代码引擎使能开发者定制低代码平台。它是低代码平台的底座,提供可视化搭建页面等基础能力,既可以通过线上搭配组合,也可以通过cli创建个人工程进行二次开发,实时定制出自己的低代码平台。适用于多场景的低代码平台开发&#xff…...

Ansible流程控制-条件_循环_错误处理_包含导入_块异常处理

文章目录 Ansible流程控制介绍1. 条件判断2. 循环3. 循环控制4. 错误处理5. 包含和导入6. 块和异常处理7. 角色的流程控制*include_tasks、import_tasks_include之间的区别 条件语句再细说且、或、非、是模糊条件when指令的详细使用方法 循环语句再细说如何使用使用item变量结合…...

Mybatis-为什么使用Mybatis,它存在哪些优点和缺点?

优点: 基于 SQL 语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL单独写,解除SQL与程序代码的耦合,便于统⼀管理。与 JDBC 相比,减少了 50%以上的代码量,消除…...

银河麒麟高级服务器操作系统V10外接硬盘挂载指南

银河麒麟高级服务器操作系统V10外接硬盘挂载指南 1、临时挂载外接硬盘2、永久挂载外接硬盘3、总结 💖The Begin💖点点关注,收藏不迷路💖 在使用银河麒麟高级服务器操作系统V10时,您可能希望将外接硬盘(如sd…...

免费制作证件照的小程序源码

1、效果展示 证件照制作,证件照免费制作,证件照调用api源码,解析代码。证件照制作小程序包,可以下载程序包,最初级版本免费下载。以上是高级版本。如果你有开发能力的话可以自己写前端,然后以下调用以下api…...

面经宝典【1】-拼多多

这个专题我主要想的是吧这些面经题目给整合起来,自己时不时可以看看然后回答回答,然后再根据一些面经去查漏补缺,具体的答案我都记录在在自己的语雀笔记当中,如果想要的可以私聊我,当然这些答案一般在网上都能找到。 今…...

AI画图用到的网站与资源

1、画图 爱灯泡 midjourney官网 可以使用stable-diffusion的网站 2、素材 花瓣 figma 3、...

C++——多线程编程(从入门到放弃)

进程:运行中的程序 线程:进程中的进程 线程的最大数量取决于CPU的核心数 一、将两个函数添加到不同线程中 demo:两个函数test01()和test02(),实现将用户输入的参数进行打印输出1000次 将这两个函数均放到独立的线程t1和t2中&…...

江协科技STM32学习- P14 示例程序(定时器定时中断和定时器外部时钟)

🚀write in front🚀 🔎大家好,我是黄桃罐头,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝​…...

2024年CSP-J认证 CCF信息学奥赛C++ 中小学初级组 第一轮真题-阅读程序题解析

2024 CCF认证第一轮&#xff08;CSP-J&#xff09;真题 二、阅读程序题 (程序输入不超过数组或字符串定义的范围&#xff0c;判断题正确填√错误填X;除特殊说明外&#xff0c;判断题 1.5分&#xff0c;选择题3分&#xff0c;共计40 分) 第一题 01 #include <iostream>…...

Hive ROW_NUMBER() 简介

在 Apache Hive 中&#xff0c;ROW_NUMBER() 是一个窗口函数&#xff0c;常用于为查询结果中的每一行生成唯一的行号。它在 SQL 查询结果集中按照指定的排序规则对每一行进行编号。ROW_NUMBER() 的实现依赖于 Hive 的分布式执行框架和排序机制。 为了理解 ROW_NUMBER() 的底层实…...

java是干什么的

Java 是一种广泛使用的编程语言&#xff0c;主要用于以下几个方面&#xff1a; Web 开发&#xff1a;Java 可以用于创建动态网页和 Web 应用程序&#xff0c;常见的框架有 Spring 和 JavaServer Faces&#xff08;JSF&#xff09;。 企业级应用&#xff1a;Java 被广泛应用于…...

AI与量化投资人才培养计划-连接职场 助力走在金融行业前沿

AI与量化投资人才培养计划-连接职场 助力走在金融行业前沿 人工智能&#xff08;AI&#xff09;的快速发展&#xff0c;量化投资已逐渐成为金融行业的新趋势&#xff0c;对专业人才的需求日益迫切。本文将深入探讨一项针对AI与量化投资的人才培养计划&#xff0c;旨在为金融专业…...

《CUDA编程》2.CUDA中的线程组织

0 来自GPU的hello world 在visua studio 中新建一个CUDA runtime项目&#xff0c;然后把kernel.cu中的代码删掉&#xff0c;输入以下代码 #include"cuda_runtime.h" #include"device_launch_parameters.h"#include<stdio.h>__global__ void hello_…...

学习篇 | Dockerized GitLab 安装使用(简单实操版)

1. 详细步骤 1.1 安装启动 postgresql 服务 docker pull sameersbn/postgresql:14-20230628docker run --name gitlab-postgresql -d \--env DB_NAMEgitlabhq_production \--env DB_USERgitlab --env DB_PASSpassword \--env DB_EXTENSIONpg_trgm,btree_gist \--volume /srv/…...

Linux服务器磁盘扩容

文章目录 扩容挂载 扩容 [rootserver8 ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sr0 11:0 1 1024M 0 rom vda 252:0 0 1T 0 disk ├─vda1 252:1 0 1G 0 par…...

Redis的一些数据类型(一)

&#xff08;一&#xff09;数据类型 我们说redis是key value键值对的方式存储数据&#xff0c;key是字符串&#xff0c;而value是一些数据结构,那今天就来说一下value存储的数据。 我们数据结构包含&#xff0c;String&#xff0c;hash&#xff0c;list&#xff0c;set和zest但…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程&#xff1a;如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket&#xff08;服务端和客户端都要&#xff09;2. 绑定本地地址和端口&#x…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解

在 C/C 编程的编译和链接过程中&#xff0c;附加包含目录、附加库目录和附加依赖项是三个至关重要的设置&#xff0c;它们相互配合&#xff0c;确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中&#xff0c;这些概念容易让人混淆&#xff0c;但深入理解它们的作用和联…...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

JavaScript 数据类型详解

JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型&#xff08;Primitive&#xff09; 和 对象类型&#xff08;Object&#xff09; 两大类&#xff0c;共 8 种&#xff08;ES11&#xff09;&#xff1a; 一、原始类型&#xff08;7种&#xff09; 1. undefined 定…...

腾讯云V3签名

想要接入腾讯云的Api&#xff0c;必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口&#xff0c;但总是卡在签名这一步&#xff0c;最后放弃选择SDK&#xff0c;这次终于自己代码实现。 可能腾讯云翻新了接口文档&#xff0c;现在阅读起来&#xff0c;清晰了很多&…...

Spring Security 认证流程——补充

一、认证流程概述 Spring Security 的认证流程基于 过滤器链&#xff08;Filter Chain&#xff09;&#xff0c;核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤&#xff1a; 用户提交登录请求拦…...

十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建

【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...