初识Redis

131 阅读7分钟

一、NoSql

1.1 NoSQL

NoSQL(Not Only SQL ),意即不仅仅是SQL, 泛指非关系型的数据库。

1.2 NoSQL的特点

解耦!
(1)方便扩展(数据之间没有关系,很好拓展)
(2)大数据量高性能(Redis一秒钟写8万次,读取11万)
(3)数据类型是多样性的(不需要事先设计数据库,随取随用)

1.3 NoSQL的类型

分类举例场景模型
键值(Key Value)Tpkyo Cabinet/TyrantOracle BDBRedis内容缓存Key Value键值对
文档型数据库CouchDBMongoDBWeb应用Key-Value键值对,Vlue为结构化数据
图形型数据库Neo4JInfoGridInfinite Graph社交网络,专注于构建关系图谱图结构
列存储数据库Cassandra,HBaseRlak分布式文件系统以列簇式存储,将同一列数据存在一起

二、什么是Redis

2.1 Redis的定义

Redis(Remote Dictionary Server ),即远程字典服务,

是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。它支持字符串、哈希表、列表、集合、有序集合等数据类型。

2.2 Redis能干嘛?

  • 缓存:这是 Redis 使用最多的领域,Redis 将所有的数据直接存在内存中,其访问速度远远快于如 MySQL 等需要从硬盘查询的数据库,如果将 SQL 中常用的数据写入缓存,可以极大的提高系统的性能,减缓数据库的压力。同时也可以通过 Redis 缓存实现跨进程数据的共享;
  • 持久化:例如:对于各个微服务组件来说,自带的 Session 机制并不能跨进程共享,如果将 Session 写入 Redis,既可以实现不同微服务进程的 Session 共享,通过 Redis 持久化到硬盘中,可以避免因服务器宕机重启等导致服务器 Session 丢失;
  • 分布式锁:对于进程间共享的数据,需要通过锁的方式避免脏数据的产生,可以利用 Redis 单线程的特性,实现共享数据的加锁和释放;
  • 发布、订阅:没错,Redis 是可以用作轻量级的消息队列的;

2.3 Redis的数据类型

  1. String

  2. List

  3. Set

  4. ZSet

  5. Hash

  6. geospatial (地理位置)

  7. hyperloglog(基数)

  8. bitmaps(位存储)

2.6 Redis的高并发

  1. Redis 是纯内存数据库,一般都是简单的存取操作,线程占用的时间很多,时间的花费主要集中在 IO 上,所以读取速度快

  2. Redis 使用的是非阻塞 IO,IO 多路复用,使用了单线程来轮询描述符,将数据库的开、关、读、写都转换成了事件,减少了线程切换时上下文的切换和竞争。

  3. Redis 采用了单线程的模型,保证了每个操作的原子性,也减少了线程的上下文切换和竞争。

  4. Redis 存储结构多样化,不同的数据结构对数据存储进行了优化,如压缩表,对短数据进行压缩存储,再如,跳表,使用有序的数据结构加快读取的速度。

  5. Redis 采用自己实现的事件分离器,效率比较高,内部采用非阻塞的执行方式,吞吐能力比较大。

2.7 持久化

Redis 支持 RDB 和 AOF 两种持久化机制,持久化功能有效地避免因进程 退出造成的数据丢失问题,当下次重启时利用之前持久化的文件即可实现数据恢复。

  • RDB 是一次全量备份,AOF 日志是连续的增量备份, RDB 是内存数据的二进制序列化形式,在存储上非常紧凑,而 AOF 日志记录的是内存数据修改的指令记录文本。
  • AOF 以独立日志的方式记录每次写命令, 重启时再重新执行 AOF 文件中的命令达到恢复数据的目的。AOF 的主要作用 是解决了数据持久化的实时性,目前已经是 Redis 持久化的主流方式。

AOF 日志在长期的运行过程中会变的无比庞大,数据库重启时需要加载 AOF 日志进行指令重放,这个时间就会无比漫长。所以需要定期进行 AOF 重写,给 AOF 日志进行瘦身。

RDB

RDB 是 Redis DataBase 的缩写,可以称作快照/内存快照。同时 RDB 是 Redis 默认启用的持久化方案。

RDB 持久化就是把当前进程数据生成快照保存到磁盘上的过程,由于是某一时刻的快照,那么快照中的值要早于或者等于内存中的值。

AOF

AOF是 Append Only File 的缩写

AOF 日志存储的是 Redis 服务器的顺序指令序列,AOF 日志只记录对内存进行修改的 指令记录。

假设 AOF 日志记录了自 Redis 实例创建以来所有的修改性指令序列,那么就可以通过 对一个空的 Redis 实例顺序执行所有的指令,也就是「重放」,来恢复 Redis 当前实例的内 存数据结构的状态。

Redis 会在收到客户端修改指令后,先进行参数校验,如果没问题,就立即将该指令文本存储到 AOF 日志中,也就是先存到磁盘,然后再执行指令。这样即使遇到突发宕机,已经存储到 AOF 日志的指令进行重放一下就可以恢复到宕机前的状态。通过 appendfsync 参数可以控制实时/秒级持久化 。

  1. 所有的写入命令会追加到 aof_buf(缓冲区)中。
  2. AOF 缓冲区根据对应的策略向硬盘做同步操作。
  3. 随着 AOF 文件越来越大,需要定期对 AOF 文件进行重写,达到压缩的目的。
  4. 当 Redis 服务器重启时,可以加载 AOF 文件进行数据恢复。

三、Redis实战

3.1 Redis相关指令

开启服务:brew services start redis

停止服务: brew services stop redis

进入redis: redis-cli

查看所有key: keys *

设置缓存: set

获取缓存:get

删除某个缓存:del

......

3.2 java依赖配置

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
    <version>3.0.4</version>
</dependency>

spring包中的redis包含了jedis

3.3 Redis的几种注解指令

1、Cacheable

@Cacheable(key = "#username") 表示将 username 作为 key,将结果写入 Redis 缓存。如果缓存中已经有此 key 值,则直接返回,而不会执行 SQL 查询,缓存中没有数据的情况下,才会执行 SQL 查询。即先看缓存有没有,有就直接返回,没有就查询数据库。

cacheNames: 指定cache名称(可以是数组多个)

key: 缓存值中的key

condition: 控制使用缓存的条件

unless: 控制是否将结果更新到redis缓存中

2、CachePut

@CachePut也可以标注在类或者方法上,被标注的方法每次都会被调用,然后方法执行完毕之后,会将方法结果丢到缓存中;当标注在类上,相当于在类的所有方法上标注了@CachePut。

3、CacheEvict

@CacheEvict(key = "#username") 用来清除缓存的,@CacheEvict也可以标注在类或者方法上,被标注在方法上,则目标方法被调用的时候,会清除指定的缓存;当标注在类上,相当于在类的所有方法上标注了@CacheEvict。删除key下面的value。属性:allEntries 为true的时候,会清除 cacheNames 指定的缓存中的所有缓存信息。

4、CacheConfig

@CacheConfig() 作用在类上,可将公共部分属性的控制写在这里

四、Redis 进阶(继续学习)

4.1 Redis集群

4.2 Redis事务

4.3 乐观锁和悲观锁

4.4 分布式锁

4.5 Redis的主从同步