Redis Remote Dictionary Server ,远程字典服务, 由意大利人 Salvatore Sanfilippo (又名 Antirez 开发, 是一个使用 ANSI C 语言 编写、支持网络、可基于 内存 亦可 持久化 的 日志型、 NoSQL 开源内存数据库 ,其提供多种语言的 API 。从 2010 年 3 月 15 日起, Redis 的开发工作由 VMware 主持。从2013 年 5 月开始, Redis 的开发由 Pivotal 赞助。
2008 年时 Salvatore Sanfilippo 自己开发一个叫 LLOOGG 的网站。
Redis 之所以称之为 字典服务,是因为 Redis 是一个 key-value
存储系统 。支持存储的 value
类型 有很多,包括 String
(字符串) 、 List
(链表) 、 Set
(集合) 、 Zset
(sorted set
有序集合) 和 Hash
(哈希类型) 等 。
Redis 的国际知名用户有, Twitter 、 GitHub 、 Facebook 等,国内知名用户有,阿里巴巴、腾讯、百度、搜狐、优酷、美团、小米等。熟练使用和运维 Redis 已经成为开发运维人员的一个必备技能。
⭐️ NoSQL
non relational
”, “Not Only SQL
”),泛指 非关系型的数据库。随着互联网 web2.0网站的兴起,传统的关系数据库在处理 web2.0 网站,特别是 超大规模 和 高并发 的 SNS
(社交) 类型的 web2. 0 纯动态网站 已经显得力不从心,出现了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。 NoSQL 数据库的产生就是为了解决 大规模数据集合 多重数据种类 带来的挑战,特别是大数据应用难题。(1) 键值存储数据库
Map
一样的 key-value
对。典型代表就是 Redis 。(2) 列存储数据库
(3) 文档型数据库
JSON
。(4) 图形(Graph)数据库
Redis 在生产中使用最多的场景就是 做数据缓存 。即客户端从 DBMS 中查询出的数据首先写入到 Redis 中,后续无论哪个客户端再需要访问该数据,直接读取 Redis 中的即可,不仅减小了 RT ,而且降低了 DBMS 的压力。
根据 Redis 缓存的数据与 DBMS 中数据的同步性划分,缓存一般可划分为两类: 实时同步缓存 与 阶段性同步缓存 。
生存时长
) 内与 DBMS 中的数据不完全一致。而这个时间段就是这个缓存数据的 过期时间。能够做缓存的技术、中间件很多,例如,MyBatis
自带的二级缓存、 Memched
等。只所以在生产中做缓存的产品几乎无一例外的会选择 Redis ,是因为它有很多其它产品所不具备的特性。
11w次/s
,写的速度可以达到 8w次/s
。只所以具有这么高的性能,因为以下几点原因:
RDB
与 AOF
。key-value
存储系统 。支持存储的 value
类型很多,包括 String
(字符串) 、 List
(链表) 、 Set
(集合) 、 Zset
(sorted set
有序集合) 和 Hash
(哈希类型)等,还有 BitMap
、 HyperLogLog
、 Geospatial
类型。
BitMap
:一般用于 大数据量 的 二值性统计 。HyperLogLog
:其是 Hyperlog Log
,用于对数据量超级庞大的日志做 去重统计。Geospatial
:地理空间,其主要用于地理位置相关的计算。Lua
脚本扩展功能。ACL,Access Control List ,访问控制列表,是一种 细粒度 的权限管理策略,可以针对 任意用户与组 进行权限控制。
- 目前大多数 Unix 系统与 Linux 2.6 版本已经支持 ACL 了。
- Zookeeper 早已支持 ACL 了。
- Unix与 Linux 系统默认使用是 UGO (User 、Group 、Other) 权限控制策略 ,其是一种 粗粒度 的权限管理策略。
Redis 客户端提交的各种请求是如何最终被 Redis 处理的?
⭐️ 1)、单线程模型
对于多路复用器的 多路复用技术 常见的有三种:
select
模型(数组)、poll
模型(链表)、epoll
模型。
select
模型底层是数组,性能较低,不常见。poll
模型的选择算法:采用的是轮询算法。该模型对客户端的就绪处理是 有延迟的 。epoll
模型的选择算法:采用的是回调方式。 根据就绪事件发生后的处理方式的不同,又可分为LT
模型与ET
模型。
socket
连接,并向 事件分发器 注册一个事件。一旦该事件发生就表明该连接已经就绪。而一旦连接就绪,事件分发器就会感知到,然后获取客户端通过该连接发送的请求,并将由该事件分发器所绑定的这个 唯一的线程 来处理。如果该线程还在处理多个任务,则将该任务写入到任务队列等待线程处理。⭐️ 2)、混合线程模型
rewrite
、对失效连接的清理等。⭐️ 3)、多线程模型
⭐️ 4)、优缺点总结 (面试)
(1) 单线程模型
内存的响应时长(RT): 100 n s 100ns 100ns
Redis 每秒处理的读写请求数量应该可以达到 1 s / 100 n s = 1 0 9 n s / 100 n s = 1 0 7 = 1 k w 1s/100ns = 10^9ns/100ns = 10^7 = 1kw 1s/100ns=109ns/100ns=107=1kw
实际情况是,Redis 每秒可以处理 8 w − 11 w 8w - 11w 8w−11w 的读写请求
(2) 多线程模型
这里是要将 Redis 安装到 Linux 系统中。
我的是 CentOS7,已经关闭防火墙,安装好了jdk,以及常用的命令工具。
⭐️ (2.1.1)、安装前的准备工作
1)、安装 gcc
gcc
与 gcc-c++
,而这两款编译器在 CentOS 7 中是没有安装的,所以首先要安装这两款编译器。yum -y install gcc gcc-c++
2)、下载 Redis
3)、上传到 Linux
⭐️ (2.1.2)、安装 Redis
1)、解压 Redis
/opt/apps
目录中。tar -zxvf redis-7.2.1.tar.gz -C /opt/apps/
/opt/apps
目录中 再将 Redis 解压包目录更名为 redis
(不更名也无所谓,改名是为了简化目录名)。mv redis-7.2.1/ redis
2)、编译
make
进行编译。如果没有准备好C语言编译环境,make 会报错 —
Jemalloc/jemalloc.h
:没有那个文件
解决办法:
- 首先看:
gcc
是否安装成功,成功后- 运行
make distclean
, 将编译文件清除掉,然后再在 redis 目录下再次执行make
命令(只是编译好)
3)、安装
make install
进行安装。redis 服务器
、客户端
与 一个性能测试工具 benchmark
。4)、查看 bin 目录
/usr/local/bin
目录,可以看到出现了很多的文件。echo $PATH
可以看到,/usr/local/bin
目录是存在于该 系统变量 中的, 这样这些命令就可以在任意目录中执行了。⭐️ (2.1.3)、Redis 启动与停止
1)、前台启动
redis-server
命令即可启动 Redis 。 这种启动方式会 占用当前命令行窗口。6379
。ps aux | grep redis
2)、命令式后台启动
nohup
命令,最后再添加一个 &
符,可以使要启动的程序在后台以守护进程方式运行。 nohup redis-server &
nohup.out
文件用于记录 Redis 的操作日志。3)、Redis 的停止
redis-cli shutdown
命令可以停止 Redis 。4)、配置式后台启动
nohup
命令可以使 Redis 后台启动,但每次都要键入 nohup
与 &
符,比较麻烦。redis.conf
达到后台启动的目的。redis.conf
文件在 Redis 的安装目录根下。daemonize
属性值由 no
改为 yes
,使 Redis 进程以守护进程方式运行。vim redis.conf
:set nu #显示行号
/daemonize #搜索daemonize
修改后再启动 Redis ,就无需再键入
nohup
与 符&
了,但必须要指定启动所使用的 Redis配置文件。 这是为什么呢?
- 使用
nohup redis-server &
命令启动 Redis 时,启动项中已经设置好了 Redis 各个参数的默认值, Redis 会按照这些设置的参数进行启动。但这些参数是可以在配置文件中进行修改的,修改后,需要在启动命令中指定要加载的配置文件,这样,配置文件中的参数值将覆盖原默认值。- Redis 已经给我们提供好了配置文件模板,是 Redis 安装目录的根目录下的
redis.conf
文件。由于刚刚对redis.conf
配置文件做了修改,所以在开启 Redis 时需要显示指出要加载的配置文件。配置文件应紧跟在redis-server
的后面。
redis-server /opt/apps/redis/redis.conf
ps aux | grep redis
⭐️ (2.2.1)、绑定客户端 IP
⭐️ (2.2.2)、关闭保护模式
#命令模式下输入
:noh #去掉搜索出来的黄标
⭐️ (2.2.3)、设置访问密码
1)、密码设置
redis.conf
配置文件中。默认是被注释掉的,没有密码。2)、使用密码
3)、注意
⭐️ (2.2.4)、禁止 / 重命名命令
flushal
与 flushdb
。
flushall 与 flushdb
命令。⭐️ (2.2.5)、启动 Redis
Redis 客户端也像 MySQL 客户端一样有多种类型:命令行
客户端、图形界面
客户端、 Java代码
客户端。
⭐️ (2.3.1)、命令行客户端
redis-cli
。-h
:指定要连接的 Redis 服务器的 IP 。-p
:指定要连接的 Redis 的 端口号。若连接的是本机Redis ,且端口号没有改变,保持默认的 6379
,则 -h
与 -p
选项可以省略不写。
⭐️ (2.3.2)、图形界面客户端
1)、Redis Desktop Manager
2)、RedisPlus
百度网盘链接:https://pan.baidu.com/s/1xnmm4TMuNd8eqslJ0rRm9A?pwd=e316
提取码:e316
⭐️ (2.3.3)、Java 代码客户端
jdbc-redis
、 jredis
等 ,但最常用也是最有名的是 Jedis
。redis.conf
在安装根目录下,默认包含 2000 多行。 这些内容根据功能被划分为了很多部分。下面将一些重要部分进行介绍。⭐️ (2.4.1)、基础说明
⭐️ (2.4.2)、includes
⭐️ (2.4.3)、modules
⭐️ (2.4.4)、network
⭐️ (2.4.5)、general
⭐️ (2.4.6)、security
⭐️ (2.4.7)、clients
⭐️ (2.4.8)、memory management
⭐️ (2.4.9)、threaded I/O