Redis高级以及面试分析
Redis基础
什么是Redis?
Redis是一个开源(BSD)许可的,内存中的数据结构存储系统,key-value的非关系型数据库(nosql not only sql),它可以用作数据库、缓存和消息中间件。
Redis的获取、安装或卸载
- https://redis.io/
- 建议安装linux版本,本文用的http://download.redis.io/releases/redis-5.0.8.tar.gz,支持集群和哨兵的版本
- ubuntu下安装(方式一)
使用以下命令下载,提取和编译Redis:
$ wget http://download.redis.io/releases/redis-5.0.8.tar.gz
$ tar xzf redis-5.0.8.tar.gz
$ cd redis-5.0.8
$ make
make完后redis-5.0.8目录下会出现编译后的redis服务程序redis-server,还有用于测试的客户端程序redis-cli,两个程序位于安装目录 src 目录下:
src 目录 中现在提供了已编译的二进制文件 。使用以下命令运行Redis:
cd src
./redis-server
您可以使用内置客户端与Redis进行交互:
$ src/redis-cli
redis> set foo bar
OK
redis> get foo
"bar"
- 在 Ubuntu 系统安装 方式(二)
$sudo apt-get update
$sudo apt-get install redis-server
Redis的启动(守护进程的启动)和卸载
- 启动
#keys * 查看所有key
127.0.0.1:6379> keys *
1) "foo"
2) "fo"
sudo cp redis.conf ./src/
sudo vim redis.conf
./redis-server redis.conf
image.png
- 关闭
ps -ef | grep redis
kill -9 13288
- 卸载
删除redis.conf
删除redis-5.0.8
删除redis-5.0.8.tar.gz
redis和memcached对比
- redis是基于内存的存储系统,速度快,支持持久化
- redis和memcached都是内存对象缓存系统,速度都很快,但是redis支持持久化,memcached不支持,断电数据消失。
- redis比memcached支持更多数据结构,memcached所有值都是简单的字符串,优先选择redis.
redis的数据结构
-
字符串:String类型
image.png - 哈希:Hash类型
hash类型设置语法:hset 键 field value,一个键可以有很多个field,很适合存储对象。例如一个hash存储user键,有name和age两个字段
image.png
-
列表:List 类型
Redis支持list数据结构,底层是一个双向链表,允许重复值存在,按照插入顺序保存,lpush从左边插入,rpush从右边插入。lpop从左边弹出,rpop从右边弹出,这样很容易实现FIFO(First in first out)队列思想,插入和弹出不同方向就可以实现;FILO(firsst in last out)栈的思想,插入和弹出相同方向操作可实现。
image.png
image.png -
集合:Set类型
redis的Set是String类型的无序集合,集合成员是唯一的,集合中不能出现重复的数据。Redis中的集合是通过哈希表来实现的,所以添加、删除、查找的时间复杂度都是O(1)
image.png -
有序集合:sorted set
sorted set是set的升级,它在set的基础上增加了一个顺序的属性,这一属性在添加元素的时候指定后,zset会自动按新的值调整顺序。
image.png
image.png
image.png - 5种数据结构的对比和选择
1、最常用的是string结构,key和value都是string
2、哈希,比较适合对对象的操作
3、列表,有序可重复。按照插入顺序保存,value是可以重复的,底层是双向链表,很方便的实现FIFO(队列,相反方向操作)和FILO(栈,相同方向操作)
4、集合,string类型的无序集合,集合成员是唯一的,不能重复,底层是哈希实现的。
5、有序集合,是集合的升级版,有序且唯一。通过分数实现排序,不能重复。
Redis的持久化策略
-
redis持久化策略整体介绍
redis能将数据保存在内存中,提高性能。但是redis同时支持数据的持久化,有两种策略:RDB和AOF.这两种方式都可以通过redis.conf进行配置。
持久化策略能尽量保证当断电或者服务故障的时候,保证数据的安全性,通过持久化策略进行数据的持久化,在重启服务的时候,进行数据的恢复。数据的加载流程如下:会优先检查是否开启aof策略,有则加载aof文件恢复数据,否则载rdb文件进行数据恢复。
image.png
image.png -
rdb策略
rdb策略是通过redis.conf文件进行配置的,默认开启
1、900s以内,执行了1次键值的改变,就进行保存的操作
image.png
2、保存到此文件
image.png
3、压缩方式保存
image.png
采用LZF压缩方式,占用了CPU时间,若关闭,导致数据库文件变的巨大,建议开启。
4、redis数据保存在内存中,redis服务中断再重启,理论上数据会消失。因为dump.rdb文件的存在,重新启动redis服务的时候,会加载dump.rdb文件,恢复数据,所以中断重启,redis的数据还存在。
删掉dump.rdb文件后再重启,数据丢失。
5、优点
适合大规模的数据恢复(压缩保存策略),数据恢复快。
如果业务对数据的完整性和一致性要求不高,RDB是很好的选择。
6、缺点
RDB可能在最后一次备份时宕机了。
备份时占用内存,因为Redis在备份时会独立创建一个子进程,将数据写入到一个临时文件,此时内存中的数据文件是原来的两倍哦,最后再将这个临时文件替换原来的备份文件,当数据比较大的时候,可能会造成redis服务的短暂暂停,卡顿。
-
AOF策略
1、AOF策略是通过redis.conf文件配置的,默认是关闭的。
2、它的出现是为了弥补RDB的不足(数据的不一致性),所以它采用日志的形式记录每个写操作,并且追加到文件中。Redis重启的时候会根据日志文件的内容将写指令从前到后执行一次,以完成数据的恢复工作。
image.png
image.png
image.png
3、优点:数据的完整性和一致性更高
4、缺点:AOF记录的内容多,文件会越来越大,数据恢复也会越来越慢。 -
RDB和AOF两种策略的对比和使用
image.png
image.png
Redis的过期键删除和淘汰策略(内存管理:memory management)
Redis的特点是数据存储在内存中,保证数据的高效。那么瓶颈就会在内存这里,应该充分利用有效内存。关于redis的内存管理,redis从两方面处理:
-
过期键的处理
redis可以设置键的过期时间,当这个键过期后,没有从redis中清除,而是存在过期字典中,依然占用内存。对于过期键,redis提供三种策略进行清除:
image.png
image.png
一个系统的吞度量(承压能力)与request对CPU的消耗、外部接口、IO等等紧密关联。
单个reqeust 对CPU消耗越高,外部系统接口、IO影响速度越慢,系统吞吐能力越低,反之越高。
系统吞吐量几个重要参数:QPS(TPS)、并发数、响应时间
QPS(TPS):每秒钟request/事务 数量
并发数: 系统同时处理的request/事务数
响应时间: 一般取平均响应时间 -
淘汰策略
当Redis使用的内存达到某一个设置值的时候,对redis存的所有的数据进行处理。
image.png
image.png
image.png
image.png
image.png
image.png
image.png