参考:黑马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的数据结构
- String命令,比如set, get
- Hash (map< string , map<string,map>)命令,比如hset, hmset, hget
u hash类型下的value只能存储字符串,不允许存储其他数据类型,不存在嵌套现象。如果数据未获取到, 对应的值为(nil)
u Field 相当于表格列名或者对象的成员变量,value则为具体的值
u 每个 hash 可以存储 2^32 - 1 个键值
u hash类型十分贴近对象的数据存储形式,并且可以灵活添加删除对象属性。但hash设计初衷不是为了存储大量对象而设计的,切记不可滥用,更不可以将hash作为对象列表使用
u hgetall 操作可以获取全部属性,如果内部field过多,遍历整体数据效率就很会低,有可能成为数据访问瓶颈
- List命令,比如lpush,lpop
- List的底层是双向链表结构,并且可以重复
- list中是string类型的,数据总容量是有限的,最多2^32 - 1 个元素
- list具有索引的概念,获取全部数据操作结束索引设置为-1 (倒数第一个元素)
- list可以对数据进行分页操作,通常第一页的信息来自于list,第2页及更多的信息通过数据库的形式加载
-
Set命令,比如sadd, 差集,并集
-
SortedSet命令,比如zadd,不重复,但是有序;如果重复添加相同的数据,score值将被反复覆盖,保留最后一次修改的结果
- 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 里面的数据保存到硬盘。
- RDB
自动触发,在redis.conf ;手动配置Save,该命令将在 redis 安装目录中创建dump.rdb文件。
Redis.conf 的配置: 文件名配置,路径配置,是否压缩
Save和Bgsave(通过新线程来操作)指令
RDB优缺点
优点
二进制文件,存储效率较高
存储的是某个时间点的数据快照,非常适合用于数据备份,全量复制等场景
恢复速度要比AOF快
应用:服务器中每X小时执行bgsave备份,并将RDB文件拷贝到远程机器中,用于灾难恢复
缺点
无法做到实时持久化,会丢失数据
bgsave指令每次fork操作创建子进程,要牺牲掉一些性能
Redis的众多版本中未进行RDB文件格式的版本统一,有可能出现各版本服务之间数据格式无法兼容现象
- AOF
AOF写数据三种策略(appendfsync),Always:每次同步;Everysec:每秒同步(默认);No,由操作系统控制每次同步
AOF的工作原理
AOF重写,去除无效指令,提高磁盘写入效率和恢复效率
AOF重写原理
RDB与AOF比较
如果对数据非常敏感,建议使用默认的AOF持久化方案(AOF最多丢失1秒的数据)。如果数据有阶段性特征(可以控制),建议使用RDB持久化方案。
如果追求大数据的恢复速度,RDB
如果是灾难备份,RDB
一般综合考虑,同时开启 RDB 和 AOF,重启后,Redis优先使用 AOF 来恢复数据,降低丢失数据
6. Redis的事务
- Redis事务是指将多条命令加入队列,一次批量执行多条命令,每条命令会按顺序执行,事务执行过程中不会受客户端传入的命令请求影响。
- Redis事务的相关命令如下
MULTI:标识一个事务的开启,即开启事务;
EXEC:执行事务中的所有命令,即提交;
DISCARD:放弃事务;和回滚不一样,Redis事务不支持回滚。
WATCH:监视Key改变,用于实现乐观锁。如果监视的Key的值改变,事务最终会执行失败。
UNWATCH:放弃监视。
- 错误
如果定义的事务中所包含的命令存在语法错误,整体事务中所有命令均不会执行。包括那些语法正确的命令。
如果指命令格式正确,但是无法正确的执行,能够正确运行的命令会执行,运行错误的命令不会被执行
但是在一个事务中,已经执行完毕的命令对应的数据不会自动回滚,需要程序员自己在代码中实现回滚
7. Redis的删除策略
- 定时删除
创建一个定时器,当key设置有过期时间,且过期时间到达时,由定时器任务立即执行对键的删除操作
优缺点:节约内存,到时就删除,快速释放掉不必要的内存占用;CPU压力很大,会影响redis服务器响应时间和指令吞吐量。用处理器性能换取存储空间 (拿时间换空间)
- 惰性删除
数据到达过期时间,不做处理。等下次访问该数据时,如果未过期,返回数据;发现已过期,删除,返回不存在
优缺点:节约CPU性能,内存压力很大。用存储空间换取处理器性能 (拿空间换时间)
- 定期删除
周期性轮询redis库中的时效性数据,采用随机抽取的策略,利用过期数据占比的方式控制删除频度
特点1:CPU性能占用设置有峰值,检测频度可自定义设置;特点2:内存压力不是很大,长期占用内存的冷数据会被持续清理
总结:周期性抽查存储空间 (随机抽查,重点抽查)
- 逐出算法
情景分析,如果有新数据进入redis,但是数据都没有过期,而且内存也不足,那么这时就需要逐出算法,来腾出一些空间
Redis使用内存存储数据,在执行每一个命令前,会调用freeMemoryIfNeeded()检测内存是否充足
注意:逐出数据的过程不是100%能够清理出足够的可使用的内存空间,如果不成功则反复执行,当对所有数据尝试完毕后,如果不能达到内存清理的要求,将出现错误信息