一、Redis介绍
1:NOSQL和SQL简介
1)Redis是一款高性能的NOSQL数据库;
2)NODSQL最初指不使用SQL标准的数据库,现在泛指所有的非关系型数据库;
3)NOSQL和SQL数据库是相辅相成的,不存在相互替换的可能
4)NOSQL数据库都符合CAP定理
(C---强一致性, A----高可用性, P---高分区容错性,只能满足其二, 无法同时满足)
2:Redis
1)特点:
①短小精悍-----核心代码不超过2w行,总版本代码不超过5w行;
性能强劲,每秒百万级读写。
②服务端是单线程,多路IO复用:
单线程----服务器同时只能处理一条命令;
多路IO复用----
③使用c语言编写
④在内存中工作的数据库
二、安装
在Linux中凡是C语言编写的软件,必须先编译后安装。
1:编译----
①在Makefile文件所在目录,执行make命令
make----编译,在编译C语言写的软件时,需要gcc-c++库
安装gcc-c++:yum -y install gcc-c++
2:安装----
③ cd str, 执行make命令:make install(安装)
安装的文件存放在/usr/local/bin中
④bin目录常用命令
bin目录常用命令 | |
Redis-benchmark | 压力测试。标准是每秒80000次写操作,110000次读操作 (服务启动起来后执行,类似安兔兔跑分) |
Redis-check-aof | 修复有问题的AOF文件 |
Redis-check-dump | 修复有问题的dump.rdb文件 |
Redis-sentinel | 启动哨兵,集群使用 |
redis-server | 启动服务器 |
redis-cli | 启动客户端 |
⑤启动服务器--------redis-server XXX.conf (将配置文件备份保留)
修改配置文件改为守护进程模式,在后台运行---daemonize yes
后台启动后查看服务-----netstat -anp | grep 6379
⑥客户端登录-------
命令 | 说明 | 举例 | 备注 |
redis-cli | 启动客户端 | redis-cli –p 端口号 连接指定的端口号 | 直接执行的话,默认端口号就是6379; |
ping | 测试联通 |
| 回复pong代表联通 |
exit | 退出客户端 |
|
|
redis-cli shutdown | 停止服务器 | redis-cli -h 127.0.0.1 -p 6379 shutdown 停止指定ip指定端口号的服务器 | redis是通过客户端发送停止服务器的命令 |
三:使用
1:启动和停止服务
服务端:
启动:redis-server 配置文件;
停止:ctrl+c:强行停止
通过客户端shutdown命令停止
客户端:
启动:redis-cli -h 服务器的主机名 -p 端口号
redis-cli :默认连接localhost:6379
退出:quit; exit;
五、常用的五大基本数据类型
数据:
Redis中的数据以键值对(key-value)为基本存储方式,
其中key都是字符串,这里探讨数据类型都是探讨value的类型。
key()-value[string,hash,list,set,zset(sorted set)]
key | value | |
string | 字符串 | |
list | 可以重复的集合 | |
set | 不可以重复的集合 | |
hash | 类似于Map<String,String> | |
zset(sorted set) | 带分数的set |
1:String操作-----
String类型时Redis中的最基本的类型,它是key对应的一个单一值。
二进制安全,不必担心由于编译等问题导致二进制数据变化,所以Redis的String 可以包含任何数据,比如jpg图像,或序列化的对象
Redis中的一个字符串的最大容量是512M
SET key value | 添加键值对 |
GET key | 查询指定key的值 |
APPEND key value | 将给定的value追加到原值的末尾 |
STRLEN key | 获取值的长度 |
SETNX key value | 只有在 key 不存在时设置 key 的值 |
INCR key | 指定key的值自增1,只对数字有效 |
DECR key | 指定key的值自减1,只对数字有效 |
INCRBY key num | 自增num |
DECRBY key num | 自减num |
MSET key1 value1 key2 value2… | 同时设置多个key-value对 |
MGET key1 key2 | 同时获取一个或多个value |
MSETNX key1 value1 key2 value2 | 当key不存在时,设置多个key-value对 |
GETRANGE key起始索引 结束索引 | 获取指定范围的值,都是闭区间 |
SETRANGE key起始索引 value | 从起始位置开始覆写指定的值 |
GETSET key value | 以新换旧,同时获取旧值 |
SETEX key 过期时间 value | 设置键值的同时,设置过期时间,单位秒 |
2:list操作
在Redis中list是双向链表可以从两侧插入
常见操作-----
遍历:从左往右取值
删除:弹栈---POP;
添加:压栈---PUSE;
Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导列表的头部(左边)或者尾部(右边)。它的底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差。
LPUSH/RPUSH key value1 value2… | 从左边/右边压入一个或多个值 头尾效率高,中间效率低 |
LPOP/RPOP key | 从左边/右边弹出一个值 值在键在,值光键亡 弹出=返回+删除 |
LRANGE key start stop | 查看指定区间的元素 正着数:0,1,2,3,... 倒着数:-1,-2,-3,... |
LINDEX key index | 按照索引下标获取元素(从左到右) |
LLEN key | 获取列表长度 |
LINSERT key BEFORE|AFTER value newvalue | 在指定value的前后插入newvalue |
LREM key n value | 从左边删除n个value |
LSET key index value | 把指定索引位置的元素替换为另一个值 |
LTRIM key start stop | 仅保留指定区间的数据 |
RPOPLPUSH key1 key2 | 从key1右边弹出一个值,左侧压入到key2 |
3:set操作
set是无序的,且是不可重复的
SADD key member [member ...] | 将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略。 |
SMEMBERS key | 取出该集合的所有值 |
SISMEMBER key value | 判断集合<key>是否为含有该<value>值,有返回1,没有返回0 |
SCARD key | 返回集合中元素的数量 |
SREM key member [member ...] | 从集合中删除元素 |
SPOP key [count] | 从集合中随机弹出count个数量的元素,count不指定就弹出1个 |
SRANDMEMBER key [count] | 从集合中随机返回count个数量的元素,count不指定就返回1个 |
SINTER key [key ...] | 将指定的集合进行“交集”操作 |
SINTERSTORE dest key [key ...] | 取交集,另存为一个set |
SUNION key [key ...] | 将指定的集合执行“并集”操作 |
SUNIONSTORE dest key [key ...] | 取并集,另存为set |
SDIFF key [key ...] | 将指定的集合执行“差集”操作 |
SDIFFSTORE dest key [key ...] | 取差集,另存为set |
4:hash操作
Hash数据类型的键值对中的值是“单列”的,不支持进一步的层次结构
key | field:value |
"k01":"v01" "k02":"v02" "k03":"v03" "k04":"v04" "k05":"v05" "k06":"v06" "k07":"v07" |
从前端到后台的对应关系
1)JSON
stu:{"stu_id":10,"stu_name":"tom","stu_age":30}
2)java
public class Student {
private Integer stuId;//10
private String stuName;//"tom"
private Integer stuAge;//30
...
}
Student stu=new Student()’
stu.setStuId=10;
stu.setStuName=”tom”;
stu.setStuAge=30;
3)Redis Hash
key | value(hash) | |
stu | stu_id | 10 |
stu_name | tom | |
stu_age | 30 |
常规操作
HSET key field value | 为key中的field赋值value |
HMSET key field value [field value ...] | 为指定key批量设置field-value |
HSETNX key field value | 当指定key的field不存在时,设置其value |
HGETALL key | 获取指定key的所有信息(field和value) |
HKEYS key | 获取指定key的所有field |
HVALS key | 获取指定key的所有value |
HLEN key | 指定key的field个数 |
HGET key field | 从key中根据field取出value |
HMGET key field [field ...] | 为指定key获取多个filed的值 |
HEXISTS key field | 指定key是否有field |
HINCRBY key field increment | 为指定key的field加上增量increment |
5:zset操作
zset是一种特殊的set,在保存value的时候,为每个value多保存了一个score信息,根据该信息,进行排序。
这个评分(score)被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的,但是评分可以是重复了
ZADD key [score member ...] | 添加 |
ZSCORE key member | 返回指定值的分数 |
ZRANGE key start stop [WITHSCORES] | 返回指定区间的值,可选择是否一起返回scores |
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count] | 在分数的指定区间内返回数据,从小到大排列 |
ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count] | 在分数的指定区间内返回数据,从大到小排列 |
ZCARD key | 返回集合中所有的元素的数量 |
ZCOUNT key min max | 统计分数区间内的元素个数 |
ZREM key member | 删除该集合下,指定值的元素 |
ZRANK key member | 返回该值在集合中的排名,从0开始 |
ZINCRBY key increment value | 为元素的score加上增量 |
六、Redis基本操作
1:数据库连接操作:
命令 | 说明 | 举例 | 备注 |
select <dbid> | 切换数据库 | select 1:切换到1号库 | 开启redis服务后,一共有16(0-15)个库,默认在0号库 |
flushdb | 清空当前库 |
|
|
dbsize | 查看数据库数据个数 |
|
|
flushall | 通杀全部库 |
|
|
2:key的操作
Redis中的数据以键值对(key-value)为基本存储方式,其中key都是字符串
表达式 | 描述 |
KEYS pattern | 查询符合指定表达式的所有key,支持*,?等 |
TYPE key | 查看key对应值的类型 |
EXISTS key | 指定的key是否存在,0代表不存在,1代表存在 |
DEL key | 删除指定key |
RANDOMKEY | 在现有的KEY中随机返回一个 |
EXPIRE key seconds | 为键值设置过期时间,单位是秒,过期后key会被redis移除 |
TTL key | 查看key还有多少秒过期,-1表示永不过期,-2表示已过期 |
RENAME key newkey | 重命名一个key,NEWKEY不管是否是已经存在的都会执行,如果NEWKEY已经存在则会被覆盖 |
RENAMENX key newkey | 只有在NEWKEY不存在时能够执行成功,否则失败 |
七、持久化
Redis主要是工作在内存中。内存本身就不是一个持久化设备,断电后数据会清空。所以Redis在工作过程中,如果发生了意外停电事故,如何尽可能减少数据丢失。
1:ROB简介
1)RDB:在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里。
工作机制:每隔一段时间,就把内存中的数据保存到硬盘上的指定文件中。
2)RDB是默认开启的!
Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。
3)RDB的缺点是最后一次持久化后的数据可能丢失
2:ROB常用属性配置
属性 | 含义 | 备注 |
save | 保存策略 |
|
dbfilename | RDB快照文件名 |
|
dir | RDB快照保存的目录 | 必须是一个目录,不能是文件名。最好改为固定目录。默认为./代表执行redis-server命令时的当前目录! |
stop-writes-on-bgsave-error | 是否在备份出错时,继续接受写操作 | 如果用户开启了RDB快照功能,那么在redis持久化数据到磁盘时如果出现失败,默认情况下,redis会停止接受所有的写请求 |
rdbcompression | 对于存储到磁盘中的快照,可以设置是否进行压缩存储。 | 如果是的话,redis会采用LZF算法进行压缩。如果你不想消耗CPU来进行压缩的话, 可以设置为关闭此功能,但是存储在磁盘上的快照会比较大。 |
rdbchecksum | 是否进行数据校验 | 在存储快照后,我们还可以让redis使用CRC64算法来进行数据校验,但是这样做会增加大约10%的性能消耗, 如果希望获取到最大的性能提升,可以关闭此功能。 |
2:ROB数据丢失情况
两次保存的时间间隔内,服务器宕机,或者发生断电问题
3:ROB的触发
①基于自动保存的策略;
②执行save,或者bgsave命令!执行时,是阻塞状态.
③执行flushall命令,也会产生dump.db,单但是是空的,
④执行shutdown命令时,也会主动地备份数据;
4:ROB的优缺点
2:AOF
1:简介
1)AOF是以日志的形式来记录每一个操作,将每一次对数据进行新建、修改的命令保存到指定文件中。Redis重新启动时读取这个文件,重新执行新建、修改数据的指令恢复数据。
2)默认不开启,需手动开启
3)AOF文件的保存路径,同RDB的路径一致
4)AOF保存的命令只会是对数据进行修改的数据,即写操作!!
5)当RDB和AOF存储的数据不一致时,按照AOF恢复,用为AOF是RDB的补充。备份周期更短,也就更可靠。
2:AOF保存策略
appendfsync always | 每次产生一条心的修改数据的命令都会执行保存操作;效率低但是安全。 |
appendfsync everysec 推荐(默认) | 每秒执行一次保存操作,如果在未保存当前秒内操作发生断电,仍然会导致一部分数据丢失(那一秒内的数据) |
appendfsync no | 从不保存。将数据交给操作系统来处理,更快但不安全 |
3:AOF常用属性
属性 | 含义 | 备注 |
appendonly | 是否开启AOF功能 | 默认是关闭的 |
appendfilename | AOF文件名称 |
|
appendfsync | AOF保存策略 | 官方建议everysec |
no-appendfsync-on-rewrite | 在重写时,是否执行保存策略 | 执行重写,可以节省AOF文件的体积;而且在恢复的时候效率也更高。 |
auto-aof-rewrite-percentage | 重写的触发条件 | 当目前aof文件大小超过上一次重写的aof文件大小的百分之多少进行重写 |
auto-aof-rewrite-min-size | 设置允许重写的最小aof文件大小 | 避免了达到约定百分比但尺寸仍然很小的情况还要重写 |
aof-load-truncated | 截断设置 | 如果选择的是yes,当截断的aof文件被导入的时候,会自动发布一个log给客户端然后load |
4:AOF文件的修复
如果AOF文件中出现了残余命令,会导致服务器无法启动,此时会借助redis-check-aof工具修复。
命令:reids-check-aof --fix 文件
5:AOF的优缺点
优点:
-
备份机制更加稳健,丢失数据概率更低
-
可读的日志文本,通过操作AOF文件,可以处理误操作。
缺点:
-
比起RDB占用更多的磁盘空间
-
恢复备份速度慢
-
如果每次读写都同步的话,有一定的性能压力
-
存在个别的bug,造成不可恢复。