Redis之Redis入门
测试性能
redis-benchmark是一个压力测试工具,是官方自带的性能测试工具!
redis-benchmark命令参数:
图片来自于菜鸟教程
测试:
#测试:20个并发 1000个请求
redis-benchmark -h localhost -p 6379 -c 20 -n 1000
开启redis
[root@localhost ~]# cd /usr/local/bin
[root@localhost bin]# redis-server yconfig/redis.conf
[root@localhost bin]# redis-cli -p 6379
127.0.0.1:6379> ping
PONG
127.0.0.1:6379>
先确保redis进程启动
[root@localhost bin]# ps -ef|grep redis
root 4007 1 0 14:11 ? 00:00:00 redis-server 127.0.0.1:6379
root 4015 3849 0 14:11 pts/0 00:00:00 redis-cli -p 6379
root 4063 4032 0 14:13 pts/1 00:00:00 grep --color=auto redis
[root@localhost bin]#
结果:
分析:
基础的知识
redis默认有16个数据库
默认使用的是第0个数据库
可以使用select切换数据库
# 清除当前数据库的内容
[root@localhost bin]# redis-server yconfig/redis.conf
[root@localhost bin]# redis-cli -p 6379
127.0.0.1:6379> ping
PONG
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 zhangsan
OK
127.0.0.1:6379[3]> DBSIZE
(integer) 1
127.0.0.1:6379[3]> select 6
OK
127.0.0.1:6379[6]> get name
(nil)
127.0.0.1:6379[6]> DBSIZE
(integer) 0
127.0.0.1:6379[6]> select 3
OK
127.0.0.1:6379[3]> get name
"zhangsan"
127.0.0.1:6379[3]> keys *
1) "name"
127.0.0.1:6379[3]> flushdb # 清除当前数据库的内容
OK
127.0.0.1:6379[3]> keys *
(empty array)
127.0.0.1:6379[3]> select 0
OK
127.0.0.1:6379> keys *
1) "key:__rand_int__"
2) "myhash"
3) "mylist"
4) "counter:__rand_int__"
# 清除所有数据库的内容
127.0.0.1:6379> set name lisi
OK
127.0.0.1:6379> keys *
1) "key:__rand_int__"
2) "myhash"
3) "name"
4) "counter:__rand_int__"
5) "mylist"
127.0.0.1:6379> select 3
OK
127.0.0.1:6379[3]> get name
(nil)
127.0.0.1:6379[3]> keys *
(empty array)
127.0.0.1:6379[3]> flushall # 清除所有数据库的内容
OK
127.0.0.1:6379[3]> select 0
OK
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379>
redis是单线程的!
官方答案
因为Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了。
redis是用C语言编写的,官方提供的数据为100000+的QPS(每秒查询率(QPS,Queries-per-second)是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。)
redis为什么单线程还这么快?
误区
- 高性能的服务器一定是多线程的
- 多线程一定比单线程效率高
核心:
- 完全基于内存,绝大部分请求是纯粹的内存操作,非常快速。数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)
- 数据结构简单,对数据操作也简单,Redis中的数据结构是专门进行设计的;
- 采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗;
- 使用多路I/O复用模型,非阻塞IO;
- 使用底层模型不同,它们之间底层实现方式以及与客户端之间通信的应用协议不一样,Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求;
Redis-Key
[root@localhost bin]# cd /usr
[root@localhost usr]# cd local/
[root@localhost local]# cd bin/
[root@localhost bin]# ls
dump.rdb redis-check-aof redis-cli redis-server
redis-benchmark redis-check-rdb redis-sentinel yconfig
[root@localhost bin]# redis-server yconfig/redis.conf
[root@localhost bin]# redis-cli -p 6379
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> set name lisi
OK
127.0.0.1:6379> keys *
1) "name"
127.0.0.1:6379> set age 18
OK
127.0.0.1:6379> keys *
1) "age"
2) "name"
127.0.0.1:6379> exists name #是否存在name这个key
(integer) 1
127.0.0.1:6379> keys *
1) "age"
2) "name"
127.0.0.1:6379> exists name1 #是否存在name1这个key
(integer) 0
127.0.0.1:6379> move name 1 #将name移动到db1
(integer) 1
127.0.0.1:6379> keys *
1) "age"
127.0.0.1:6379> set name lisi
OK
127.0.0.1:6379> keys *
1) "age"
2) "name"
127.0.0.1:6379> get name
"lisi"
127.0.0.1:6379> expire name 10 #设置name的过期时间 ,单位是秒
(integer) 1
127.0.0.1:6379> ttl name #查看name过期时间
(integer) 6
127.0.0.1:6379> ttl name
(integer) 4
127.0.0.1:6379> ttl name
(integer) 3
127.0.0.1:6379> ttl name
(integer) 2
127.0.0.1:6379> ttl name
(integer) 1
127.0.0.1:6379> ttl name
(integer) 0
127.0.0.1:6379> ttl name
(integer) -2 #name < 0 name以过期
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379>
查看key的类型
127.0.0.1:6379> keys *
1) "age"
2) "name"
127.0.0.1:6379> type age
string
127.0.0.1:6379> type name
string
更多命令:查看官方文档(中文)