初始Redis
-
REmote DIctionary Server(Redis) 是一个由 Salvatore Sanfilippo 写的 key-value 存储系统,是跨平台的非关系型数据库。
-
Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库,并提供多种语言的 API。
-
Redis 通常被称为数据结构服务器,因为值(value)可以是字符串(String)、哈希(Hash)、列表(list)、集合(sets)和有序集合(sorted sets)等类型。
推荐一篇介绍redis的博客:通俗易懂的redis介绍
Redis安装(Linux系统下)
安装
- 去官网下载Redis安装包
- 移动安装包到opt目录
sudo mv redis-6.2.2.tar.gz /opt
复制代码
- 解压Redis安装包
sudo tar -zxvf redis-6.2.2.tar.gz
复制代码
- 进入解压后的Redis文件,查看Redis的配置文件
cd redis-6.2.2
ls
复制代码
- 安装基本环境命令(安装gcc),并检查是否安装成功
yum install gcc-c++
gcc -v
复制代码
- 预编译和编译安装
make #预编译
make install #编译安装
复制代码
- 又因为Redis的默认安装目录在
/usr/local/bin
,进入这个目录,创建一个文件夹myconfig
sudo mkdir myconfig
复制代码
- 复制Redis的配置文件到
myconfig
sudo cp /opt/redis-6.2.2 /redis.conf myconfig
复制代码
- 修改redis.conf配置,让Redis能在后台启动(Redis默认在后台不启动)
vim redis.conf
复制代码
使用测试
- 通过指定的配置文件启动服务
redis-server myconfig/redis.conf
复制代码
- 客户端访问
redis-cli -p 6379
复制代码
- 通过
ping
测试连接
- 通过
set 属性名 属性值
存值 - 通过
get 属性名
取值
- 检查Redis进程是否开启
ps -ef|grep redis
复制代码
- 关闭Redis服务
shutdown
exit
ps -ef|grep redis #再次查看,确认关闭
复制代码
安装出现了bug
–>bug解决:借鉴这篇博客即可
性能测试 redis-benchmark
- 该命令是在 redis 的目录下执行的,而不是 redis 客户端的内部指令
- 性能测试工具参数
- 实例测试
- 测试内容:100个并发处理10万个请求
- 开启服务后,在终端输入
redis-benchmark -c 100 -n 100000
基础知识
- redis默认装有16个数据库,默认使用0号数据库
- 往数据库设值,取值
- 查询数据库所有的值
keys *
- 转换数据库
select 想转换到的数据库
- 删除数据库中的值
flushdb
清空当前数据库
flushall
清空所有数据库
课外补充
redis是单线程的:
使用Redis时,几乎不存在CPU成为瓶颈的情况, Redis主要受限于内存和网络。例如在一个普通的Linux系统上,Redis通过使用pipelining每秒可以处理100万个请求,所以如果应用程序主要使用O(N)或O(log(N))的命令,它几乎不会占用太多CPU。
- 其实redis是基于内存操作,redis是将所有的数据全部放在内存中的。
- 使用了单线程后,可维护性高。
- 多线程模型虽然在某些方面表现优异,但是它却引入了程序执行顺序的不确定性,带来了并发读写的一系列问题,增加了系统复杂度、同时可能存在线程切换、甚至加锁解锁、死锁造成的性能损耗。
- Redis通过AE事件模型以及IO多路复用等技术,处理性能非常高,因此没有必要使用多线程。单线程机制使得 Redis 内部实现的复杂度大大降低,Hash 的惰性 Rehash、Lpush 等等 “线程不安全” 的命令都可以无锁进行。
redis6.0之后引入了多线程
原因:
-
Redis将所有数据放在内存中,内存的响应时长大约为100纳秒,对于小数据包,Redis服务器可以处理80,000到100,000 QPS,这也是Redis处理的极限了,对于80%的公司来说,单线程的Redis已经足够使用了。
-
20%的公司,有着越来越复杂的业务场景,可能需要上亿的交易量,因此需要更大的QPS。
-
使用多线程可以充分利用服务器 CPU 资源,目前主线程只能利用一个核
-
多线程任务可以分摊 Redis 同步 IO 读写负荷
虽然redis引入了多线程,但是默认是关闭的。
这里也提供一篇介绍多线程默认初始化参数的博客。