1.1 NoSQL
NoSQL(“non-relational”, “Not Only SQL”),泛指非关系型的数据库。
- 键值存储数据库 : 就像 Map 一样的 key-value 对。如Redis
- 文档数据库 : NoSQL 与关系型数据的结合,最像关系型数据库的 NoSQL 。 如MongoDB
1.2 Redis的用途
Redis 在生产中使用最多的场景就是做数据缓存。即客户端从 DBMS 中查询出的数据首先写入到 Redis 中,后续无论哪个客户端再需要访问该数据,直接读取 Redis 中的即可,不仅减小了响应时间 RT,而且降低了 DBMS 的压力。
根据 Redis 缓存的数据与 DBMS 中数据的同步性划分,缓存一般可划分为两类:实时同步缓存,与阶段性同步缓存。
实时同步缓存是指,DBMS 中数据更新后,Redis 缓存中的存放的相关数据会被立即清除,于是乎,若再有对该数据的访问请求到来时,必须先从 DBMS 中查询获取到最新数据,然后再写入到 Redis。
阶段性同步缓存是指,Redis 缓存中的数据允许在一段时间内与 DBMS 中的数据不完全一致。而这个时间段就是这个缓存数据的过期时间。
1.3 Redis特性
- 持久化:Redis 内存中的数据可以进行持久化,其有两种方式:RDB(全量备份) 与 AOF。
- 高可用集群:Redis 提供了高可用的主从集群功能,可以确保系统的安全性。
- 丰富的数据类型:Redis 是一个 key-value 存储系统。支持存储的 value 类型很多,包括String(字符串)、List(链表)、Set(集合)、Zset(sorted set --有序集合)和 Hash(哈希类型)等,还有 BitMap、HyperLogLog、Geospatial 类型。
a. BitMap:一般用于大数据量的二值性统计。
b. HyperLogLog:其是 Hyperlog Log,用于对数据量超级庞大的日志做去重统计。
c. Geospatial:地理空间,其主要用于地理位置相关的计算。 - 强大的功能:Redis 提供了数据过期功能、发布/订阅功能、简单事务功能,还支持 Lua脚本扩展功能。
- 客户端语言广泛:Redis 提供了简单的 TCP 通信协议,编程语言可以方便地的接入 Redis。所以,有很多的开源社区、大公司等开发出了很多语言的 Redis 客户端。
- 支持 ACL 权限控制:之前的权限控制非常笨拙。从 Redis6 开始引入了 ACL 模块,可以为不同用户定制不同的用户权限。
ACL,Access Control List,访问控制列表,是一种细粒度的权限管理策略,可以针对任意用户与组进行权限控制。目前大多数 Unix 系统与 Linux 2.6 版本已经支持 ACL 了。 Zookeeper 早已支持 ACL 了。
Unix 与 Linux 系统默认使用是 UGO(User、Group、Other)权限控制策略,其是一种粗粒度的权限管理策略。 - 支持多线程 IO 模型:Redis 之前版本采用的是单线程模型,从 6.0 版本开始支持了多线程模型。
1.4 Redis的IO模型
Redis服务器处理客户端请求所采用的处理架构,称为 Redis 的 IO 模型。不同版本的 Redis 采用的 IO 模型是不同的。对于Redis 6之后的版本,采用多线程模型。
单线程的性能较高
- Redis6引入了多线程机制,但是不是说有多个worker线程同时并发读写, 而是它有 “一个
worker线程+多个IO子线程”,其实就是在 IO 就绪之后使用多线程提升读写解析数据的效率,而在 操作内存数据的时候还是用单线程,以在提高性能的同时避免读写安全问题。 - 同时,这种机制同样不会产生线程安全问题,因为Redis在针对数据的内存操作时,是在一个公共的worker队列中实现的,先进先出,所以不会有线程安全问题。
- 简单来说,就是 “请求是多线程的,但核心的内存读写操作(或者说读写计算)仍然是单线程的”。
2 下载Redis
2.1 下载gcc
由于 Redis 是由 C/C++语言编写的,而从官网下载的 Redis 安装包是需要编译后才可安装的,所以对其进行编译就必须要使用相关编译器。对于 C/C++语言的编译器,使用最多的是gcc 与 gcc-c++,而这两款编译器在 CentOS7 中是没有安装的,本次首先安装这两款编译器。尽管gcc包含了gcc-c++,但我们安装时仍指定后者,避免不必要的麻烦。
yum -y install gcc gcc-c++
安装完成检查版本
gcc -v
2.2 下载Redis
2.2.1 win中下载导入虚拟机
- 在win中进入redis官网,本次下载7.0.15,即7.0的最后一个小版本
- 回到mobax
新建一个文件夹,位置是/opt/tools.
工具左端, 图形化的形式列出了各个linux中的文件(夹)
进入/opt/tools
选择第三个图标进行上传, 将win中的redis压缩包上传.
如果上传失败并提示权限不足, ls -l查看权限,只要不是rwxrwxrwx, 就是权限不够
chmod -R 777 tools ,给足权限.即可上传成功
2.2.2 解压并更名
在tools下新建一个apps文件夹, 然后
tar -zxvf redis-7.0.15.tar.gz -C /opt/apps
再将该文件换一个简单的名字
2.2.3 编译与安装
编译过程是根据 Makefile 文件进行的,而 Redis 解压包中已经存在该文件了。所以可以直接进行编译了。
编译完成后再安装
这些命令已经写入了系统变量, 可以在任何目录下直接使用.
2.3 三种方式启动和停止Redis
2.3.1 前台启动Redis
- Redis的默认端口是6379
- 前台启动会占用一个终端窗口
此时Redis控制终端等待接受连接,无法输入其他命令 - 用ctl+C可以终止
2.3.2 命令式后台启动Redis
缺点是
- 每次都要键入 nohup 与&符,比较麻烦
- 运行会在运行目录多出一个nohup.out文件,增加垃圾
- 用redis-cli shutdown可以终止进程。
2.3.3 配置式后台启动Redis
通过修改 Linux 中 Redis 的核心配置文件 redis.conf 达到后台启动的目的。redis.conf 文件在Redis 的安装目录根下。
vim编辑redis.conf,将 daemonize 属性值由 no 改为 yes,使 Redis 进程以守护进程方式运行。
此时启动命令为
redis-server redis.conf
启动服务后,每次执行以下命令,即可开始对数据库进行操作。
2.4 使用客户端连接Redis之前的配置
Redis 是一个内存数据库服务器,就像 MySQL 一样,对其操作也需要通过客户端进行。
若要使远程主机上的客户端能够连接并访问到服务端的 Redis,则服务端首先要做如下配置。
2.4.1 确定客户端IP
Redis 可以通过修改配置文件来限定可以访问自己的客户端 IP。
在redis.conf中,默认是:
bind 127.0.0.1 -::1
代表着只允许当前主机访问。这当然不好,我们要使用ssh远程访问。故将这句话注释掉,这样,所有人都能访问本Redis服务器。
2.4.2 关闭保护模式
默认保护模式是开启的。其只允许本机的客户端访问,即只允许自己访问自己。但生产中应该关闭,以确保其它客户端可以连接 Redis。
将protected-mode 属性由yes改为no
2.4.3 设置访问密码
为 Redis 设置访问密码,可以对要读/写 Redis 的用户进行身份验证。没有密码的用户可以登录 Redis,但无法访问。
访问密码的设置requirepass位置大概在45%的位置。默认是被注释掉的,没有密码。现在改为需要111
requirepass 111
2.4.4 使用密码的两种方式
对于密码的使用,有两种方式:登录时未使用密码,则访问时先输入密码;登录时直接使用密码登录,访问时无需再输入密码。
a.登陆时未使用密码:每次redis-cli之后,第一条操作命令之前,都要使用指令输入密码:
b.登陆时直接使用密码:今后所有操作不需要密码:
2.4.5 关闭Redis的另一种方式
在设置了密码并且没有使用密码登录的情况下
-
若在普通的命令行模式,使用redis-cli -a 密码 shutdown可以直接关闭
-
若使用了redis-cli进入了操作模式,先用 auth 密码鉴权,然后shutdown结束操作模式,quit退出到linux命令行
因此,为了后续学习方便,把配置文件中的requirepass注释掉,不需要密码。
2.5 Redis自动启动
如果不自动启动,每次都要跑到conf所在地方(或输命令时手动指定),才能以配置文件方式启动,
在/etc/rc.d/init.d下新建redis.sh
#!bin/sh
#chkconfig: 2345 80 90
#Description:auto_run/usr/local/bin/redis-server /opt/apps/redis715/redis.conf
#要注意,看看usr/local/bin下有没有redis-server这个东西,没有的话就把地址改去redis下的redis-server
给该文件增加权限 chmod 777 redis.sh
然后sh redis.sh, 即可执行该脚本,执行后redis会开启, 可以用ps -ef|grep redis检查是否正在执行
.
最后, chkconfig redis.sh on ,即可实现开机自启动.
疑问点, 网络上还存在着一个复杂脚本,不清楚两者实现效果有何不同:
#!/bin/sh
# chkconfig: 2345 80 90
# description: Redis is a persistent key-value databaseREDISPORT=6379
EXEC=/usr/local/redis/bin/redis-server
CLIEXEC=/usr/local/redis/bin/redis-cliPIDFILE=/var/run/redis_${REDISPORT}.pid
CONF="/usr/local/redis/redis.conf"case "$1" instart)if [ -f $PIDFILE ]thenecho "$PIDFILE exists, process is already running or crashed"elseecho "Starting Redis server..."$EXEC $CONF &fi;;stop)if [ ! -f $PIDFILE ]thenecho "$PIDFILE does not exist, process is not running"elsePID=$(cat $PIDFILE)echo "Stopping ..."$CLIEXEC -p $REDISPORT shutdownwhile [ -x /proc/${PID} ]doecho "Waiting for Redis to shutdown ..."sleep 1doneecho "Redis stopped"fi;;restart)"$0" stopsleep 3"$0" start;;*)echo "Please use start or stop or restart as first argument";;
esac
2.6 Redis客户端
2.5.1 命令行客户端
Redis 提供了基本的命令行客户端。打开命令行客户端的命令为 redis-cli。
并且可以附带两个参数:
- -h:指定要连接的 Redis 服务器的 IP。
- -p:指定要连接的 Redis 的端口号。
- 若连接的是本机 Redis,且端口号没有改变,保持默认的 6379,则-h 与-p 选项可以省略不写。
2.5.2 图形化客户端
这里选择Another Redis Destop Manger
https://gitee.com/qishibo/AnotherRedisDesktopManager/releases
在虚拟机中插入一个简单键值对:
set name sunsplanter
即可在ARDM中看到插入的数据