一、Redis 介绍
1. 概述
Redis(Remote Dictionary Server)是一个开源的、高性能的内存键值数据库系统,具有以下核心特点:
-
内存存储架构:数据主要存储在内存中,提供微秒级的读写响应
-
多数据结构支持:
-
基础类型:字符串(Strings)
-
集合类型:列表(Lists)、集合(Sets)、有序集合(Sorted Sets)
-
复合类型:哈希表(Hashes)
-
特殊类型:位图(Bitmaps)、超日志(HyperLogLogs)
-
空间数据:地理空间索引(Geospatial)
-
-
多功能应用:
-
高性能数据库
-
分布式缓存系统
-
消息中间件
-
实时数据处理平台
-
2. 核心特性
2.1 卓越性能
-
内存存储架构实现微秒级响应
-
单节点可达10万+ QPS
-
单线程模型避免锁竞争
2.2 数据持久化
-
RDB:定时快照,适合备份
-
AOF:日志追加,保证数据安全
-
混合持久化策略可选
2.3 高级数据结构
-
支持7种核心数据结构
-
提供160+操作命令
-
支持Lua脚本扩展
2.4 消息系统
-
完整的发布/订阅模式
-
阻塞式列表队列
-
Stream数据类型支持
2.5 事务处理
-
MULTI/EXEC事务机制
-
WATCH乐观锁控制
-
所有命令原子性执行
2.6 高可用架构
-
Redis Sentinel自动故障转移
-
Redis Cluster分布式部署
-
支持水平扩展和数据分片
3. 典型应用场景
3.1 缓存系统
-
热点数据缓存
-
全页缓存(FPC)
-
分布式会话存储
3.2 实时应用
-
实时排行榜
-
计数器系统
-
秒杀系统实现
3.3 消息服务
-
任务队列
-
事件通知系统
-
消息广播
3.4 空间计算
-
地理位置查询
-
附近的人功能
-
地理围栏实现
3.5 大数据处理
-
实时统计分析
-
用户画像标签
-
布隆过滤器实现
Redis以其卓越的性能、丰富的数据结构和灵活的部署方式,已成为现代分布式系统架构中的核心组件。
4.Redis 基础指令
连接redis
# 终端输入以下命令
redis-cli
# 进入到交互模式后进行服务测试
ping
切换数据仓库:redis 默认存在十六个数据仓库,仓库编号从零计算
select 10
二、数据操作
1.数据类型
在正式操作 redis 之前,我们需要了解一下 redis 数据库中常用的数据类型:
1.字符串类型:string
2.哈希类型:hash
3.列表类型:list
4.集合类型:set
5.有序集合类型:zset
数据类型 | 适用场景 | 不适用场景 |
---|---|---|
String | 简单键值、计数器 | 复杂对象存储 |
Hash | 对象属性存储 | 需要单独过期时间的字段 |
List | 消息队列、最新列表 | 随机访问场景 |
Set | 标签系统、好友关系 | 需要排序的场景 |
Zset | 排行榜、优先级队列 | 简单去重场景 |
2.字符串类型操作
如果设置的键不存在则为添加,如果设置的键已经存在则修改
# set key value
set name tuling
设置键值及过期时间,以秒为单位
# setex key seconds value
setex name 3 小黑猪
设置多个键值
# mset key1 value1 key2 value2 ...
mset name 小孩 age 18 gender 女
根据键获取值,如果不存在则返回nil
# get key
get name
根据多个键获取多个值
# mget key1 key2 key3 ...
mget name age gender
键指令
查询所有存在的键
# keys pattern
keys *
查询包含字母 n 的键
# keys <regex>
keys n*
判断键是否存在,如果存在返回1;否则返回0
# exists key
exists name
exists address
查看键对应的值的类型
# type key
type age
删除键值对
# del key1 key2 ...
del age gender
3.hash 类型
hash 用于存储对象,对象的结构为:属性、值(string)
设置单个属性
# hset key field value
hset user name tuling
设置多个属性
# hmset key field1 value1 field2 value2 ...
# 属性有两个:name、age
hmset py_stu name tuling age 10
获取指定键的所有字段
# hkeys key
hkeys py_stu
获取一个字段对应的值
# hget key field
hget py_stu name
获取多个字段对应的值
# hmget key field1 field2 ...
hmget py_stu name age
获取指定键的所有字段对应的值
# hvals key
hvals py_stu
删除字段:字段对应的值会被一起删除
# hdel key field1 field2 ...
hdel py_stu age
# 如果想要删除整个hash数据则使用del
del py_stu
4.list类型
从列表左侧插入数据
# lpush key value1 value2 ...
lpush name_1 a b c
从列表右侧插入数据
# rpush key value1 value2 ...
rpush name_2 a b c
数据获取:获取列表数据的方向只能从左往右
# lrange key start stop
# 获取列表name_1、name_2中的所有元素
lrange name_1 0 -1
lrange name_2 0 -1
# start、stop为元素的索引
# 1.索引从左侧开始,第一个元素为0
# 2.索引可以是负数,表示从尾部开始计数,如-1表示最后一个元素
删除指定元素
# lrem key count value
# 根据索引count删除对应的值
# count > 0:从左往右删除
# count < 0:从右往左删除
# count = 0:删除所有
# 创建测试列表并左插入三组a、b
lpush test_list a b a b a b
# 查看列表数据
lrange test_list 0 -1
# 从test_list列表中的右侧开始删除2个b字母
lrem test_list -2 b
# 查看删除效果
lrange test_list 0 -1
5.set 类型
集合类型是无序的,并且集合中的元素类型为 string。在集合中的元素具有唯一性,不能重复,并且集合类型没有修改操作。
添加元素
# sadd key member1 member2 ...
sadd user_name_1 zhangsan lisi wangwu
获取元素
# smembers key
# 获取集合中的所有元素
smembers user_name_1
删除元素
# srem key
# 删除指定键user_name_1中的元素:wangwu
srem user_name_1 wangwu
6.zset类型
zset 类型是一个有序集合,元素为 string 类型。和无序集合一样,元素具有唯一性,不能重复,并没有修改操作。在有序集合中的每个元素都会关联一个 double 类型的 score,表示权重,通过权重将元素从小到大排序。
添加元素
# zadd key socre1 member1 socre2 member2 ...
# 向键user_name_2集合中添加元素:lisi、wangwu、zhaoliu、zhangsan 权重分别为 4 5 6 3
zadd user_name_2 4 lisi 5 wangwu 6 zhaoliu 3 zhangsan
获取数据
# zrange key start stop
# start、stop为元素的索引
# 1.索引从左侧开始,第一个元素索引为0
# 2.索引可以是负数,表示从尾部开始计数,如-1表示最后一个元素
# 获取键user_name_2集合中的所有元素
zrange user_name_2 0 -1
删除数据
# zrem key member1 member2 ...
# 删除user_name_2集合中的元素: zhangsan
zrem user_name_2 zhangsan
三、第三方客户端-redis-py
1.概述
redis-py 是 redis 数据库的一个 python 客户端库,允许你从 python 应用程序中连接到 redis 服务器并与之交互。这个库提供了一个简单易用的接口来执行 redis 命令,管理数据、处理订阅和发布消息等。redis-py 支持 Redis 的高级功能,如管道(pipelining)、发布订阅(pub/sub)系统、事务和自动重连。
2.准备工作
使用前需要先下载安装:pip install redis
from redis import Redis
"""
host:redis服务端ip
port:redis服务端端口
db:仓库号
"""
redis_obj=Redis(host='localhost',port=6379,db=0)
创建代码目录文件夹,在文件夹中创建redis_string.py文件
from redis import Redis
if __name__=='__main__':
try:
# host port db 等参数是可选项
redis_obj=Redis()
except Exception as e:
print(e)
3.添加数据
如果添加成功返回True,否则返回False
from redis import Redis
if __name__=='__main__':
try:
# host port db 等参数是可选项
redis_obj=Redis()
# 添加数据
result=redis_obj.set('name','小孩')
# 如果添加成功则返回True
print(result)
except Exception as e:
print(e)
4.获取数据
如果键存在返回对应的值,否则返回None
from redis import Redis
if __name__=='__main__':
try:
# host port db 等参数是可选项
redis_obj=Redis()
# 添加数据
result=redis_obj.set('name','小孩')
# 获取数据
result1=redis_obj.get('name')
print(result1)
except Exception as e:
print(e)
5.数据修改
如果键存在则进行修改,否则创建新数据
from redis import Redis
if __name__=='__main__':
try:
# host port db 等参数是可选项
redis_obj=Redis()
# 添加数据
result=redis_obj.set('name','小孩')
# 获取数据
result1=redis_obj.get('name')
# 数据修改
redis_obj.set('name','小黑猪')
result2 = redis_obj.get('name')
print(result2)
except Exception as e:
print(e)
6.数据删除
使用 delete 方法删除键值对,如果删除成功则返回受影响的键的数量,否则返回0
from redis import Redis
if __name__=='__main__':
try:
# host port db 等参数是可选项
redis_obj=Redis()
result = redis_obj.delete('name')
print(result)
except Exception as e:
print(e)
7.获取键
from redis import Redis
if __name__=='__main__':
try:
redis_obj = Redis()
result = redis_obj.keys()
print(result)
except Exception as e:
print(e)