十分钟教会你在python中使用Redis


一、Redis 简介

Redis 是一个开源的、内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。Redis 使用 C 语言编写,支持多种类型的数据结构,如字符串(strings)、散列(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)等,同时还支持范围查询、位图(Bitmaps)、HyperLogLog 和地理空间(geospatial)索引半径查询等功能。

二、Redis 特性

  • 速度快:Redis 的单节点读写速度非常快,读速度可以达到 11 万次/秒,写速度可以达到 8.1 万次/秒。
  • 数据存放内存:Redis 将所有数据存储在内存中,因此读写速度非常快。
  • 支持多种数据结构:Redis 支持多种类型的数据结构,满足不同的数据存储需求。
  • 持久化:Redis 支持数据的持久化,可以将内存中的数据异步保存到硬盘上,以防止数据丢失。
  • 高可用性:Redis 通过哨兵(Sentinel)和自动分区(Cluster)提供高可用性。

三、Redis 使用场景

  • 缓存:Redis 最常见的使用场景是作为缓存系统,用于缓存热点数据,减少对数据库的访问压力。
  • 计数器:Redis 的自增自减操作非常适合实现计数器功能,如用户访问量统计、点赞数统计等。
  • 消息队列:Redis 可以实现简单的消息队列功能,用于生产者和消费者之间的消息传递。
  • 排行榜:Redis 的有序集合可以用于实现排行榜功能,如热门文章排行榜、游戏排行榜等。
  • 社交网络:Redis 可以用于存储社交网络中的用户关系、好友列表等信息。

四、Redis 客户端与常用命令

Redis 提供了命令行客户端 redis-cli,用于与 Redis 服务进行交互。以下是一些常用的 Redis 命令:

  • SET:添加或修改一个字符串类型的键值对。
  • GET:根据键名获取对应的值。
  • INCR:将一个整数值自增 1。
  • DECR:将一个整数值自减 1。
  • LPUSH:向列表的左边插入一个元素。
  • RPUSH:向列表的右边插入一个元素。
  • HSET:添加或修改一个哈希类型键的字段值。
  • HGET:根据键名和字段名获取哈希类型的值。

五、Redis在Python上的操作

1. 安装 redis-py 库

pip install redis

2. 连接Redis服务器

使用 redis-py 库连接到 Redis 服务器。这可以通过创建 redis.Redis 或 redis.StrictRedis 的实例来完成。两者在大多数情况下可以互换使用。

import redis  
  
# 连接到本地 Redis 服务器  
r = redis.Redis(host='localhost', port=6379, db=0, password='123456', decode_responses=True)  
  
# 如果需要连接到远程 Redis 服务器或需要设置密码,可以修改 host, port, password 参数  
# host ip地址 默认本地
# port 端口号 默认6379
# password 密码
# db 数据库

注意:decode_responses=True 参数用于确保从 Redis 获取的字符串数据以 Python 字符串形式存在,而不是字节类型。

3. 数据操作

字符串操作

  • key 代指键名
  • string 代指值(字符串类型)
设置键值对 set(key, string)
r.set('mykey', 'myvalue')
获取字符串 get(key)
value = r.get('mykey')  
print(value)  # 输出: myvalue
检查键是否exists(key)
exists = r.exists('mykey')  
print(exists)  # 输出: True 或 False
删除键delete(key)
deleted = r.delete('mykey')  
print(deleted)  # 输出: 1 表示删除成功
批量设置键值对mset({key: value, key1: value1})
r.mset({'key1': 'value1', 'key2': 'value2'})  
values = r.mget('key1', 'key2')  
print(values)  # 输出: ['value1', 'value2']

哈希操作

  • keytable 代指哈希表
  • key 字段
  • value 数据
存储哈希值hset(keytable, key, value)
r.hset('myhash', 'field1', 'value1')
获取哈希值hget(keytable, key)
value = r.hget('myhash', 'field1')  
print(value)  # 输出: value1
批量存储哈希值hget(keytable, key_dict)
# 假设 hmset 可用  
r.hmset('myhash', {'field2': 'value2', 'field3': 'value3'})  
values = r.hmget('myhash', 'field2', 'field3')  
print(values)  # 输出: [b'value2', b'value3'] (注意:这里可能需要 decode_responses=True)
获取所有哈希值hgetall(keytable)
all_fields_values = r.hgetall('myhash')  
print(all_fields_values)  # 输出类似: {'field1': 'value1', 'field2': 'value2', ...}

列表操作

  • mylist 代指列表名
  • value代指数据
添加元素
  • lpush(mylist, value) 在列表左侧添加
  • rpush(mylist, value) 在列表右侧添加
r.lpush('mylist', 'value1')  # 在列表左侧添加  
r.rpush('mylist', 'value2')  # 在列表右侧添加
获取列表元素lrang(mylist, start, end)
  • start 索引开始位置
  • end 索引结束位置
