一、redis存储架构
- 客户端:连接服务器操作数据
- 服务端:存储数据
- 默认16个db,默认数据库db0
- 每个db都是独立的存储空间
- 存储数据类型
- String:基本数据类型,字符串
- List:列表
- Hash:字典
- Set:散列集合,无序
- ZSet:有序集合
二、redis和数据库的区别
redis | 数据库 | |
---|---|---|
数据存储 | 存在内存RAM中 读取快 存储代价大-内存价格昂贵 适合存储读取频率高,数据量小的高频数据 | 存在磁盘Dist中 读取慢 存储代价小-硬盘价格便宜 适合存储读取频率一般,数据量大的数据 |
三、redis安装
安装redis服务器,自带redis-cli客户端
Linus安装:
- yum install redis # 安装redis
- service redis start # 启动redis服务
- service redis stop # 停止redis服务
- 安装后配置文件所在路径:/etc/redis.conf
- 启动时,redis会占用端口6379
- netstart -apn | grep redis
- Linux的shell下面,直接运行redis-cli,就可以进入客户端连接
- redis-cli
windows安装:https://blog.csdn.net/Leewayah/article/details/129427599
zip文件解压
配置环境变量:将redis安装目录添加到path变量
进入redis安装目录,执行cmd命令安装服务:
redis-server –service-install redis.windows.conf – loglevel verbose
如果没有配置环境变量,redis-server后需要加.exe
- redis-server.exe –service-install redis.windows.conf – loglevel verbose
启动服务:需要使用管理员运行cmd或者powshell,下面两个命令均可:
- net start redis
- redis-server –service-start
停止服务:需要使用管理员运行cmd或者powshell,下面两个命令均可:
- net stop redis
- redis-server –service-stop
windows的shell下面,直接运行redis-cli,就可以进入客户端连接
- redis-cli
四、redis使用
redis-cli常用命令:https://blog.csdn.net/weixin_43702146/article/details/128577025
本质:它是数据库,主要还是增删改查
存储:以key:value键值对的形式存储
连接操作相关的命令
默认直接连接 远程连接-h 192.168.1.20 -p 6379
ping:测试连接是否存活如果正常会返回pong
echo:打印
select:切换到指定的数据库,数据库索引号 index 用数字值指定,以 0 作为起始索引值
quit:关闭连接(connection)
auth:简单密码认证
服务端相关命令
time:返回当前服务器时间
client list: 返回所有连接到服务器的客户端信息和统计数据 参见http://redisdoc.com/server/client_list.html
client kill ip:port:关闭地址为 ip:port 的客户端
save:将数据同步保存到磁盘
bgsave:将数据异步保存到磁盘
lastsave:返回上次成功将数据保存到磁盘的Unix时戳
shundown:将数据同步保存到磁盘,然后关闭服务
info:提供服务器的信息和统计
config resetstat:重置info命令中的某些统计数据
config get:获取配置文件信息
config set:动态地调整 Redis 服务器的配置(configuration)而无须重启,可以修改的配置参数可以使用命令 CONFIG GET * 来列出
config rewrite:Redis 服务器时所指定的 redis.conf 文件进行改写
monitor:实时转储收到的请求
slaveof:改变复制策略设置
发布订阅相关命令
psubscribe:订阅一个或多个符合给定模式的频道 例如psubscribe news.* tweet.*
publish:将信息 message 发送到指定的频道 channel 例如publish msg “good morning”
pubsub channels:列出当前的活跃频道 例如PUBSUB CHANNELS news.i*
pubsub numsub:返回给定频道的订阅者数量 例如PUBSUB NUMSUB news.it news.internet news.sport news.music
pubsub numpat:返回客户端订阅的所有模式的数量总和
punsubscribe:指示客户端退订所有给定模式。
subscribe:订阅给定的一个或多个频道的信息。例如 subscribe msg chat_room
unsubscribe:指示客户端退订给定的频道。
对KEY操作的命令
exists(key):确认一个key是否存在
del(key):删除一个key
type(key):返回值的类型
keys(pattern):返回满足给定pattern的所有key
randomkey:随机返回key空间的一个
keyrename(oldname, newname):重命名key
dbsize:返回当前数据库中key的数目
expire:设定一个key的活动时间(s)
ttl:获得一个key的活动时间
move(key, dbindex):移动当前数据库中的key到dbindex数据库
flushdb:删除当前选择数据库中的所有key
flushall:删除所有数据库中的所有key
info:查看redis信息
select index(index:db的序号,从0开始):切换db
keys *:查看当前db所有的键
1 | keys * # 查看所有keys |
过期时间
设置键的过期时间:
- setex key(键名) time(过期时间) value(键值)
- ttl key(键名)
- ttl name
- 当integer为-2时,就是已经过期了
- 过期的key查询时则不存在
- pttl key(键名):毫秒级显示有效时间
设置键永久有效:
- set key(键名) value(键值)
- set age 16
- 默认-1,永久有效
String类型常用命令
1 | set <key> <value>:添加一条数据 例如set k1 v1,添加key为k1,值为v1的数据 |
- 增(改):set key(键名) value(键值)
- 批量增(改):mset key(键名1) value(键值1) key(键名2) value(键值2) ……
- 批量增(改):mset key(键名1) value(键值1) key(键名2) value(键值2) ……
删:del key(键名)
- 批量删除多个键用空格隔开即可:del key(键名1) key(键名2) ……
查:get key(键名)
批量查询:mget key(键名1) key(键名2) ……
查询结果为nil:https://www.dbs724.com/289777.html
- 查询的键不存在:在查询Redis中的键时,如果该键不存在,则它将返回nil或一个空值(如果键不存在,则返回nil)
- Redis实例已离线:当Redis实例离线时,此时在Redis中查询键/值将会返回nil,因为所有值都无法提取
- 键正确,但值不正确:如果您正确输入了键来检索该值,但实际上Redis中没有该值,它将返回nil
- 客户端请求超时:如果客户端发送请求到Redis服务器并且Redis服务器无响应,则客户端将返回nil
- 脚本执行引起原因: 如果脚本执行出现异常(如数据格式不正确),则脚本将返回nil
- Redis的nil的返回可能是由于一些原因:键不存在,实例已离线,请求超时,脚本执行引起的异常等。 因此,使用Redis时,应特别留意它的返回值,并确保能正确处理nil的情况。
List类型常用命令
1 | lpush/rpush <key> <value1> <value2> <value3>:从左边,或者右边添加数据 |
Hash类型常用命令
1 | hset <key> <field> <value>:给某个key哈希表中的field键复制为value |
Set类型常用命令
1 | sadd <key> <value1> <value2> <value3>:添加数据,如果值已经存在,忽略该值 |
ZSet类型常用命令
redis关于zset的常用命令:https://blog.csdn.net/qq_36777191/article/details/115557400
1 | zadd <key> <score1> <value1><score2> <value2>:添加以一个过着多个元素,score为评分,集合按照从低到高及进行排序,评分可以重复 |
五、redis测试应用
- 验证码:存在有效时间
- 查看过期时间
- 过期前验证码是否可用
- 过期后验证码是否可用
六、redis自动化测试应用
- 验证码:存在有效时间
- 查看过期时间
- 过期前验证码是否可用
- 过期后验证码是否可用
Python之Redis操作:https://blog.csdn.net/qq233325332/article/details/131326274
安装 Redis 客户端库
首先,我们需要安装 Redis 客户端库。使用以下命令通过 pip 进行安装:
1 | pip install redis |
导入 Redis 模块
在 Python 脚本中,导入 Redis 模块以使用 Redis 客户端库的功能:
1 | import redis |
创建 Redis 客户端实例
使用 Redis 模块创建 Redis 客户端实例,用于与 Redis 服务器进行通信:
1 | r = redis.Redis(host='localhost', port=6379, db=0) |
指定密码
1 | r = redis.Redis(host='localhost', port=6379, db=0, password='your_password') |
数据操作
A. 键值对操作
- 设置键值对
可以使用 set 方法设置键值对:
1 | r.set('mykey', 'myvalue') |
- 获取键值对
使用 get 方法获取键的值:
1 | value = r.get('mykey') |
- 检查键是否存在
使用 exists 方法检查键是否存在:
1 | exists = r.exists('mykey') |
- 删除键
使用 delete 方法删除键:
1 | deleted = r.delete('mykey') |
- 批量设置多个键值对
mset命令用于同时设置多个键值对。
批量写入数据
1 | data = { |
6.批量获取多个键的值
mget命令用于同时获取多个键的值。
1 | values = r.mget('key1', 'key2', 'key3') |
7.批量删除多个键
delete命令用于同时删除多个键。
1 | r.delete('key1', 'key2', 'key3') |
B. 哈希表操作
- 存储哈希表
使用 hset 方法存储哈希表:
1 | r.hset('myhash', 'field1', 'value1') |
- 获取哈表中指定字段的值
使用 hget 方法获取哈希表中指定字段的值:
1 | field_value = r.hget('myhash', 'field1') |
3.删除哈希表
1 | # 删除整个哈希表 |
4.获取哈希表的所有字段和值
使用 hgetall 方法获取哈希表的所有字段和值:
1 | hash_data = r.hgetall('myhash') |
5.批量设置哈希表字段
hmset命令用于同时设置多个哈希表字段的值。
1 | r.hmset('myhash', {'field1': 'value1', 'field2': 'value2', 'field3': 'value3'}) |
6.批量获取哈希表字段的值
hmget 命令用于同时获取多个哈希表字段的值。
1 | values = r.hmget('myhash', 'field1', 'field2', 'field3') |
7.批量删除哈希表字段
hdel 命令用于同时删除多个哈希表字段。
1 | r.hdel('myhash', 'field1', 'field2', 'field3') |
C. 列表操作
- 添加元素到列表
使用 lpush 或 rpush 方法向列表的左侧或右侧添加元素:
1 | r.lpush('mylist', 'value1') |
1 | # 批量添加元素到列表的右侧 |
- 获取列表元素
使用 lrange 方法获取列表的指定范围元素:
1 | list_data = r.lrange('mylist', 0, -1) |
- 获取列表长度
使用 llen 方法获取列表的长度:
1 | list_length = r.llen('mylist') |
D. 集合操作
- 添加元素到集合
使用 sadd 方法向集合中添加元素:
1 | r.sadd('myset', 'value1') |
- 检查元素是否存在于集合中
使用 sismember 方法检查元素是否存在于集合中:
1 | is_member = r.sismember('myset', 'value1') |
- 获取集合的所有元素
使用 smembers 方法获取集合的所有元素:
1 | set_data = r.smembers('myset') |
4.删除合集元素
1 | # 删除单个元素 |
E. 有序集合操作
- 添加元素到有序集合
使用 zadd 方法向有序集合中添加元素:
1 | r.zadd('myzset', {'value1': 1, 'value2': 2}) |
- 获取有序集合的元素
使用 zrange 方法获取有序集合的指定范围元素:
1 | zset_data = r.zrange('myzset', 0, -1) |
- 获取有序集合的长度
使用 zcard 方法获取有序集合的长度:
1 | zset_length = r.zcard('myzset') |
F. 发布/订阅操作
- 发布消息
使用 publish 方法发布消息到指定频道:
1 | r.publish('mychannel', 'Hello, Redis!') |
- 订阅消息
使用 Redis 模块的 pubsub 类进行消息订阅:
1 | pubsub = r.pubsub() |
高级功能和用例
A. 事务操作
Redis 支持事务操作,可以一次性执行多个命令,并保证这些命令的原子性。
1 | # 开启事务 |
B. 过期时间和持久化
Redis 支持设置键的过期时间,以及将数据持久化到磁盘。
1 | # 设置键的过期时间(单位为秒) |
C. 分布式锁
Redis 可以用作分布式锁的实现,确保在分布式环境下对共享资源的访问安全。
1 | # 获取分布式锁 |
我们使用 Redis 的 set 方法来设置一个键值对作为分布式锁。参数nx=True表示只有当键不存在时才设置该键,即实现了原子性的加锁操作。参数ex=10设置了该键的过期时间为 10 秒,以防止锁被长时间占用。如果 lock_acquired 为 True,表示成功获取到了锁。在这种情况下,我们可以执行需要加锁的操作,然后使用 r.delete(‘mylock’) 释放锁,让其他进程有机会获取锁。如果 lock_acquired 为 False,表示获取锁失败,说明另一个进程已经持有了该锁。在这种情况下,我们可以执行相应的逻辑,比如等待一段时间后再尝试获取锁或执行备选方案。
需要注意的是,在释放锁之前,确保只有获取锁的进程能够删除该键。这可以通过在设置锁时为其设置一个唯一的标识符来实现,以便在释放锁时进行验证。