目录
redis数据库介绍
一、关系数据库与非关系型数据库
1、关系型数据库
-
关系型数据库是一个结构化的数据库,创建在关系模型基础上,一般面向于记录。它借 助于集合代数等数学概念和方法来处理数据库中的数据,。关系模型就是指二维表格模型, 因而一个关系型数据库就是由二维表及其之间的联系组成的一个数据组织。现实世界中,各 种实体与实体之间的各种联系都可以用关系模型来表示。SQL 语句(标准数据查询语言)就 是一种基于关系型数据库的语言,用于执行对关系型数据库中数据的检索和操作。
-
主流的关系型数据库包括 Oracle、MySQL、SQL Server、Microsoft Access、DB2 等等
2、非关系型数据库
-
NoSQL(NoSQL = Not Only SQL ),意思是“不仅仅是 SQL”,是非关系型数据库的总称。 主流的 NoSQL 数据库有 Redis、MongBD、Hbase、CouhDB 等等,以上这些数据库,他们的存 储方式、存储结构以及使用的场景都是完全不同的。所以我们认为它是一个非关系型数据库 的集合,而不是像关系型数据库一样,是一个统称。换言之,除了主流的关系型数据库以外 的数据库,都认为是非关系型的。NoSQL 数据库凭借着其非关系型、分布式、开源和横向扩 展等优势,被认为是下一代数据库产品
二、Redis基础
1、Redis 简介
-
Redis(RemoteDictionaryServer,远程字典型)是一个开源的、使用 C 语言编写的 NoSQL 数据库。Redis 基于内存运行并支持持久化,采用 key-value(键值对)的存储形式,是目 前分布式架构中不可或缺的一环。
-
Redis 服务器程序是单进程模型,也就是在一台服务器上可以同时启动多个 Redis 进程, 而 Redis 的实际处理速度则是完全依靠于主进程的执行效率。若在服务器上只运行一个 Redis 进程,当多个客户端同时访问时,服务器的处理能力是会有一定程度的下降;若在同 一台服务器上开启多个 Redis 进程,Redis 会提高并发处理能力的同时会给服务器的 CPU 造 成很大压力。也就是说在实际生产环境中,需要根据实际的需求来决定开启多少个 Redis 进程。若对高并发要求更高一些,可能会考虑在同一台服务器上开启多个进程;若 CPU 资源 比较紧张,采用单进程即可。
2、优点
-
具有极高的数据读写速度,数据读取的速度最高可达到 110000 次/s,数据写入速 度最高可达到 81000 次/s。
-
支持丰富的数据类型,不仅仅支持简单的 key-value 类型的数据,还支持 Strings, Lists, Hashes, Sets 及 Ordered Sets 等数据类型操作。
-
支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载 进行使用。
-
原子性,Redis 所有操作都是原子性的。
-
支持数据备份,即 master-salve 模式的数据备份。
Redis 作为基于内存运行的数据库,缓存是其最常应用的场景之一,除此之外,Redis 常见应用场景还包括:获取最新 N 个数据的操作、排行榜类应用、计数器应用、存储关系、 实时分析系统、日志记录。
Redis数据库安装
一、Redis 安装部署
1、官网
-
Redis 官网(https://www.redis.io)/) 下载相应的源码软件包
2、这里采用源码安装
[root@localhost src]# tar xvzf redis-4.0.9.tar.gz
[root@localhost src]# cd redis-4.0.9/
[root@localhost redis-4.0.9]# make
[root@localhost redis-4.0.9]# make PREFIX=/usr/local/redis install
[root@localhost ~]# ln -s /usr/local/redis/bin/* /usr/local/bin/
[root@localhost redis-4.0.9]#cd /usr/src/redis-4.0.9/utils/
[root@localhost utils]# ./install_server.sh
Welcome to the redis service installer
This script will help you easily set up a running redis server
Please select the redis port for this instance: [6379]
Selecting default: 6379
Please select the redis config file name [/etc/redis/6379.conf]
Selected default - /etc/redis/6379.conf
Please select the redis log file name [/var/log/redis_6379.log]
Selected default - /var/log/redis_6379.log
Please select the data directory for this instance [/var/lib/redis/6379]
Selected default - /var/lib/redis/6379
Please select the redis executable path [] /usr/local/redis/bin/redis-server // 需要手动输入
Selected config:
Port : 6379
Config file : /etc/redis/6379.conf //配置文件路径
Log file : /var/log/redis_6379.log //日志文件路径
Data dir : /var/lib/redis/6379 //数据文件路径
Executable : /usr/local/redis/bin/redis-server //可执行文件路径
Cli Executable : /usr/local/redis/bin/redis-cli //客户端命令行工具
Is this ok? Then press ENTER to go on or Ctrl-C to abort.
Copied /tmp/6379.conf => /etc/init.d/redis_6379
Installing service...
Successfully added to chkconfig!
Successfully added to runlevels 345!
Starting Redis server...
Installation successful!
[root@localhost utils]# netstat -lnupt | grep redis
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN
5494/redis-server 1
[root@localhost ~]#/etc/init.d/redis_6379 stop
Stopping ...
Redis stopped
[root@localhost ~]#/etc/init.d/redis_6379 start
Starting Redis server...
[root@localhost ~]#/etc/init.d/redis_6379 restart
Stopping ...
Redis stopped
Starting Redis server...
[root@localhost ~]#/etc/init.d/redis_6379 status
Redis is running (28894)
3、配置参数
-
Redis 主配置文件为/etc/redis/6379.conf,由注释行与设置行两部分组成。与大多数 Linux 配置文件一样,注释性的文字以“#”开始,包含了对相关配置内容进行的说明和解释。除了注释行与空行以外的内容即为设置行
-
例如
[root@localhost ~]#vim /etc/redis/6379.conf bind 127.0.0.1 192.168.10.161 //监听的主机地址 port 6379 //端口 daemonize yes //启用守护进程 pidfile /var/run/redis_6379.pid //指定 PID 文件 loglevel notice //日志级别 logfile /var/log/redis_6379.log //指定日志文件
-
其他参数
参数 | 作用 |
---|---|
timeout 300 | 当客户端闲置多长时间后关闭连接,如果指定为 0,表示关闭该功能 |
dbfilename dump.rdb | 指定本地数据库文件名,默认值为 dump.rdb |
dir /var/lib/redis/6379 | 指定本地数据库存放目录 |
maxclients 10000 | 设置同一时间最大客户端连接数,默认为 10000, Redis 可以同时打开的客户端连接数为 Redis 进程可以打开的最大文件描述符数, 如果设置 maxclients 0,表示不限制。 当客户端连接数到达限制时, Redis 会关闭新的连接并向客户端返回 max number of clients reached 错误信息 |
rdbcompression yes | |
slaveof <masterip><masterport> | 设置当本机为 slav 从服务器时,设置 maste 服务的 IP 地址及端口, 在 Redis 启动时,它会自动从 master 进行数据同步 |
masterauth <master-password> | 当 master 服务设置了密码保护时,slav 服务连接 master的密码 |
requirepass foobared | 设置 Redis 连接密码,如果配置了连接密码, 客户端在连接 Redis 时需要通过 AUTH <password> 命令提供密码,默认关闭 |
maxmemory <bytes> | 指定 Redis 最大内存限制,Redis 在启动时会把数据加载到内存中, 达到最大内存后,Redis 会先尝试清除已到期或即将到期的 Key, 当此方法处理后,仍然到达最大内存设置,将无法再进行写入操作, 但仍然可以进行读取操作。Redis 新的 vm 机制, 会把 Key 存放内存,Value 会存放在swap 区 |
appendonly no | 指定是否在每次更新操作后进行日志记录, Redis 在默认情况下是异步的把数据写入磁盘, 如果不开启,可能会在 断电时导致一段时间内的数据丢失。 因为 redis 本身同步数据文件是按上面 save 条件来同步的, 所以有的数据会在一段时间内只存在于内存中。默认为 no |
appendfilename appendonly.aof | 指定更新日志文件名,默认为 appendonly.aof |
appendfsync everysec | 指定更新日志条件,共有 3 个可选值:no:表示等操作系统进行数据缓存同步到磁盘(快) always:表示每次更新操作后手动调用 fsync()将数据写到磁盘(慢,安全) everysec:表示每秒同步一次(折衷,默认值) |
activerehashing yes | 指定是否激活重置哈希,默认为开启 |
include /path/to/local.conf | 指定包含其它的配置文件,可以在同一主机上多个 Redis 实例之间 使用同一份配置文件,而同时各个实例又拥有自己的特定配置文件 |
基本命令操作
一、Key的操作命令
命令 | 描述 | 用法 |
---|---|---|
DEL | (1)删除给定的一个或多个Key (2)不存在的Key将被忽略 | DEL key [key …] |
EXISTS | (1)检查给定Key是否存在 | EXISTS key |
EXPIRE | (1)为给定Key设置生存时间 (2)对一个已经指定生存时间的Key设置执行EXPIRE,新的值会代替旧的值 | EXPIRE key seconds |
KEYS | 查找所有符合给定模式pattern的Key,例如: (1)KEYS 匹配所有key (2)KEYS h?llo匹配hello、hallo、hxllo等 (3)KEYS hllo匹配hllo、heeeeello等 (4)KEYS h[ae]llo匹配hello和hallo | KEYS pattern |
MIGRATE | (1)原子性地将Key从当前实例传送到目标实例指定的数据库上 (2)原数据库Key删除,新数据库Key增加 (3)阻塞进行迁移的两个实例,直到迁移成功、迁移失败、等待超时三个之一发生 | MIGRATE host port key destination-db timeout [COPY] [REPLACE] |
MOVE | (1)将当前数据库的Key移动到给定数据中 (2)执行成功的条件为当前数据库有Key,而给定数据库没有Key | MOVE key db |
PERSIST | (1)移除给定Key的生存时间,将Key变为持久数据 | PERSIST key |
RANDOMKEY | (1)从当前数据库随机返回且不删除一个Key, | RANDOMKEY |
RENAME | (1)将Key的键名修改为新键名 (3)新键名已存在,RENAME将覆盖旧值 | RENAME key newkey |
TYPE | (1)返回Key锁存储的值的类型 | TYPE key |
二、字符串的操作命令
命令 | 描述 | 用法 |
---|---|---|
SET | (1)将字符串值Value关联到Key (2)Key已关联则覆盖,无视类型 (3)原本Key带有生存时间TTL,那么TTL被清除 | SET key value [EX seconds] [PX milliseconds] [NX\XX] |
GET | (1)返回Key关联的字符串值 (2)Key不存在返回nil (3)Key存储的不是字符串,返回错误,因为GET只用于处理字符串 | GET key |
MSET | (1)同时设置一个或多个Key-Value键值对 (2)某个给定Key已经存在,那么MSET新值会覆盖旧值 (3)如果上面的覆盖不是希望的,那么使用MSETNX命令,所有Key都不存在才会进行覆盖 (4)MSET是一个原子性操作,所有Key都会在同一时间被设置,不会存在有些更新有些没更新的情况 | MSET key value [key value …] |
MGET | (1)返回一个或多个给定Key对应的Value (2)某个Key不存在那么这个Key返回nil | MGET key [key …] |
SETEX | (1)将Value关联到Key (2)设置Key生存时间为seconds,单位为秒 (3)如果Key对应的Value已经存在,则覆盖旧值 (4)SET也可以设置失效时间,但是不同在于SETNX是一个原子操作,即关联值与设置生存时间同一时间完成 | SETEX key seconds value |
SETNX | (1)当Key不存在时将Key的值设为Value (2)若给定的Key已存在,SEXNX不做任何动作 | SETNX key value |
INCR | (1)Key中存储的数字值+1,返回增加之后的值 (2)Key不存在,那么Key的值被初始化为0再执行INCR (3)如果值包含错误类型或者字符串不能被表示为数字,那么返回错误 (4)值限制在64位有符号数字表示之内 | INCR key |
DECR | (1)Key中存储的数字值-1 (2)其余同INCR | DECR key |
INCRBY | (1)将key所存储的值加上增量返回增加之后的值 (2)其余同INCR | INCRBY key increment |
DECRBY | (1)将key所存储的值减去减量decrement (2)其余同INCR | DECRBY key decrement |
三、哈希数据的操作命令
命令 | 描述 | 用法 |
---|---|---|
HSET | (1)将哈希表Key中的域Field的值设为Value (2)Key不存在,一个新的Hash表被创建 (3)Field已经存在,旧的值被覆盖 | HSET key field value |
HGET | (1)返回哈希表Key中给定域Field的值 | HGET key field |
HDEL | (1)删除哈希表Key中的一个或多个指定域 (2)不存在的域将被忽略 | HDEL key filed [field …] |
HEXISTS | (1)查看哈希表Key中,给定域Field是否存在,存在返回1,不存在返回0 | HEXISTS key field |
HGETALL | (1)返回哈希表Key中,所有的域和值 | HGETALL key |
HINCRBY | (1)为哈希表Key中的域Field加上增量Increment (2)其余同INCR命令 | HINCRYBY key filed increment |
HKEYS | (1)返回哈希表Key中的所有域 | HKEYS key |
HLEN | (1)返回哈希表Key中域的数量 | HLEN key |
HMGET | (1)返回哈希表Key中,一个或多个给定域的值 (2)如果给定的域不存在于哈希表,那么返回一个nil值 | HMGET key field [field …] |
HMSET | (1)将多个Field-Value对设置到哈希表Key中 (2)会覆盖哈希表中已存在的域 (3)Key不存在,那么一个空哈希表会被创建并执行HMSET操作 | HMSET key field value [field value …] |
HVALS | (1)返回哈希表Key中所有的域和值 | HVALS key |
四、列表类型常用命令
命令 | 描述 | 用法 |
---|---|---|
LPUSH | (1)将一个或多个值Value插入到列表Key的表头 (2)如果有多个Value值,那么各个Value值按从左到右的顺序依次插入表头 (3) Key不存在,一个空列表会被创建并执行LPUSH操作 (4)Key存在但不是列表类型,返回错误 | LPUSH key value [value … |
LPUSHX | (1)将值Value插入到列表Key的表头,当且仅当Key存在且为一个列表 (2)当Key不存在时,LPUSHX命令什么都不做 | LPUSHX key value |
LPOP | (1)移除并返回列表Key的头元素 | LPOP key |
LRANGE | (1)返回列表Key中指定区间内的元素,区间以偏移量Start和Stop指定 (2)Start和Stop都以0为底开始计数 (3)可使用负数下标,-1表示列表最后一个元素,-2表示列表倒数第二个元素,以此类推 (4)Start大于列表最大下标,返回空列表 (5)Stop大于列表最大下标,Stop=列表最大下标 | LRANGE key start stop |
LREM | (1)根据Count的值,移除列表中与Value相等的元素 (2)Count>0表示从头到尾搜索,移除与Value相等的元素,数量为Count (3)Count<0表示从从尾到头搜索,移除与Value相等的元素,数量为Count (4)Count=0表示移除表中所有与Value相等的元素 | LREM key count value |
LSET | (1)将列表Key下标为Index的元素值设为Value (2) Index参数超出范围,或对一个空列表进行LSET时,返回错误 | LSET key index value |
LINDEX | (1)返回列表Key中,下标为Index的元素 | LINDEX key index |
LINSERT | 1)将值Value插入列表Key中,位于Pivot前面或者后面 (2)Pivot不存在于列表Key时,不执行任何操作 (3)Key不存在,不执行任何操作 | LINSERT key BEFORE\AFTER pivot value |
LLEN | (1)返回列表Key的长度 (2)Key不存在,返回0 | LLEN key |
LTRIM | (1)对一个列表进行修剪,让列表只返回指定区间内的元素,不存在指定区间内的都将被移除 | LTRIM key start stop |
RPOP | (1)移除并返回列表Key的尾元素 | RPOP key |
RPOPLPUSH | (在一个原子时间内,执行两个动作: (1)将列表Source中最后一个元素弹出并返回给客户端 (2)将Source弹出的元素插入到列表Desination,作为Destination列表的头元素 | RPOPLPUSH source destination |
RPUSH | (1)将一个或多个值Value插入到列表Key的表尾 | RPUSH key value [value …] |
RPUSHX | (1)将Value插入到列表Key的表尾,当且仅当Key存在并且是一个列表 (2)Key不存在,RPUSHX什么都不做 | RPUSHX key value |
五、其他常用命令列表
命令 | 描述 | 用法 |
---|---|---|
SADD | (1)将一个或多个member元素加入到key中,已存在在集合的member将被忽略 (2)假如key不存在,则只创建一个只包含member元素做成员的集合 (3)当key不是集合类型时,将返回一个错误 | SADD key number [member …] |
SCARD | (1)返回key对应的集合中的元素数量 | SCARD key |
SREM | (1)移除集合key中的一个或多个member元素,不存在的member将被忽略 | SREM key member [member …] |
SMEMBERS | (1)返回集合key中的所有成员 (2)不存在的key被视为空集 | SMEMBERS key |
ZADD | (1)将一个或多个member元素及其score值加入有序集key中 (2)如果member已经是有序集的成员,那么更新member对应的score并重新插入member保证member在正确的位置上 (3)score可以是整数值或双精度浮点数 | ZADD key score member [[score member] [score member] …] |
ZCARD | (1)返回有序集key的元素个数 | ZCARD key |
ZCOUNT | (1) 返回有序集key中,score值>=min且<=max的成员的数量 | ZCOUNT key min max |
ZRANGE | (1)返回有序集key中指定区间内的成员,成员位置按score从小到大排序 (2)具有相同score值的成员按字典序排列 (3)需要成员按score从大到小排列,使用ZREVRANGE命令 (4)下标参数start和stop都以0为底,也可以用负数,-1表示最后一个成员,-2表示倒数第二个成员 (5)可通过WITHSCORES选项让成员和它的score值一并返回 | ZRANGE key start stop [WITHSCORES] |
ZRANK | (1)返回有序集key中成员member的排名,有序集成员按score值从小到大排列 (2)排名以0为底,即score最小的成员排名为0 (3)ZREVRANK命令可将成员按score值从大到小排名 | ZRANK key number |
ZREM | (1)移除有序集key中的一个或多个成员,不存在的成员将被忽略 (2)当key存在但不是有序集时,返回错误 | ZREM key member [member …] |
SELECT | (1)切换到指定数据库,数据库索引index用数字指定,以0作为起始索引值 (2)默认使用0号数据库 | SELECT index |
DBSIZE | (1)返回当前数据库的Key的数量 | DBSIZE |
SHUTDOWN | (1)停止所有客户端 (2)如果至少有一个保存点在等待,执行SAVE命令 (3)如果AOF选项被打开,更新AOF文件 (4)关闭Redis服务器 | SHUTDOWN [SAVE\NOSAVE] |
FLUSHDB | (1)清空当前数据库中的所有Key | FLUSHDB |
FLUSHALL | (1)清空整个 Redis 服务器的数据(删除所有数据库的所有Key) | FLUSHALL |