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

ops/2024/9/25 10:57:29/

文章目录

  • 关于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库,可以通过以下命令安装和使用

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

1.常用数据类型

1.字符串(String)

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

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

2.哈希(Hash)

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

  1. 用户信息:可以存储用户的属性,如用户名、邮箱等
  2. 配置管理:存储应用的配置参数
  3. 统计数据:存储某个实体的多个属性,如商品的库存、价格等
python"># 设置哈希
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. 排行榜:维护用户积分或游戏分数的排行榜
python"># 添加元素到列表
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地址等
python"># 添加元素到集合
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. 时间戳事件:按时间顺序存储事件
python"># 添加元素到有序集合
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测试:记录不同用户的分组
python"># 设置位图
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. 统计唯一商品访问量
python"># 添加元素到超日志
redis_client.pfadd('myhll', 'item1', 'item2', 'item3', 'item1')  # 'item1'重复添加# 获取唯一元素的估计数量
unique_count = redis_client.pfcount('myhll')
print(unique_count)  # 输出:3

8.地理空间(Geo)

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

  1. 位置服务:查找附近的商家或用户
  2. 位置分析:用户活动的地理分布分析
python"># 添加地理位置
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文件来设置持久化选项

python">RDB持久化:配置save选项以定义快照的频率
AOF持久化:设置appendonly yes来启用AOF持久化
python">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命令来实现,事务中的所有命令会在执行时打包在一起,保证原子性

python"># 使用事务
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设置锁的过期时间

python">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持久化策略,可以确保数据安全性
使用事务可以保证一组操作的原子性;
实现分布式锁则可以确保高并发环境下的资源安全
确保在实际应用中,根据具体需求调整锁的超时时间和持久化策略


http://www.ppmy.cn/ops/115750.html

相关文章

线性代数书中求解线性方程组的三种方法的实例

目录 一、克拉默法则(P45) 二、逆矩阵(P46) 三、高斯-约旦消元法(P65) 一、克拉默法则(P45) 二、逆矩阵(P46) 三、高斯-约旦消元法(P65)

【Webpack】使用 Webpack 和 LocalStorage 实现静态资源的离线缓存

基本流程 1)使用 Webpack 进行资源打包: 安装 Webpack 及其相关插件。配置 Webpack,将静态资源打包到特定目录。 2)配置 Service Worker: 安装 workbox-webpack-plugin 插件。配置 Service Worker,通过…

GPU高性能编程CUDA入门

CMake中启用CUDA支持 最新版的 CMake(3.18 以上),只需在LANGUAGES 后面加上 CUDA 即可启用。 然后在 add executable 里直接加你的 .cu文件,和 .cpp 一样。 cmake minimum required(VERSION 3.10)set(CMAKE_CXX_STANDARD 17) set(CMAKE BUILD TYPE Rel…

spark 面试题

spark 面试题 1、spark 任务如何解决第三方依赖 比如机器学习的包,需要在本地安装?--py-files 添加 py、zip、egg 文件不需要在各个节点安装 2、spark 数据倾斜怎么解决 spark 中数据倾斜指的是 shuffle 过程中出现的数据倾斜,主要是由于…

微服务——网关登录校验(一)

1.网关登录校验 微服务中的网关登录校验是微服务架构中常见的一种安全机制,用于在请求到达微服务之前,对用户的身份进行验证,确保只有合法的用户才能访问相应的服务。 在微服务架构中,每个微服务都是独立部署的,它们之…

Linux常用命令大全

Linux系统中拥有大量的命令,这里列举一些常用的命令,覆盖了文件管理、系统监控、网络操作、用户管理。 文件和目录管理 ls:列出目录内容。 ls -l 列出当前目录下所有文件和目录的详细信息。 cd:更改当前目录。 cd /home/user 进…

文字转换(中文转英文、英文转中文)

1.环境 Python 3.10.14 2.完整代码 from transformers import pipeline, AutoModelWithLMHead, AutoTokenizermodelName "./damo/opus-mt-zh-en" # 模型名 model AutoModelWithLMHead.from_pretrained(modelName) tokenizer AutoTokenizer.from_pretrained(mo…

人工智能开发实战推荐算法应用解析

内容导读 个性化推荐思路推荐算法分类推荐效果评估 一、个性化推荐思路 推荐系统能为你提供个性化的智能服务,是基于以下事实认知:人们倾向于喜欢那些与自己喜欢的东西相似的其它物品,或倾向于与自己趣味相投的人有相似的爱好,…