文章目录
- 一、Redis 简介
- 二、Redis 特性
- 三、Redis 使用场景
- 四、Redis 客户端与常用命令
- 五、Redis在Python上的操作
- 1. 安装 redis-py 库
- 2. 连接Redis服务器
- 3. 数据操作
- 字符串操作
- 设置键值对 set(key, string)
- 获取字符串 get(key)
- 检查键是否exists(key)
- 删除键delete(key)
- 批量设置键值对mset({key: value, key1: value1})
- 哈希操作
- 存储哈希值hset(keytable, key, value)
- 获取哈希值hget(keytable, key)
- 批量存储哈希值hget(keytable, key_dict)
- 获取所有哈希值hgetall(keytable)
- 列表操作
- 添加元素
- 获取列表元素lrang(mylist, start, end)
- 移除元素
- 列表长度llen(mylist)
- 集合操作
- 添加元素sadd(myset, value)
- 获取集合中的元素smember(myset)
- 集合的长度scart(myset)
- 集合的差集sdiff(myset, myset1)
- 集合的交集sinter(myset, myset1)
- 从集合中移除元素
- 集合的随机元素
- 集合的弹出元素
- 有序集合(Sorted Set)
- 添加元素到有序集合
- 获取有序集合中的元素
- 获取有序集合的排名
- 删除有序集合中的元素
- 六、Redis 持久化与备份
- 七、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 可以将数据集自动分片到多个节点上,实现数据的分布式存储和负载均衡。