Day52:Python操作Redis缓存数据库

本文详细介绍如何使用Python操作Redis缓存数据库,涵盖字符串、列表、集合、哈希和有序集合五大数据类型的常见操作方法,如设置、获取、删除数据等。

今天我们来学习如何使用Python操作Redis缓存数据库,首先我们需要使用到一个redis库,使用之前先安装一下,依旧是使用pip进行安装:

pip install redis

安装好了redis库之后,我们只需使用import redis导入即可使用了,是不是很方便呀,之前的文章里也用到很多库,大部分都是通过这两个步骤使用的;
接下来我们开始讲解如何操作Redis数据库,我们先了解一下Redis的五大数据类型有哪些呢?其实也就是字符串类型string列表类型list集合类型set哈希类型hash有序集合类型 sorted set这五种啦~

###开启数据库

要注意我们操作之前需要先开启Redis数据库,我们上一篇文章《Redis的使用》里面有告诉我们如何安装Redis数据库,但是我个人使用的是Winginx,这个是一个套装,集成了我们要用的几个数据库,比如Redis、MySQl、MongoDB等,方便用于本地测试,下载地址为https://winginx.com/en/download

一、字符串类型string

# 连接数据库
import redis
client = redis.StrictRedis(host='localhost', port=6379, db=0)

student1 = {
    'name': 'Angle',
    'age': 18,
}
  • set()方法:单个string操作方法,用于设置给定 key 的值。如果 key 已经存储其他值, SET 就覆写旧值,且无视类型;
result = client.set('Angle',18)
print(result)
  • get()方法:单个string操作,用于获取指定 key 的值,如果key不存在,返回nil,如果key储存的值不是字符串类型,返回一个错误;
    decode()方法:解码;
age = client.get('Angle')
print(age.decode())
  • mset():多个string操作,用于同时设置一个或多个key-value对;
result = client.mset(student1)
print(result)
  • mget():多个string操作,返回所有给定key的值;
result = client.mget(['name', 'age'])
print(result)
  • delete():删除数据,可以根据key来指定删除数据;
result = client.delete('name', 'age')
print(result)

二、列表类型list

import redis
client = redis.StrictRedis(host='localhost', port=6379, db=0)
  • lpush()方法:令将一个或多个值插入到列表头部,如果 key 不存在,一个空列表会被创建并执行 LPUSH 操作,当 key存在但不是列表类型时,返回一个错误;
    注意:在Redis 2.4版本以前的 LPUSH 命令,都只接受单个 value 值;
result = client.lpush('lsts', 'name')
print(result)
  • lrange()方法:返回列表中指定区间内的元素,区间以偏移量START和END指定,其中0表示列表的第一个元素,1表示列表的第二个元素,以此类推,以-1表示列表的最后一个元素, -2表示列表的倒数第二个元素,以此类推;
result = client.lrange('lsts', 0, -1)
print(result)
  • lpop()方法:用于移除并返回列表的第一个元素;
result = client.lpop('lsts')
print(result)

三、集合类型set

import redis
client = redis.StrictRedis(host='localhost', port=6379, db=0)
  • sadd():将一个或多个成员元素加入到集合中,已经存在于集合的成员元素将被忽略;
sets = ('name', 'age', 'hobby', 'address')
result = client.sadd('new_sets', *sets)
print(result)
  • smembers():判断成员元素是否是集合的成员;
result = client.smembers('new_sets')
print(result)
  • srem():用于移除集合中的一个或多个成员元素,不存在的成员元素会被忽略;
result = client.srem('new_sets', 'address')
print(result)

四、哈希类型hash

import redis
client = redis.StrictRedis(host='localhost', port=6379, db=0)
  • hset():用于为哈希表中的字段赋值 ,如果哈希表不存在,一个新的哈希表被创建并进行HSET操作;
client.hset("hash1", "k1", "v1")
client.hset("hash1", "k2", "v2")
  • hkeys():用于获取哈希表中的所有域(field);
print(client.hkeys("hash1"))
  • hget():用于返回哈希表中指定字段的值;
print(client.hget("hash1", "k1"))
  • hmget():用于返回哈希表中,一个或多个给定字段的值;
print(client.hmget("hash1", "k1", "k2"))

