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但…...

论文复现:考虑电网交互的风电、光伏与电池互补调度运行(MATLAB-Yalmip-Cplex全代码)
论文复现:考虑电网交互的风电、光伏与电池储能互补调度运行(MATLAB-Yalmip-Cplex全代码) 针对风电、光伏与电化学储能电站互补运行的问题,已有大量通过启发式算法寻优的案例,但工程上更注重实用性和普适性。Yalmip工具箱则是一种基于MATLAB平台的优化软件工具箱,被广泛应用…...

HTTP 协议介绍
基本介绍: HTTP(Hyper Text Transfer Protocol): 全称超文本传输协议,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。 HTTP 是一种应用层协议,是基…...

解决windows上VMware的ubuntu虚拟机不能拷贝和共享
困扰多时的VMware虚拟机不能复制拷贝和不能看到共享文件夹的问题,终于解决了~ 首先确定你已经开启了复制拷贝和共享文件夹,并且发现不好用。。。 按照下面方式解决这个问题。 1,删除当前的vmware tools。 sudo apt-get remove --purge ope…...

Python+rust会是一个强大的组合吗?
今天想和大家讨论一个在技术圈子里越来越火的话题——Python和Rust的组合。 不少程序员都开始探索这两个语言的结合,希望能借助Python的简洁和Rust的高性能,来打造出既易用又强大的软件。 那么,这对CP(编程组合)真的…...

引用和指针的区别
引用(reference)和指针(pointer)都是 C 中用来间接访问内存中对象的机制,但它们有一些重要的区别。以下是它们在语法、用法和特性上的详细区别。 下面从7个方面来详细说明引用和指针的区别 1. 定义与语法区别 引用&…...

内容生态短缺,Rokid AR眼镜面临市场淘汰赛
AR是未来,但在技术路径难突破、生态系统难建设,且巨头纷纷下场的背景下,Rokid能坚持到黎明吗? 转载:科技新知 原创 作者丨王思原 编辑丨蕨影 苹果Vision Pro的成功量产和发售,以及热门游戏《黑神话》等在A…...

【论文阅读】StoryMaker | 更全面的人物一致性开源工作
文章目录 1 Motivation2 背景 相关工作 Related work3 Method 方法4 效果 1 Motivation 背景是 Tuning-free personalized image generation methods无微调的个性化图像生成方式在维持脸部一致性上取得了显著性的成功。这里我不是很了解 然而,在多个场景中缺乏整…...

读构建可扩展分布式系统:方法与实践14流处理系统
1. 流处理系统 1.1. 时间就是金钱 1.1.1. 从数据中提取有价值的知识和获得洞见的速度越快,就能越快地响应系统所观察的世界的变化 1.1.2. 信用卡欺诈检测 1.1.3. 网络安全中异常网络流量的捕获 1.1.4. 在支持GPS的驾驶应用程序中进行的实时路线规划 1.1.5. 社交…...

C++第2课——取余运算符的应用、浮点型和字符型(含视频讲解)
文章目录 1、课程笔记2、课程视频 1、课程笔记 /* #include<iostream> using namespace std; int main(){//cout<<"hello,world!";//运算符的优先级 () * / % -// 3/2 1...1 3%21 5%32 3%53 -3%2-1 3%-21//cout<<6/4%2;//int 向下取整6…...

SQL常用技巧总结
查询优化基本准则 1、ORACLE 的解析器按照从右到左的顺序处理 FROM 子句中的表名,因此 FROM 子句中写在最后的表(基础表 driving table)将被最先处理。 在FROM 子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。 例如: 表 T…...