1.基本连接及使用
创建一个Redis连接对象来连接到Redis服务器。默认情况下,它会尝试连接到本地主机(localhost)的6379端口,这是Redis的默认端口.连接对象r来执行各种Redis命令。
import redis
r = redis.Redis(host='localhost', port=6379, db=0,password="lj123456")
# 设置键值对
r.set('test-key', 'Hello World!')
# 获取值
value = r.get('test-key')
print(value) # 输出: b'Hello World!'
# 删除键
r.delete('test-key')
# 获取值
value = r.get('test-key')
print(value) # 输出: b'Hello World!'
2.哈希表操作
# 设置哈希表字段
r.hset('my-hash', 'field1', 'value1')
r.hset('my-hash', 'field2', 'value2')
# 获取哈希表的所有字段和值
all_fields = r.hgetall('my-hash')
print(all_fields) # 输出: {b'field1': b'value1', b'field2': b'value2'}
# 获取哈希表的单个字段值
field_value = r.hget('my-hash', 'field1')
print(field_value) # 输出: b'value1'
# 删除哈希表的字段
r.hdel('my-hash', 'field1')
hget和hgetall返回的值都是字节字符串(bytes),需解码:
value1_decoded = value1.decode('utf-8') #解码
print(value1_decoded) # 输出: value1
all_fields_decoded = {k.decode('utf-8'): v.decode('utf-8') for k, v in all_fields.items()}
print(all_fields_decoded) # 输出: {'field1': 'value1', 'field2': 'value2'}
检查哈希字段是否存在:
# 检查字段是否存在
exists = r.hexists('my-hash', 'field2')
print(exists) # 如果字段存在,输出: True;否则,输出: False
获取哈希中所有字段的键或值:
# 获取所有字段的键
keys = r.hkeys('my-hash')
print(keys) # 输出: [b'field2']
# 获取所有字段的值
values = r.hvals('my-hash')
print(values) # 输出: [b'value2']
3.列表操作
使用lpush或rpush方法将元素推送到列表的左侧或右侧,,使用lpop或rpop方法从列表的左侧或右侧移除并获取元素,使用llen方法获取列表的长度。
# 在列表左侧添加元素
r.lpush('my-list', 'item1')
r.lpush('my-list', 'item2')
# 获取列表的所有元素
list_items = r.lrange('my-list', 0, -1)
print(list_items) # 输出: [b'item2', b'item1']
# 从列表右侧移除并获取元素
right_item = r.rpop('my-list')
print(right_item) # 输出: b'item1'
4.消息队列模式
将Redis列表用作消息队列时,生产者(发送者)会将消息推送到列表的右侧,而消费者(接收者)会从列表的左侧移除并处理这些消息。这样可以实现一个基本的消息传递系统。
4.1 生产者
# 生产者将消息推送到队列中
def produce_messages(r, queue_name, messages):
for message in messages:
r.rpush(queue_name, message)
print(f"Produced message: {message}")
# 示例消息列表
messages = ['msg1', 'msg2', 'msg3']
produce_messages(r, 'message-queue', messages)
4.2 消费者
# 消费者从队列中获取并处理消息
def consume_messages(r, queue_name):
while True:
message = r.blpop(queue_name)[1] # blpop会阻塞直到有消息可用
print(f"Consumed message: {message.decode('utf-8')}")
# 在这里处理消息...
# 启动消费者
consume_messages(r, 'message-queue')
blpop方法用于从列表中移除并获取元素。它会阻塞调用线程,直到有至少一个非空列表可用为止。这确保了在没有消息时消费者不会消耗过多资源。
blpop返回的是一个包含两个元素的元组:列表名和从该列表中弹出的元素。因此,使用[1]来获取实际的消息内容。
5.集合操作
在Redis中,集合(Set)和有序集合(Sorted Set)是两种不同类型的数据结构,允许存储不重复的字符串元素。集合是无序的,而有序集合中的每个元素都会关联一个分数(score),通过分数来为集合中的元素进行从小到大的排序。
集合:
# 添加元素到集合
r.sadd('my-set', 'member1')
r.sadd('my-set', 'member2')
# 获取集合的所有成员
set_members = r.smembers('my-set')
print(set_members) # 输出: {b'member1', b'member2'}
# 检查成员是否存在于集合中
is_member = r.sismember('my-set', 'member1')
print(is_member) # 输出: True
有序集合操作:
# 添加元素到有序集合,并设置分数
r.zadd('my-zset', {'member1': 1, 'member2': 2})
# 获取有序集合的所有元素和分数
zset_items = r.zrange('my-zset', 0, -1, withscores=True)
print(zset_items) # 输出: [(b'member1', 1.0), (b'member2', 2.0)]
# 获取有序集合中分数最高的元素
top_item = r.zrevrange('my-zset', 0, 0, withscores=True)
print(top_item) # 输出: [(b'member2', 2.0)]
6. 使用连接池
当使用Redis时,特别是当并发量较高时,频繁地创建和关闭Redis连接可能会对性能产生负面影响。为了解决这个问题,可以使用Redis连接池(Connection Pool),它允许复用已经创建的连接,减少连接创建和销毁的开销。
import redis
# 创建Redis连接池
# 参数解释:
# max_connections: 连接池允许的最大连接数
# host: Redis服务器地址
# port: Redis服务器端口
# db: Redis数据库编号
# decode_responses: 是否自动解码返回的字节串为字符串(默认为False)
pool = redis.ConnectionPool(max_connections=10, host='localhost', port=6379, db=0, decode_responses=True)
# 使用连接池创建Redis对象
r = redis.Redis(connection_pool=pool)
# 使用r对象进行Redis操作
r.set('mykey', 'myvalue')
value = r.get('mykey')
print(value) # 输出: myvalue