五、有序集合类型 sorted set

import redis
client = redis.StrictRedis(host='localhost', port=6379, db=0)
  • zadd(name, *args, **kwargs) :在name对应的有序集合中添加元素;
d = {'Angle': '18'}
client.zadd("zset1", d)
  • zcard(name):获取name对应的有序集合元素的数量;
client.zcard("zset1")
  • zcount(name, min, max):获取name对应的有序集合中分数 在 [min,max] 之间的个数;
client.zcount("zset1", 0, 1)
  • zincrby(name, value, amount) :自增name对应的有序集合的 name 对应的分数;
client.zincrby("zset1", 1, '18')

以上就是Redis的五大数据类型的基本用法,如果大家不懂的记得动手去尝试哟,特别是每种类型的方法都有很多,大家可以自行查看API~

参考学习:https://www.9xkd.com/user/plan-view.html?id=1087797436

### 用户签到模块的实现方案 #### 数据库设计 为了存储用户的签到记录,可以创建一张 `sign_in` 表来保存每日签到的数据。该表的设计应至少包含以下字段: | 字段名 | 类型 | 描述 | |--------------|--------------|--------------------------| | user_id | INT | 用户唯一标识 | | sign_date | DATE | 签到日期 | 通过这张表,能够查询某个用户的历史签到情况以及连续签到的最大天数。 由于签到数据可能随着时间增长变得庞大,在高并发场景下直接依赖数据库进行计算可能会带来性能瓶颈[^2]。因此引入 Redis 来优化这一过程。 --- #### 使用 Redis 实现签到逻辑 Redis 提供了多种适合处理此类需求的功能,以下是具体实现方式: 1. **利用 Bitmap 存储每天签到状态** - 每位用户对应一个独立的键,例如 `user_sign:<user_id>`。 - 将每一天映射为 Bitmap 中的一个比特位置 (bit position),其中 0 表示未签到,1 表示已签到。 - 示例命令: ```bash SETBIT user_sign:123 20230901 1 # 记录用户ID=123在2023年9月1日签到了 GETBIT user_sign:123 20230901 # 查询用户ID=123在指定日期是否签到 ``` 2. **获取某段时间内的签到天数** - 借助 BITCOUNT 统计特定范围内的有效比特数量即可得出这段时间内总的签到次数。 - 示例代码: ```python import redis r = redis.StrictRedis(host='localhost', port=6379, decode_responses=True) start_day = '20230801' end_day = '20230901' total_days_signed = r.bitcount(f"user_sign:{user_id}", int(start_day), int(end_day)) print(total_days_signed) ``` 3. **求解最长连续签到天数** - 需要遍历整个 Bitmap 并找出最大连续序列长度。 - 这可以通过 Lua 脚本高效完成,减少网络往返开销。 - 示例脚本(伪代码形式): ```lua local function max_continuous_bits(key) local count = 0 local max_count = 0 for i = 0, math.huge do if redis.call('GETBIT', key, i) == 1 then count = count + 1 if count > max_count then max_count = count end else count = 0 end end return max_count end return max_continuous_bits(KEYS[1]) ``` 4. **缓存热点数据以减轻数据库压力** - 对于频繁访问的信息比如最近七天/三十天的签到详情,可以直接预计算并写入 Redis Hash 或 String 结构中定期更新。 - 如果某些统计结果变化频率较低,则可设置较长时间的有效期以便长期复用这些中间值从而降低 IO 成本。 --- #### 整体流程说明 当用户发起一次新的签到请求时,服务器端需依次执行下列动作: - 更新 MySQL 的原始签到记录; - 同步修改对应的 Redis Bitmap 和其他关联结构中的标志位; - 若有必要则重新评估当前用户的累计奖励或其他动态指标并将它们刷新至前端展示区域。 这种混合架构既保留了关系型数据库易于维护的优势又充分发挥出了 NoSQL 技术擅长快速检索的特点[^3]。 --- ### 总结 综上所述,采用数据库配合 Redis 构建用户签到系统是一种兼顾效率与灵活性的方法论实践案例之一。它不仅解决了传统单一模式下面临的各种挑战而且还提供了额外的价值增益点如实时反馈机制等[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值