高级测试都要懂的 redis 数据库操作

Redis 是一个远程内存数据库,主要用来提高软件的读写性能。 Redis 主要用来做处理缓存,但是他的作用远不止于此。

Redis 的应用场景

这是 Redis 最常被记住的一个应用场景,因为 Redis 数据是存在内存当中,效率非常高。 Memcache 也可以用来做缓存数据库,不过 Redis 因为丰富的数据类型,有些操作会比 Memcache 方便很多。

服务或者软件产品通常需要对用户行为进行跟踪和统计,便于后期进行数据统计和分析。想用户点击,转发,点赞等行为通常会被记录下来。 Redis 可以利用原子性的自增操作,轻松记录这行高频写入行为。

有时候为了缓解服务器压力,会对一些不必要的或者疯狂的用户行为进行限制。比如爬虫和限购的抢购活动。

我们在使用各种软件的时候经常会收到服务器推动给我们的消息,比如到货通知,内容更新等。这些消息通常是由服务端推送的。Redis 的 pub/sub 能够支持任务队列,但是并不能保证每条消息都能完成,如果需要更稳定精确的任务队列,可以使用 rabbitmq 等。

Redis 的有序集合类型非常适合处理榜单和排序。

Redis 的集合类型可以处理交集并集,筛选共同好友,共同爱好之类的一些操作。

Redis 的使用会遇到的问题

正因为 Redis 的性能如此卓越,很多公司都非常看重 Redis 的使用和优化。

做性能测试的可能会经常听过缓存的一些问题,比如缓存雪崩、缓存穿透、缓存击穿等。

这些都是由于在 Redis 这样的缓存数据库 key 设置或者过期时间设置不当造成的问题。

现在,无论是开发人员,还是测试人员,都应该接触下 Redis 的使用。

Redis 安装

windows 用户可以在 github 页面 下载解压。

解压后可以得到服务端和客户端的可执行文件。

image.png

在当前目录下运行 redis-server.exe 启动 Redis 服务,如果觉得麻烦可以配置环境变量。

redis001.jpg

当服务启动以后,可以通过 redis-cli.exe 启动客户端

redis002.jpg

如果你是使用编程语言操作 Redis ,可以下载对应语言的包,比如 python 的 Redis 客户端:


pip install redis

Redis 的使用和数据类型

Redis 当中的数据都是通过 key-value 的形式存储的, key 是在 Redis 数据库当中的标识,value 表示要存储的数据。

数据分为以下几种:

以下过程使用 python 存储一个字符串类型的数据,然后读取出来:


# 在 python 中导入 redis

In [1]: import redis

In [2]: r = redis.Redis()


# 设置一个字符串类型数据 user:1

In [3]: r.set('user:1', 'yuz')

Out[3]: True


# 获取字符串类型数据

In [4]: r.get('user:1')

Out[4]: b'yuz'


# 删除 user:1

In [5]: r.delete('user:1')

Out[5]: 1

Redis 的列表类型

list 的操作函数一般以 l 开头, 也有个别例外。 列表类型主要用于存储有序数据,比如任务队列。列表数据的操作有:


In [8]: r.lpush('user:1:hobbys', 'games')

Out[8]: 1


In [10]: r.lindex('user:1:hobbys', 0)

Out[10]: b'games'


In [11]: r.lpush('user:1:hobbys', 'music')

Out[11]: 2


In [12]: r.lrange('user:1:hobbys', 0,2)

Out[12]: [b'music', b'games']


In [14]: r.rpop('user:1:hobbys')

Out[14]: b'games'


In [15]: r.rpop('user:1:hobbys')

Out[15]: b'music'


In [16]: r.rpop('user:1:hobbys')

Redis 的集合类型

集合的操作函数一般以 s 开头, 集合数据是没有顺序的,但是不能重复而且可以很灵活的使用交集,并集操作。集合的基础操作 :


In [7]: r.sadd('users', 'yuz')

Out[7]: 1


In [8]: r.sadd('users', 'xiaojian')

Out[8]: 1


In [13]: r.sadd('users', 'yuz')

Out[13]: 0


In [9]: r.smembers('users')

Out[9]: {b'xiaojian', b'yuz'}


In [10]: r.sismember('users', 'xiaojian')

Out[10]: True


In [11]: r.sismember('users', 'musen')

Out[11]: False


In [14]: r.srem('users', 'xiaojian')

Out[14]: 1


Redis 的 hash 类型

hash 和 python 中的字典很像,主要用来存储多个键值对的映射。因为 Redis 本身就是使用键值对形式存储数据,所以 hash 可以理解成是 Redis 的子应用,可以对其中的任何数字值进行自增操作。hash 的操作函数一般以 h 开头, :


In [16]: r.hset('user:1', 'name', 'yuz')

Out[16]: 1


In [17]: r.hset('user:1', 'age', 18)

Out[17]: 1


In [18]: r.hget('user:1', 'name')

Out[18]: b'yuz'


In [19]: r.hgetall('user:1')

Out[19]: {b'name': b'yuz', b'age': b'18'}


In [20]: r.hdel('user:1', 'age')

Out[20]: 1



Redis 的有序集合类型(sorted set)

有序集合既可以像列表那样通过索引获取,也可以像 hash 通过 key 获取。

有序集合的 key 叫成员(member), value 叫分值(score)。 key 不能重复,value 必须为浮点数。

sorted set 的操作函数一般以 z 开头, :


In [27]: r.zadd('ages', {'yuz': 19, 'xiaojian': 18})

Out[27]: 2


In [29]: r.zrange('ages', 0, 2)

Out[29]: [b'xiaojian', b'yuz']



In [32]: r.zrangebyscore('ages', 0, 90)

Out[32]: [b'xiaojian', b'yuz']


In [36]: r.zrange('ages', 0, 2, withscores=True)

Out[36]: [(b'xiaojian', 18.0), (b'yuz', 19.0)]


In [43]: r.zrem('ages', 'yuz')

Out[43]: 1


回帖
请输入回帖内容 ...