深入理解redis之特性简介与性能测试工具redis-benchmark

什么是redis

Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings)散列(hashes)列表(lists)集合(sets)有序集合(sorted sets) 与范围查询, bitmapshyperloglogs地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication)LUA脚本(Lua scripting)LRU驱动事件(LRU eviction)事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。

测试性能

​ redis-benchmark是一个压力测试工具,是官方自带的性能测试工具。

​ 使用方法:redis-benchmark [option] [option value]

redis 性能测试工具可选参数如下所示:

序号选项描述默认值
1-h指定服务器主机名127.0.0.1
2-p指定服务器端口6379
3-s指定服务器 socket
4-c指定并发连接数50
5-n指定请求数10000
6-d以字节的形式指定 SET/GET 值的数据大小2
7-k1=keep alive 0=reconnect1
8-rSET/GET/INCR 使用随机 key, SADD 使用随机值
9-P通过管道传输 请求1
10-q强制退出 redis。仅显示 query/sec 值
11–csv以 CSV 格式输出
12*-l*(L 的小写字母)生成循环,永久执行测试
13-t仅运行以逗号分隔的测试命令列表。
14*-I*(i 的大写字母)Idle 模式。仅打开 N 个 idle 连接并等待。

开始测试吧:

#测试 100个并发连接 100000个请求
redis-benchmark -h localhost -p 6379 -c 100 -n 100000
image-20210919200444222
入门知识

​ redis默认有16个数据库这一点可以在配置文件中找到

image-20210920185959908

默认使用的是第0个数据库,可以使用select命令来切换数据库。

//查看db大小
127.0.0.1:6379> dbsize
(integer) 4
//切换数据库
127.0.0.1:6379> select 3
OK
127.0.0.1:6379[3]> dbsize
(integer) 0

不同的数据库之间彼此相互独立

127.0.0.1:6379[3]> set name lingg
OK
127.0.0.1:6379[3]> dbsize
(integer) 1
127.0.0.1:6379[3]> get name
"lingg"
127.0.0.1:6379[3]> select 1
OK
127.0.0.1:6379[1]> get name
(nil)
127.0.0.1:6379[1]> 
redis是单线程的

为什么?

官方FAQ表示,因为Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了(毕竟采用多线程会有很多麻烦!)。

问题:为什么单线程还这么快?

  1. 基于内存操作:首先,传统数据库多线程慢的原因的I/O速度慢,而redis绝大部分操作都是在内存中进行的。
  2. 经过优化:redis本身的数据结构是专门设计的,数据结构简单,针对数据结构的操作也简单
  3. 减少开销:正是因为redis是单线程的,所以避免了多线程的cpu时间片轮换锁需要的上下文切换所需要的开销。不存在各种各样锁的问题,没有加锁和释放锁的操作。
  4. 多路复用I/O:使用linux的多路复用I/O模型中的epoll模型,非阻塞I/O模型。IO模型介绍请看这里
  5. 自建VM:底层实现方式以及与客户端通信的应用协议不一样,redis构建了自己的VM,因为通过系统调用调用系统函数的话存在一定的时间开销。

但是,我们使用单线程的方式是无法发挥多核CPU 性能,不过我们可以通过在单机开多个Redis 实例来完善!

核心:redis将所有的数据全部放在内存中的,所以说使用单线程去操作效率就是最高的,多线程(CPU上下文会切换:耗时),对于内存来说,如果没有上下文切换效率就是最高的,多次读写都使用同一个CPU,在内存情况下,单线程的效率就是最高的。
基础操作

查看所有的key :keys *

127.0.0.1:6379> keys *
1) "mylist"
2) "key:__rand_int__"
3) "myhash"
4) "counter:__rand_int__"

清空当前数据库 :flushdb

127.0.0.1:6379[3]> select 0
OK
127.0.0.1:6379> keys *
1) "mylist"
2) "key:__rand_int__"
3) "myhash"
4) "counter:__rand_int__"
127.0.0.1:6379> flushdb 
OK
127.0.0.1:6379> keys *
(empty array)

清除全部数据库:flushall

127.0.0.1:6379> select 0
OK
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> set name "lingg"
OK
127.0.0.1:6379> get name
"lingg"
127.0.0.1:6379> select 2
OK
127.0.0.1:6379[2]> flushall
OK
127.0.0.1:6379[2]> select 0
OK
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> 


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值