redis数据库

redis数据库

一、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

    • 官网下载:https://github.com/MicrosoftArchive/redis/releases

    • 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,就可以进入客户端连接

  • 本质:它是数据库,主要还是增删改查

  • 存储:以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
2
keys *  # 查看所有keys
keys a* # 查看以a开头的keys

过期时间

设置键的过期时间:

  • setex key(键名) time(过期时间) value(键值)
    • setex name 60 xiaoMing

      查看键的有效时间:

  • ttl key(键名)
    • ttl name
  • 在这里插入图片描述
  • 当integer为-2时,就是已经过期了
    • 过期的key查询时则不存在
    • 在这里插入图片描述
  • pttl key(键名):毫秒级显示有效时间
    • 在这里插入图片描述

设置键永久有效:

  • set key(键名) value(键值)
    • set age 16
    • 在这里插入图片描述
    • 默认-1,永久有效

String类型常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
set <key> <value>:添加一条数据 例如set k1 v1,添加key为k1,值为v1的数据

get <key>:得到某个key的数据,例如get k1,得到key为k1的值

append <key> <value>:将给定的value,追加到某key的原值的末尾,返回追加后的字符长度

strlen <key>:查询某key的值的长度

setnx <key> <value>:当key不存在的时候,才能添加成功,当key存在的时候,不能添加

incr <key>:将某个key的值,数字增加1,仅仅对数字起作用,如果为空,新增值为1

decr <key>:将某个key的值,数字减少1,仅仅对数字起作用,如果为空,新增值为-1

incrby/decrby <key> <步长>:将key中储存的数字值增减,自定义步长

mset <key1> <value1> <key2> <value2>:批量添加

mget <key1> <key2>:批量取值

msetnx <key1> <value1> <key2> <value2>:批量添加,当且仅当所有的key都不存在(因为原子性,一个失败则都失败)

getrange <key> <起始位置> <结束位置>:获取某个key值的范围,getrange k1 0 2,包含0位置的元素,和2位置的元素

setex <key> <过期时间> <value>:设置键值的同时设置过期时间(单位秒)

getset <key> <value>:设置新值,并返回旧值
  • 增(改):set key(键名) value(键值)
    • 在这里插入图片描述
    • 批量增(改):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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
lpush/rpush <key> <value1> <value2> <value3>:从左边,或者右边添加数据

lpop/rpop <key>:从左边,或者右边取出一个值,列表里这个值就不存在了

rpoplpush <key1> <key2>:从key1的右边取一个值,添加在key2的左边

lrange <key> <起始位置> <结束位置>:按照索引下角标得到元素(从左往右),0为起始位置,-1为范围结束索引

lindex <key> <index>:按照索引,从左往右获得对应的值

llen <key>:获得列表长度

linsert <key> before/after <value> <newVlaue>: 在某个key下的某个值的前面/后面添加一个新的值

lrem <key> <n> <value>:删除某个key下,删除n个值为value的数据

lset <key> <index> <value>:将某个key下的某个下角标的值换成给定的值

在这里插入图片描述

Hash类型常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
hset  <key> <field> <value>:给某个key哈希表中的field键复制为value

hget <key> <field> :得到某个key哈希表中某个field的值

hmset <key> <field1> <value1> <field2> <value2>:批量加数据

hexists <key> <field1>:某个key哈希表中某个field是否存在

hkeys <key> :查看某个key哈希表中的全部field

hvals <key>:查看某个key哈希表中的全部value

hincrby <key> <field> <increment>:为某个key的哈希表中的某个field键的值加上响应的增量

hsetnx <key> <field> <value>:某个key哈希表中的field键复制为value,当且仅当key不存在的时候成功

在这里插入图片描述

Set类型常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
sadd <key> <value1> <value2> <value3>:添加数据,如果值已经存在,忽略该值

smembers <key>:得到集合中所有的值

sismember <key> <value> :判断某个key中是否存在value,存在返回1,不存在返回0 scard <key>:返回集合的元素个数

srem <key> <value1> <value2>:删除某个key中的某些元素

spop <key>:从key中随机取出一个值,如果值没了,那么key就不在了

srandmember <key> <n>:从某个key中,取出n个值,不会从集合中删除

