一 概述
1.1 NoSQL
NoSql(Not Only Sql)意思是“不仅仅是SQL”,泛指非关系型数据库。
NoSql不依赖于业务逻辑的方式存储,而是以简单的Key-Value模式来存储。因此大大的增加了数据库的扩展能
力。不遵循SQL标准。不支持ACID。远超SQL的性能。
适用场景
- 对数据高并发的读写
- 海量数据的读写
- 对数据高扩展性的读写
不适应的场景
- 需要事务支持
基于sql的结构化查询存储,处理复杂的关系,需要即席查询(即是条件查询)
1.2 常见的NoSQL
1)Memcached
很早就出现了的NoSql数据库,数据都是存储在内存中的,一般不持久化,支持简单的key-value模式,一般是作为缓存数据库辅助持久化的数据库。
2)Redis
几乎覆盖了Memcached的绝大部分性能,数据都存储在内存中,支持持久化,主要是来作备份恢复;除了支持简单的key-value模式外,还支持多种数据结构的存储,比如:list,set,hash,zset等;一般也是作为缓存数据库辅助持久化数据
3)MongoDB
高性能,开源,模式自由的文档型数据库;数据都在内存中,如果内存不足,那么作为环形队列存储数据的mongodb会将头部的数据清除,再存储进来的数据;虽然是key-value模式,但是对于value提供把不常用的数据保存到硬盘,还有丰富的查询功能;支持二进制数据和大型对象,可以根据数据的特点代替RDBMS,成为独立的数据库,或者配合RDBMS使用二 Redis
作者是:Salvatore Sanfilippo
Redis 是一个开源的K-V存储系统,C语言编写的,遵守BSD协议,支持网络,可基于内存,可持久化的日志型,k-v数据库,提供各种编程语言的API。它支持的value类型相对更多,包括string(字符串),list(链表),set(集合),zset(sorted set 有序集合),hash(哈希类型)。这些数据类型都支持 push/pop,add/remove 及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,Redis支持各种不同方式的排序。和Memcached一样,为了保证效率,数据都是缓存在内存中的。区别是Redis会周期性的把更新的数据写入到磁盘中,或者把修改操作写入追加的记录文件,并且在此基础上实现master-slave(主从)同步。2.1 应用场景
配合关系型数据库做高速缓存
高频次,热门访问数据,降低数据库IO
- 分布式架构,做session共享
2)由于其拥有持久化能力,利用其多样性的数据结构存储特定的数据,如
1 | 最新的N个数据 | List实现,按照自然时间排序的数据 |
---|---|---|
2 | 排行榜,TopN | Zset实现 |
3 | 时效性的数据,如验证码 | expire设置过期时间 |
4 | 计数器,秒杀 | 原子性,自增 incr,decr |
5 | 去除大量数据中的重复数据 | set实现 |
6 | 构建队列 | List实现 |
7 | 发布订阅消息 | pub/sub模式 |
2.2 官网
1)Redis官方网站 http://Redis.io
2)Redis中文官方网站 http://www.Redis.net.cn
端口号来历:
端口号来自一位影星的名字 . Alessia Merz
Redis库:
1)Redis默认创建 16 个库,每个库对应一个下标,从0 开始,通过客户端连接之后,默认进入到0 号库,推荐只使用0 号库。
2)使用命令 select 库的下标,可以来切换数据库 ,比如:select 8
三 安装
3.1 安装步骤
在Linux下安装Redis,适用命令行安装单机版Redis
1)下载获取得到 redis-3.2.5.tar.gz 后将它放入到 Linux 的 opt 目录下
2)解压该文件:tar -zxvf redis-3.2.5.tar.gz
3)解压完成只会进入该目录 redis-3.2.5
4)在 redis-3.2.5 目录下执行 make 命令
注意:如果执行 make 命令出错,提示 gcc命令未找到,原因是当前的Linux环境中并没有安装gcc ,g++ 环境
5)安装gcc ,g++
①可以联网
yum install gcc
yum install gcc-c++
②不能上网:使用镜像文件安装
6)重新进入 redis-3.2.5 目录,执行make distclean ,然后再执行 make 命令
7)执行完 make 命令之后,可以跳过 redis test 步骤,直接执行 make install
3.2 常见命令
Linux下Redis的默认安装目录为:/usr/local/bin
1)redis-benchmark:性能测试工具,可以在自己本子上运行,看看自己的本子性能如何。
2)redis-check-aof:修复有问题的AOF 文件,rdb 和 aof 后面讲
3)redis-check-dump:修复有问题的 dump.rdb 文件
4)redis-sentinel:redis集群使用
5)redis-server:redis服务器启动命令
6)redis-cli:redis客户端,操作入口
3.3 Redis启动
1)默认启动的时候是前台方式启动
直接执行 redis-server 即可,启动后不能操作当前命令窗口
2)但是推荐使用后台方式启动
①拷贝一份 redis.conf 配置文件到其他目录,例如根目录下的 myredis 目录
②修改 redis.conf 文件的一项配置:daemonize 将 no 改成 yes,代表后台启动
③执行特定的配置文件启动:执行
redis-server /myredis/redis.conf
客户端访问:
1)使用 redis-cli 命令访问启动好的 redis
如果有多个 redis 同时启动,则需要指定端口号访问 :redis-cli -h 127.0.0.1 -p 6379
2)测试验证,通过 ping 命令,查看是否返回 pong
3.4 关闭Redis
1)单实例关闭
①如果还未通过客户端访问,直接:redis-cli shutdown
②如果已经进入了客户端,直接使用:shutdown
2)多实例关闭
指定端口关闭 redis-cli -p 端口号 shutdown:redis-cli -p 6379 shutdown
四 相关配置
redis的配置文件位于redis的安装目录下,文件名为 redis.conf 如果在Windows的环境下的话,配置文件名为:redis.window.conf
可以通过 config 命令来查看和设置配置项,命令如下:
redis 127.0.0.1:6379> CONFIG GET loglevel
1) "loglevel"
2) "notice"
4.1 redis.conf配置文件,config命令
当需要修改配置的时候,可以通过修改配置文件,或者是使用 config来修改
①修改完配置文件之后,重启redis,记得要指向该配置文件
②config命令来修改配置,如下:
redis 127.0.0.1:6379> CONFIG SET loglevel "notice"
OK
redis 127.0.0.1:6379> CONFIG GET loglevel
1) "loglevel"
2) "notice"
4.2 配置项说明
1)bind :绑定主机地址
bind 127.0.0.1
2)port :端口
port 6379
3)timeout:超时,当客户端闲置这么多秒后关闭连接
timeout 30
4)loglevel:日志级别,总共四个级别:debug,verbose,notice,warning。默认级别为notice
loglevel notice
5)requirepass :配置redis的登录密码,阿里云服务器上的redis不配密码,很容易被挖矿病毒入侵
requirepass 123456
其他配置详情可以查看此链接
4.3 相关配置
1)计量单位说明,大小写不敏感
2)include
类似jsp中的include,多实例的情况可以把公用的配置文件提取出来。
3)ip 地址的绑定 bind
①默认情况下 bind=127.0.0.1 只能接受本机的访问请求。
②不写的情况下,无限制接受任何ip 地址的访问。
③生产环境肯定要写应用服务器的地址。
④如果开启了 protected-mode,那么在没有设定 bind ip 且没有设置密码的情况下,Redis只允许接受本机的响应。
4)tcp-backlog
①可以理解为是一个请求到达后至接受进程处理前的队列。
②backlog 队列总和 = 未完成三次握手队列 + 已经完成三次握手队列
③高并发环境下,tcp-backlog 设置值跟超时时限内的 Redis 吞吐量决定
5)timeout
一个空闲的客户端维持多少秒回关闭,0为永不关闭。
6)tcp keepalive
对访问客户端的一种心跳检测,每个n秒检测一次,官方推荐设置为 60 秒
7)daemonize
是否为后台程序,no-为不是,yes-为是
8)pidfile
存放 pid 文件的位置,每个实例会产生一个不同的pid 文件
9)log level
四个级别 根据使用阶段来选择,生产环境选择notice 或者warning
10)log ?(待补充)
是否将Redis日志输送到linux系统日志服务中
11)syslog
是否将Redis日志输送到linux系统日志服务中
12)syslog-ident
日志的标志
13)syslog-facility
输出日志的设备
14)database
设定库的数量默认16
15)security
在命令行中设置密码
16)maxclient
最大客户端连接数
17)maxmemory
设置Redis可以使用的内存量。一旦到达内存使用上限,Redis将会试图移除内部数据,移除规则可以通过maxmemory-policy来指定。如果Redis无法根据移除规则来移除内存中的数据,或者设置了“不允许移除”,
那么Redis则会针对那些需要申请内存的指令返回错误信息,比如SET、LPUSH等。
18)Maxmemory-policy
- volatile-lru:使用LRU算法移除key,只对设置了过期时间的键
- allkeys-lru:使用LRU算法移除key
- volatile-random:在过期集合中移除随机的key,只对设置了过期时间的键
- allkeys-random:移除随机的key
- volatile-ttl:移除那些TTL值最小的key,即那些最近要过期的key
- noeviction:不进行移除。针对写操作,只是返回错误信息
19)Maxmemory-samples
设置样本数量,LRU算法和最小TTL算法都并非是精确的算法,而是估算值,所以你可以设置样本的大小。
一般设置3到7的数字,数值越小样本越不准确,但是性能消耗也越小。
4.4 禁用高危险命令
阿里云上容易测危
rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command CONFIG ""
rename-command KEYS ""
rename-command SHUTDOWN ""
rename-command DEL ""
rename-command EVAL ""
五 发布订阅
Redis中的发布订阅是一种消息通信模式:发送者发送消息,订阅者接收消息。
Redis的客户端可以订阅任意数量的频道。类似于消息中间件的实现
5.1 命令行实现
1)首先客户端 A 订阅频道 channel1
127.0.0.1:6379> subscribe channel1
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "channel1"
3) (integer) 1
1) "message"
2) "channel1"
2)客户端 B 发送消息
127.0.0.1:6379> publish channel1 halo
(integer) 1