什么是Redis?
在了解什么是Redis之前,首先了解什么是NoSQL?
NoSQL(NoSQL = Not Only SQL),意即“不仅仅是SQL”,是一项全新的数据库理念,泛指非关系型的数据库。
与我们所认识的SQL的关系型数据库不一样,NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。
NOSQL和关系型数据库比较
优点:
(1)成本:nosql数据库简单易部署,基本都是开源软件,不需要像使用oracle那样花费大量成本购买使用,相比关系型数据库价格便宜。
(2)查询速度:nosql数据库将数据存储于缓存之中,关系型数据库将数据存储在硬盘中,自然查询速度远不及nosql数据库。
(3)存储数据的格式:nosql的存储格式是key,value形式、文档形式、图片形式等等,所以可以存储基础类型以及对象或者是集合等各种格式,而数据库则只支持基础类型。
(4)扩展性:关系型数据库有类似join这样的多表查询机制的限制导致扩展很艰难。
缺点:
(1)维护的工具和资料有限,因为nosql是属于新的技术,不能和关系型数据库10几年的技术同日而语。
(2)不提供对sql的支持,如果不支持sql这样的工业标准,将产生一定用户的学习和使用成本。
(3)不提供关系型数据库对事务的处理。
Redis就是NoSQL产品中的一种,属于键值(Key-Value)存储数据库。
Redis的使用场景有哪些?
-
热点数据的缓存
Redis用在对数据的缓存已经很常见了,因为其访问速度快,支持的数据类型也丰富,所以在对一些高访问的热点数据来说,合理利用缓存能够提高网站的访问速度的同时,也能很好地降低数据库的压力。 -
计数器
redis由于incrby命令可以实现原子性的递增,所以可用于记录每一个用户的访问次数,或者是在商城中记录商品的被浏览次数。 -
排行榜
redis中的list类型的数据结构,可以使用lrange命令分页查询队列中的数据,每隔一段时间计算一次的排行榜存储在list类型中。但是只有定时计算的排行榜才适合使用list,实时计算的可以使用sortedset。 -
分布式session
多个服务器共享一个session,将session存放在redis中,redis可以独立于所有负载均衡服务器,也可以放在其中一台负载均衡服务器上,但是所有应用所在的服务器连接的都是同一个redis服务器。
Redis的数据结构是怎么样的?
redis存储的是:key,value格式的数据,其中key都是字符串,value有5种不同的数据结构:
- 字符串类型
string
- 哈希类型
hash
- 列表类型
list
- 集合类型
set
- 有序集合类型
sortedset
Redis的操作命令有哪些?
- 字符串类型 string :
描述 | 指令 |
---|---|
存储 | set key value |
获取 | get key |
删除 | del key |
- 哈希类型 hash (map 格式):
描述 | 指令 |
---|---|
存储 | hset key field value |
获取指定的field对应的值 | hget key field |
获取所有的field和 | hget key |
删除 | hdel key field |
- 列表类型 list :
可以操作列表的头部(左边)或者尾部(右边)
描述 | 指令 |
---|---|
将元素加入列表左边 | lpush key value |
将元素加入列表右边 | rpush key value |
范围获取 | lrange key start end |
删除列表最左边的元素,并将元素返回 | lpop key |
删除列表最右边的元素,并将元素返回 | rpop key |
- 集合类型 set :
不允许重复元素
描述 | 指令 |
---|---|
存储 | sadd key value |
获取 | smembers key |
删除 | srem key value |
- 有序集合类型 sortedset:
不允许重复元素,且元素有序.每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
描述 | 指令 |
---|---|
存储 | zadd key score value |
获取 | zrange key start end [withscores] |
删除 | zrem key value |
- 通用命令
描述 | 指令 |
---|---|
查询所有的键 | keys * |
获取键对应的value的类型 | type key |
删除指定的key value | del key |
Redis的持久化机制有哪些?
为什么Redis需要持久化?
redis是一个内存数据库,当redis服务器重启,获取电脑重启,数据会丢失,但是可以将redis内存中的数据持久化保存到硬盘的文件中。
Redis的持久化机制主要有两种:
1.RDB 持久化:
RDB持久化是将当前进程中的数据生成快照保存到硬盘(因此也称作快照持久化),保存的文件后缀是rdb;当Redis重新启动时,可以读取快照文件恢复数据。
RDB持久化的触发分为手动触发和自动触发两种。
-
手动触发
手动触发对应save
命令,会阻塞当前Redis服务器,服务器不能处理任何命令请求,直到RDB过程完成为止,对于内存比较大的实例会造成长时间阻塞,线上环境不建议使用。 -
自动触发
自动触发对应bgsave
命令,Redis进程执行fork操作 (同步操作) 创建子进程,RDB持久化过程由子进程负责,完成后自动结束。阻塞只发生在fork阶段,一般时间很短。
可以在redis.conf配置文件中配置需要的时间要求:
save <seconds> <changes>
指定当< seconds >秒内发生< changes >次变化时,会触发bgsave。
但是如果想关闭自动触发,在save命令后面加一个空的“”
:
save ""
2.AOF 持久化:
AOF(append only file) 持久化以独立日志的方式记录每次写命令, 重启时再重新执行AOF文件中的命令达到恢复数据的目的。AOF的主要作用是解决了数据持久化的实时性,实时性比RDB好,目前已经是Redis持久化的主流方式。
- AOF的开启
Redis默认是开启RDB,但关闭AOF,若要开启AOF,就要在配置文件中配置:
appendonly yes
- AOF的工作机制
AOF的工作流程:命令写入(追加)append
、文件同步sync
、文件重写rewrite
、重启加载load
。
- 所有的写入命令会追加到aof_buf(缓冲区)中。
- AOF缓冲区根据对应的策略向硬盘做同步操作。
AOF为什么把命令追加到aof_buf中?Redis使用单线程响应命令,如果每次写AOF文件命令都直接追加到硬盘,那么性能完全取决于当前硬盘负载。先写入缓冲区aof_buf中,还有另一个好处,Redis可以提供多种缓冲区同步硬盘的策略,在性能和安全性方面做出平衡。
- 随着AOF文件越来越大,需要定期对AOF文件进行重写,达到压缩的目的。
Redis的使用周期增加,Redis服务器执行的写命令越来越多,AOF文件也会越来越大;过大的AOF文件不仅会影响服务器的正常运行,也会导致数据恢复需要的时间过长。
文件重写是指定期重写AOF文件,减小AOF文件的体积。但是,AOF重写是把Redis进程内的数据转化为写命令,同步到新的AOF文件;不会对旧的AOF文件进行任何读取、写入操作。
- 当Redis服务器重启时,可以加载AOF文件进行数据恢复。
数据恢复流程:
(1)AOF持久化开启且存在AOF文件时,优先加载AOF文件。
(2)AOF关闭或者AOF文件不存在时,加载RDB文件。
(3)加载AOF/RDB文件成功后,Redis启动成功。
(4)AOF/RDB文件存在错误时,Redis启动失败并打印错误信息。
看完这篇文章,相信对Redis有了初步的了解,我们接着进一步探讨Redis的进阶知识。