Redis基础

85 阅读7分钟

参考:黑马redis教程:www.bilibili.com/video/BV1CJ…

1. Redis的基础概念

  • NoSQL数据库,Key-value 数据结构, 速度快于一般数据库
  • Redis一般用作缓存,存储的内容不会随着JVM销毁而消失(比如用map作为缓存)

2. Redis的指令

  • Redis的安装,配置,客户端
  • 连接,退出,清屏
  • 查看key, 删除key, key的类型查找
  • 设置过期时间,查看过期时间,更新过期时间
  • 切换数据库(默认16个0-15)

3. Redis的数据结构

  • Key-Value 结构,键的类型只能为字符串,值支持五种数据类型:字符串、列表、集合、散列表、有序集合。
  • Value的数据结构
  1. String命令,比如set, get
  2. Hash (map< string , map<string,map>)命令,比如hset, hmset, hget

图片1.png

u hash类型下的value只能存储字符串,不允许存储其他数据类型,不存在嵌套现象。如果数据未获取到, 对应的值为(nil)

u Field 相当于表格列名或者对象的成员变量,value则为具体的值

u 每个 hash 可以存储 2^32 - 1 个键值

u hash类型十分贴近对象的数据存储形式,并且可以灵活添加删除对象属性。但hash设计初衷不是为了存储大量对象而设计的,切记不可滥用,更不可以将hash作为对象列表使用

u hgetall 操作可以获取全部属性,如果内部field过多,遍历整体数据效率就很会低,有可能成为数据访问瓶颈

  1. List命令,比如lpush,lpop
  • List的底层是双向链表结构,并且可以重复
  • list中是string类型的,数据总容量是有限的,最多2^32 - 1 个元素
  • list具有索引的概念,获取全部数据操作结束索引设置为-1 (倒数第一个元素)
  • list可以对数据进行分页操作,通常第一页的信息来自于list,第2页及更多的信息通过数据库的形式加载
  1. Set命令,比如sadd, 差集,并集

  2. SortedSet命令,比如zadd,不重复,但是有序;如果重复添加相同的数据,score值将被反复覆盖,保留最后一次修改的结果

图片2.png

  • Bitmaps
  • HyperLogLog
  • GEO

4. Redis和Java

  • Jedis 客户端

一款Java 操作redis 数据库的工具

Maven包/下载相关Jar包,配置,连接池JedisPool,Jedis 工具类

  • RedisTemplate客户端

具体操作参考:blog.csdn.net/lydms/artic…

  • 区别

Jedis是Redis官方推荐的面向Java的操作Redis的客户端,而RedisTemplate是SpringDataRedis中对JedisApi的高度封装。

RedisTemplate支持连接池自动管理,可以通过简单的连接池配置信息就能访问Redis服务并进行相关缓存操作。

Spring-data-redis默认提供了两个使用Redis的类StringRedisTemplate和RedisTemplate,其中RedisTemplate可以支持Redis没有的缓存对象的操作,而StringRedisTemplate用来存储字符串。StringRedisTemplate继承RedisTemplate。

5. Redis的持久化

  • 概念:Redis是一个内存数据库,当Redis 服务器重启,数据会丢失。通过持久化过程,数据快照RDB,操作日志AOF,可以将Redis 里面的数据保存到硬盘。

图片3.png

  • RDB

自动触发,在redis.conf ;手动配置Save,该命令将在 redis 安装目录中创建dump.rdb文件。

Redis.conf 的配置: 文件名配置,路径配置,是否压缩

Save和Bgsave(通过新线程来操作)指令

图片4.png

  图片5.png

图片6.png

图片7.png

RDB优缺点

优点

二进制文件,存储效率较高

存储的是某个时间点的数据快照,非常适合用于数据备份,全量复制等场景

恢复速度要比AOF快

应用:服务器中每X小时执行bgsave备份,并将RDB文件拷贝到远程机器中,用于灾难恢复

缺点

无法做到实时持久化,会丢失数据

bgsave指令每次fork操作创建子进程,要牺牲掉一些性能

Redis的众多版本中未进行RDB文件格式的版本统一,有可能出现各版本服务之间数据格式无法兼容现象

  • AOF

AOF写数据三种策略(appendfsync),Always:每次同步;Everysec:每秒同步(默认);No,由操作系统控制每次同步

AOF的工作原理

图片8.png

AOF重写,去除无效指令,提高磁盘写入效率和恢复效率

AOF重写原理

图片9.png

 RDB与AOF比较

图片10.png

如果对数据非常敏感,建议使用默认的AOF持久化方案(AOF最多丢失1秒的数据)。如果数据有阶段性特征(可以控制),建议使用RDB持久化方案。

如果追求大数据的恢复速度,RDB

如果是灾难备份,RDB

一般综合考虑,同时开启 RDB 和 AOF,重启后,Redis优先使用 AOF 来恢复数据,降低丢失数据

6. Redis的事务

  • Redis事务是指将多条命令加入队列,一次批量执行多条命令,每条命令会按顺序执行,事务执行过程中不会受客户端传入的命令请求影响。

图片11.png

  • Redis事务的相关命令如下

MULTI:标识一个事务的开启,即开启事务;

EXEC:执行事务中的所有命令,即提交;

DISCARD:放弃事务;和回滚不一样,Redis事务不支持回滚。

WATCH:监视Key改变,用于实现乐观锁。如果监视的Key的值改变,事务最终会执行失败。

UNWATCH:放弃监视。

  • 错误

如果定义的事务中所包含的命令存在语法错误,整体事务中所有命令均不会执行。包括那些语法正确的命令。

如果指命令格式正确,但是无法正确的执行,能够正确运行的命令会执行,运行错误的命令不会被执行

但是在一个事务中,已经执行完毕的命令对应的数据不会自动回滚,需要程序员自己在代码中实现回滚

7. Redis的删除策略

  • 定时删除

创建一个定时器,当key设置有过期时间,且过期时间到达时,由定时器任务立即执行对键的删除操作

优缺点:节约内存,到时就删除,快速释放掉不必要的内存占用;CPU压力很大,会影响redis服务器响应时间和指令吞吐量。用处理器性能换取存储空间 (拿时间换空间)

  • 惰性删除

数据到达过期时间,不做处理。等下次访问该数据时,如果未过期,返回数据;发现已过期,删除,返回不存在

优缺点:节约CPU性能,内存压力很大。用存储空间换取处理器性能 (拿空间换时间)

  • 定期删除

周期性轮询redis库中的时效性数据,采用随机抽取的策略,利用过期数据占比的方式控制删除频度

特点1:CPU性能占用设置有峰值,检测频度可自定义设置;特点2:内存压力不是很大,长期占用内存的冷数据会被持续清理

总结:周期性抽查存储空间 (随机抽查,重点抽查)

图片12.png

  • 逐出算法

情景分析,如果有新数据进入redis,但是数据都没有过期,而且内存也不足,那么这时就需要逐出算法,来腾出一些空间

Redis使用内存存储数据,在执行每一个命令前,会调用freeMemoryIfNeeded()检测内存是否充足

注意:逐出数据的过程不是100%能够清理出足够的可使用的内存空间,如果不成功则反复执行,当对所有数据尝试完毕后,如果不能达到内存清理的要求,将出现错误信息