感谢狂神提供的学习资源!https://www.bilibili.com/video/BV1S54y1R7SB
概述
Redis是什么
Redis(Remote Dictionary Server ),即远程字典服务
是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
是当下最热门的NoSQL技术之一!
也被称为结构化数据库!
Redis可以做什么
-
内存存储+持久化(RDB+AOF)
-
效率高,可以用于高速缓存
-
发布订阅系统
-
地图信息分析
-
计时器、计数器(比如浏览量!)
…
特性
-
多样的数据类型
-
持久化
-
集群
-
事物
…
安装
-
下载源码,并复制到/opt
-
解压后make编译
-
进入/usr/local/bin查看
-
将默认conf复制到自定义的配置文件夹
以后就用这个配置文件启动redis
-
redis默认不是后台启动的,需要修改配置文件
-
启动redis-server,并使用redis-cli连接
-
关闭服务
-
配置为系统服务
-
进入/usr/lib/systemd/system/,创建redis.service
#表示基础信息 [Unit] #描述 Description=Redis #在哪个服务之后启动 After=syslog.target network.target remote-fs.target nss-lookup.target #表示服务信息 [Service] Type=forking #注意:需要和redis.conf配置文件中的信息一致 PIDFile=/var/run/redis_6379.pid #启动服务的命令 #redis-server安装的路径 和 redis.conf配置文件的路径 ExecStart=/usr/local/bin/redis-server /usr/local/bin/zyjconfig/redis.conf #重新加载命令 ExecReload=/bin/kill -s HUP $MAINPID #停止服务的命令 ExecStop=/bin/kill -s QUIT $MAINPID PrivateTmp=true #安装相关信息 [Install] #以哪种方式启动 WantedBy=multi-user.target #multi-user.target表明当系统以多用户方式(默认的运行级别)启动时,这个服务需要被自动运行。
-
使用systemctl daemon-reload重启服务
-
然后就可以用systemctl start redis.service 开启redis了
-
简单测试性能
测试参数如下:
简单测试一下:
# 测试:100个并发链接 每个并发10000个请求
redis-benchmark -p 6379 -c 100 -n 10000
如何查看分析:
- 10000个请求0.1s完成
- 100个并发客户端
- 每次写入3个字节
- keep alive = 1,只有一台服务器来处理请求,即单机测试
- 1毫秒内完成一个请求的处理,每秒处理了104166.66个请求
- RDB核心规则配置 save <指定时间间隔> <执行指定次数更新操作>,满足条件就将内存中的数据同步到硬盘中。官方出厂配置默认是 900秒内有1个更改,300秒内有10个更改以及60秒内有10000个更改,则将内存中的数据快照写入磁盘。
基础的知识
- redis默认有16个数据库
默认使用第0个数据库,可以通过select命令来切换数据库
-
常用的命令
set和get
127.0.0.1:6379> set name zyj #通过set创建键值对 OK 127.0.0.1:6379> get name #get取键的值 "zyj"
select和dbsize
127.0.0.1:6379> select 3 #切换数据库 OK 127.0.0.1:6379[3]> dbsize #查看数据库内容大小 (integer) 0
flushdb和flushall
127.0.0.1:6379> keys * #keys *查看当前数据库的键 1) "counter:{tag}:__rand_int__" 2) "myhash:{tag}" 3) "key:{tag}:__rand_int__" 4) "mylist:{tag}" 127.0.0.1:6379> flushdb #清空当前数据库 OK 127.0.0.1:6379> keys * (empty array) 127.0.0.1:6379> flushAll #清空所有数据库 OK
move和exists
127.0.0.1:6379> keys * 1) "name" 127.0.0.1:6379> move name 1 #move <key> <db> 将key移动到其他数据库 (integer) 1 127.0.0.1:6379> select 1 OK 127.0.0.1:6379[1]> keys * 1) "name" 127.0.0.1:6379[1]> exists name #exists <key> 查看当前库是否存在某个key (integer) 1
expire和ttl
127.0.0.1:6379[1]> keys * 1) "name" 2) "age" 127.0.0.1:6379[1]> expire name 10 #expire <key> <seconds> 设置键的存活时间 (integer) 1 127.0.0.1:6379[1]> ttl name #倒计时 ttl=time to live (integer) 7 127.0.0.1:6379[1]> ttl name (integer) 6 127.0.0.1:6379[1]> ttl name (integer) 5 127.0.0.1:6379[1]> ttl name (integer) 4 127.0.0.1:6379[1]> ttl name (integer) 3 127.0.0.1:6379[1]> ttl name (integer) 2 127.0.0.1:6379[1]> ttl name (integer) 1 127.0.0.1:6379[1]> ttl name (integer) 0 127.0.0.1:6379[1]> ttl name (integer) -2 127.0.0.1:6379[1]> get name (nil)
type
127.0.0.1:6379[1]> type age #type 查看key的类型 string
-
redis是单线程的
redis是基于内存实现的,cpu不是redis的性能瓶颈,redis的性能取决于机器的内存和网络的带宽,
既然能用单线程实现,那么就用单线程
为什么redis单线程还这么快?
- 误区1:高性能的服务器一定是多线程的?
- 误区2":多线程(CPU上下文会切换)一定比单线程高?
理解:redis是将所有的数据都放在内存中的,所以对于内存系统来说,单线程就是最有效率的,读写都在同一片CPU上;而多线程的话会产生CPU调度耗时,自然在内存系统中就没有单线程快。