smove <key1> <key2> <value>:把集合中的一个值移动到另一个集合

sinter <key1> <key2>:取两个集合的交集

sunion <key1> <key2>:取两个集合的并集

sdiff <key1> <key2>:取两个集合的差集(在key1中的,不在key2中的)

在这里插入图片描述

ZSet类型常用命令

redis关于zset的常用命令:https://blog.csdn.net/qq_36777191/article/details/115557400

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
zadd  <key> <score1> <value1><score2> <value2>:添加以一个过着多个元素,score为评分,集合按照从低到高及进行排序,评分可以重复

zrange <key> <start> <end> \[withscores\]:查一定范围的元素,end为-1时,查询所有,withscores加上他,连着评分一起查出

zrangebyscore <key> <min> <max> \[withscores\]:查询score评分在某个范围内的数据,从小到大排序

zrevrangebyscore <key> <max> <min> \[withscores\]:查询score评分在某个范围内的数据,从大到小排序

zincrby <key> <increment> <value>:为元素的score加上指定的增量

zrem <key> <value>:删除数据

zcount <key> <min> <max>:统计score评分在某个范围内的数据的数量

zrank <key> <value>:返回集合中的排序,排序从0开始

在这里插入图片描述

五、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. 键值对操作

  1. 设置键值对
    可以使用 set 方法设置键值对:
1
r.set('mykey', 'myvalue')
  1. 获取键值对
    使用 get 方法获取键的值:
1
2
value = r.get('mykey')
print(value) # 输出 b'myvalue'
  1. 检查键是否存在
    使用 exists 方法检查键是否存在:
1
2
exists = r.exists('mykey')
print(exists) # 输出 True
  1. 删除键
    使用 delete 方法删除键:
1
2
deleted = r.delete('mykey')
print(deleted) # 输出 1
  1. 批量设置多个键值对
    mset命令用于同时设置多个键值对。

批量写入数据

1
2
3
4
5
6
data = {
'key1': 'value1',
'key2': 'value2',
'key3': 'value3'
}
r.mset(data)

6.批量获取多个键的值
mget命令用于同时获取多个键的值。

1
2
3
4
5
values = r.mget('key1', 'key2', 'key3')

# 或者
keys = ['key1', 'key2', 'key3']
values = r.mget(keys)

7.批量删除多个键
delete命令用于同时删除多个键。

1
r.delete('key1', 'key2', 'key3')

B. 哈希表操作

  1. 存储哈希表
    使用 hset 方法存储哈希表:
1
2
r.hset('myhash', 'field1', 'value1')
r.hset('myhash', 'field2', 'value2')
  1. 获取哈表中指定字段的值
    使用 hget 方法获取哈希表中指定字段的值:
1
2
field_value = r.hget('myhash', 'field1')
print(field_value) # 输出 b'value1'

3.删除哈希表

1
2
# 删除整个哈希表
r.delete('myhash')

4.获取哈希表的所有字段和值
使用 hgetall 方法获取哈希表的所有字段和值:

1
2
hash_data = r.hgetall('myhash')
print(hash_data) # 输出 {b'field1': b'value1', b'field2': b'value2'}

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. 列表操作

  1. 添加元素到列表
    使用 lpush 或 rpush 方法向列表的左侧或右侧添加元素:
1
2
r.lpush('mylist', 'value1')
r.rpush('mylist', 'value2')
1
2
3
4
# 批量添加元素到列表的右侧
r.rpush('mylist', 'element1', 'element2', 'element3')
# 批量添加元素到列表的左侧
r.lpush('mylist', 'element0', 'element-1', 'element-2')
  1. 获取列表元素
    使用 lrange 方法获取列表的指定范围元素:
1
2
list_data = r.lrange('mylist', 0, -1)
print(list_data) # 输出 [b'value1', b'value2']
  1. 获取列表长度
    使用 llen 方法获取列表的长度:
1
2
list_length = r.llen('mylist')
print(list_length) # 输出 2

D. 集合操作

  1. 添加元素到集合
    使用 sadd 方法向集合中添加元素:
1
2
3
4
5
r.sadd('myset', 'value1')
r.sadd('myset', 'value2')