# 获取列表中的所有元素  
print(r.lrange('mylist', 0, -1))  # 输出: [b'0', b'a', b'b', b'c']  
  
# 获取列表中的前两个元素  
print(r.lrange('mylist', 0, 1))  # 输出: [b'0', b'a']
移除元素
  • lpop:移除并获取列表的第一个元素
  • rpop:移除并获取列表的最后一个元素
# 移除并获取列表的第一个元素  
print(r.lpop('mylist'))  # 输出: b'0'  
  
# 移除并获取列表的最后一个元素  
print(r.rpop('mylist'))  # 输出: b'c'
列表长度llen(mylist)
print(r.llen('mylist'))  # 输出列表的长度

集合操作

  • myset 集合名
  • value 数据
添加元素sadd(myset, value)
r.sadd('myset', 'element1')  
r.sadd('myset', 'element2', 'element3')  # 可以一次添加多个元素
获取集合中的元素smember(myset)
elements = r.smembers('myset')  
print(elements)  # 输出集合中的所有元素,可能是一个无序的列表
集合的长度scart(myset)
length = r.scard('myset')  
print(length)  # 输出集合中的元素数量
集合的差集sdiff(myset, myset1)
set1 = {'element1', 'element2', 'element3'}  
r.sadd('set1', *set1)  # 假设set1已存在于Redis中  
r.sadd('set2', 'element2', 'element4')  # 假设set2也已存在  
  
diff = r.sdiff('set1', 'set2')  
print(diff)  # 输出: {'element1', 'element3'},即set1有而set2没有的元素
集合的交集sinter(myset, myset1)
inter = r.sinter('set1', 'set2')  
print(inter)  # 输出: {'element2'},即set1和set2共有的元素
从集合中移除元素

使用srem命令从集合中移除一个或多个元素。

r.srem('myset', 'element1', 'element2')  
# 现在'myset'中不再包含'element1'和'element2'
集合的随机元素

使用srandmember命令从集合中随机获取一个或多个元素。

random_element = r.srandmember('myset')  
print(random_element)  # 随机输出'myset'中的一个元素  
  
# 获取多个随机元素  
random_elements = r.srandmember('myset', 2)  # 获取两个随机元素  
print(random_elements)
集合的弹出元素

使用spop命令从集合中随机移除一个元素并返回该元素。

popped_element = r.spop('myset')  
print(popped_element)  # 随机输出'myset'中的一个元素,并从集合中移除它

有序集合(Sorted Set)

有序集合是Redis中一种特殊的集合类型,它不仅包含元素,还为每个元素关联了一个浮点数分数(score),这使得元素可以按照分数进行排序。

添加元素到有序集合

使用zadd命令向有序集合中添加一个或多个元素及其分数。

r.zadd('mysortedset', {'member1': 1, 'member2': 2})  
# 或者对于单个元素  
r.zadd('mysortedset', 1, 'member3')
获取有序集合中的元素

使用zrange(升序)或zrevrange(降序)命令获取有序集合中的元素及其分数。

# 升序获取  
ascending = r.zrange('mysortedset', 0, -1, withscores=True)  
print(ascending)  # 输出类似: [('member1', 1.0), ('member2', 2.0), ('member3', 1.0)]  
  
# 降序获取  
descending = r.zrevrange('mysortedset', 0, -1, withscores=True)  
print(descending)  # 输出可能反转的顺序
获取有序集合的排名

使用zrank(升序排名)或zrevrank(降序排名)命令获取元素的排名。

rank = r.zrank('mysortedset', 'member1')  
print(rank)  # 输出: 0,如果member1是分数最低的元素  
  
revrank = r.zrevrank('mysortedset', 'member2')  
print(revrank)  # 输出: 0,如果member2是分数最高的元素
删除有序集合中的元素

使用zrem命令从有序集合中移除一个或多个元素。

r.zrem('mysortedset', 'member1', 'member3')

六、Redis 持久化与备份

Redis 支持两种持久化方式:RDB 和 AOF。

  • RDB:Redis 在指定的时间间隔内将内存中的数据集快照写入磁盘。
  • AOF:Redis 将所有对数据库进行写入的命令以追加的方式写入到文件中,当 Redis 重启时会重新执行文件中的命令来恢复数据。

七、Redis 集群与分布式

Redis 提供了集群和分布式功能,可以通过哨兵和 Cluster 实现高可用性和数据分片。

  • 哨兵(Sentinel):哨兵可以监控主节点和从节点的状态,当主节点出现故障时,哨兵会自动将从节点提升为主节点,实现故障转移。
  • Cluster:Cluster 可以将数据集自动分片到多个节点上,实现数据的分布式存储和负载均衡。
  • 11
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值