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中最简单的数据类型,可以存储任何类型的数据,如文本、二进制数据等
使用场景:
- 缓存数据:可以用来缓存数据库查询结果
- 计数器:可以实现访问计数、点赞数等功能
- 会话存储:存储用户会话信息
# 设置字符串
redis_client.set('name', 'john')# 获取字符串
name = redis_client.get('name')# 输出:john
print(name.decode())
2.哈希(Hash)
哈希是一个键值对集合,适合存储对象
使用场景:
- 用户信息:可以存储用户的属性,如用户名、邮箱等
- 配置管理:存储应用的配置参数
- 统计数据:存储某个实体的多个属性,如商品的库存、价格等
# 设置哈希
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)
列表是一个按插入顺序排序的字符串集合,支持从两端插入和删除
- 消息队列:可以用作生产者-消费者模型的队列
- 时间线:存储用户的活动记录或消息历史
- 排行榜:维护用户积分或游戏分数的排行榜
# 添加元素到列表
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)
集合是一个无序且唯一的字符串集合
使用场景:
- 标签系统:存储用户的标签或兴趣爱好
- 交集、并集、差集计算:如用户共同关注的商品
- 去重:存储访问过的用户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)
有序集合与集合类似,但每个元素都有一个分数,元素按分数排序
使用场景:
- 排行榜:例如游戏得分榜,按照得分排序
- 任务调度:按优先级排序的任务队列
- 时间戳事件:按时间顺序存储事件
# 添加元素到有序集合
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)
位图是一个位数组,可以用来进行位操作
使用场景:
- 用户活跃度统计:记录用户的在线状态
- 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)
用于基数估算的数据结构,能够快速统计唯一元素的数量
使用场景:
- 统计网站独立访客数
- 统计唯一商品访问量
# 添加元素到超日志
redis_client.pfadd('myhll', 'item1', 'item2', 'item3', 'item1') # 'item1'重复添加# 获取唯一元素的估计数量
unique_count = redis_client.pfcount('myhll')
print(unique_count) # 输出:3
8.地理空间(Geo)
用于存储地理位置信息,支持地理位置的计算和查询
使用场景:
- 位置服务:查找附近的商家或用户
- 位置分析:用户活动的地理分布分析
# 添加地理位置
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创建个人工程进行二次开发,实时定制出自己的低代码平台。适用于多场景的低代码平台开发ÿ…...

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认证第一轮(CSP-J)真题 二、阅读程序题 (程序输入不超过数组或字符串定义的范围,判断题正确填√错误填X;除特殊说明外,判断题 1.5分,选择题3分,共计40 分) 第一题 01 #include <iostream>…...
Hive ROW_NUMBER() 简介
在 Apache Hive 中,ROW_NUMBER() 是一个窗口函数,常用于为查询结果中的每一行生成唯一的行号。它在 SQL 查询结果集中按照指定的排序规则对每一行进行编号。ROW_NUMBER() 的实现依赖于 Hive 的分布式执行框架和排序机制。 为了理解 ROW_NUMBER() 的底层实…...
java是干什么的
Java 是一种广泛使用的编程语言,主要用于以下几个方面: Web 开发:Java 可以用于创建动态网页和 Web 应用程序,常见的框架有 Spring 和 JavaServer Faces(JSF)。 企业级应用:Java 被广泛应用于…...

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

《CUDA编程》2.CUDA中的线程组织
0 来自GPU的hello world 在visua studio 中新建一个CUDA runtime项目,然后把kernel.cu中的代码删掉,输入以下代码 #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的一些数据类型(一)
(一)数据类型 我们说redis是key value键值对的方式存储数据,key是字符串,而value是一些数据结构,那今天就来说一下value存储的数据。 我们数据结构包含,String,hash,list,set和zest但…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...

uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...

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

MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...
Spring Security 认证流程——补充
一、认证流程概述 Spring Security 的认证流程基于 过滤器链(Filter Chain),核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤: 用户提交登录请求拦…...
十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建
【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...