# 批量添加元素到合集
r.sadd('myset', 'element1', 'element2', 'element3')
  1. 检查元素是否存在于集合中
    使用 sismember 方法检查元素是否存在于集合中:
1
2
is_member = r.sismember('myset', 'value1')
print(is_member) # 输出 True
  1. 获取集合的所有元素
    使用 smembers 方法获取集合的所有元素:
1
2
set_data = r.smembers('myset')
print(set_data) # 输出 {b'value1', b'value2'}

4.删除合集元素

1
2
3
4
5
# 删除单个元素
r.srem('myset', 'element3')

# 批量删除多个元素
r.srem('myset', 'element1', 'element5')

E. 有序集合操作

  1. 添加元素到有序集合
    使用 zadd 方法向有序集合中添加元素:
1
r.zadd('myzset', {'value1': 1, 'value2': 2})
  1. 获取有序集合的元素
    使用 zrange 方法获取有序集合的指定范围元素:
1
2
zset_data = r.zrange('myzset', 0, -1)
print(zset_data) # 输出 [b'value1', b'value2']
  1. 获取有序集合的长度
    使用 zcard 方法获取有序集合的长度:
1
2
zset_length = r.zcard('myzset')
print(zset_length) # 输出 2

F. 发布/订阅操作

  1. 发布消息
    使用 publish 方法发布消息到指定频道:
1
r.publish('mychannel', 'Hello, Redis!')
  1. 订阅消息
    使用 Redis 模块的 pubsub 类进行消息订阅:
1
2
3
4
5
pubsub = r.pubsub()
pubsub.subscribe('mychannel')

for message in pubsub.listen():
print(message)

高级功能和用例

A. 事务操作

Redis 支持事务操作,可以一次性执行多个命令,并保证这些命令的原子性。

1
2
3
4
5
6
7
8
9
10
11
12
13
# 开启事务
pipe = r.pipeline()

# 执行事务操作
pipe.set('key1', 'value1')
pipe.set('key2', 'value2')
pipe.get('key1')
pipe.get('key2')

# 提交事务
result = pipe.execute()

print(result) # 输出 [True, True, b'value1', b'value2']

B. 过期时间和持久化

Redis 支持设置键的过期时间,以及将数据持久化到磁盘。

1
2
3
4
5
6
7
8
9
# 设置键的过期时间(单位为秒)
r.setex('mykey', 60, 'myvalue')

# 获取键的剩余生存时间
ttl = r.ttl('key')
print(ttl) # 输出: 57,表示剩余的生存时间为 57 秒

# 持久化数据到磁盘
r.save()

C. 分布式锁

Redis 可以用作分布式锁的实现,确保在分布式环境下对共享资源的访问安全。

1
2
3
4
5
6
7
8
9
10
11
# 获取分布式锁
lock_acquired = r.set('mylock', 'locked', nx=True, ex=10)

if lock_acquired:
# 执行需要加锁的操作
print('Lock acquired. Performing critical section.')

# 释放锁
r.delete('mylock')
else:
print('Failed to acquire lock. Another process holds the lock.')

我们使用 Redis 的 set 方法来设置一个键值对作为分布式锁。参数nx=True表示只有当键不存在时才设置该键,即实现了原子性的加锁操作。参数ex=10设置了该键的过期时间为 10 秒,以防止锁被长时间占用。如果 lock_acquired 为 True,表示成功获取到了锁。在这种情况下,我们可以执行需要加锁的操作,然后使用 r.delete(‘mylock’) 释放锁,让其他进程有机会获取锁。如果 lock_acquired 为 False,表示获取锁失败,说明另一个进程已经持有了该锁。在这种情况下,我们可以执行相应的逻辑,比如等待一段时间后再尝试获取锁或执行备选方案。

需要注意的是,在释放锁之前,确保只有获取锁的进程能够删除该键。这可以通过在设置锁时为其设置一个唯一的标识符来实现,以便在释放锁时进行验证。

点击查看

本文标题:redis数据库

文章作者:Mango

发布时间:2023年08月31日 - 22:14:19

最后更新:2023年08月31日 - 22:16:24

原始链接:https://mango185.github.io/post/2636df6a.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

-------------------本文结束 感谢您的阅读-------------------