redis是一款非关系型数据库。
用于数据缓存,高访问,存储量不大。
MySQL磁盘数据库,安全性高;Redis内存数据库,访问速度快,提高访问性能。

在虚拟机启动redis服务:进入src目录中,./redis-server redis.conf
启动客户端的方式:在src目录中,./redis-cli

Redis数据类型

Redis中文网:https://www.redis.net.cn
http://doc.redisfans.com/
上面两个网站里面有所有的命令详解

Redis存储的是key-value结构的数据,其中key是字符串类型,value有5种常用的数据类型:

  • 字符串 string:普通字符串,常用
  • 哈希 hash:适合存储对象
  • 列表 list:按照插入顺序排序,可以有重复元素
  • 集合 set:无序集合,没有重复元素
  • 有序集合 sorted set / zset:集合中每个元素关联一个分数(score),根据分数升序排序,没有重复元素

redis的五种数据类型.png

字符串string操作命令

  • SET key value 设置指定key的值
  • GET key 获取指定key的值
  • SETEX key seconds value 设置指定key的值,并将 key 的过期时间设为 seconds 秒
  • SETNX key value 只有在 key 不存在时设置 key 的值
  • del key1 key2 … 删除指定的key数据

image.png
注意:每个value限制了512MB大小

哈希hash操作命令

Redis hash 是一个string类型的field和value的映射表,hash特别适用于存储对象
hash里面含有的键值对个数有限制,限制42亿以内
常用命令:

  • HSET key field value 将哈希表 key 中的字段 field 的值设为 value
  • HGET key field 获取存储在哈希表中指定字段的值
  • HDEL key field 删除存储在哈希表中的指定字段
  • HKEYS key 获取哈希表中所有字段
  • HVALS key 获取哈希表中所有值
  • HGETALL key 获取在哈希表中指定 key 的所有字段和值

image.png

列表list操作命令

Redis列表是简单的字符串列表,按照插入顺序排序,类似于java中的linkedList(双向链表),value的个数限制42亿个以内。
常用命令:

  • LPUSH key value1 [value2] Left, 将一个或多个值插入到列表头部(左部), rpush是从尾部插入
  • LRANGE key start stop 获取列表指定范围内的元素
  • RPOP key 移除并获取列表最后一个元素 lpop从左侧头部删除一个元素
  • LLEN key 获取列表长度
  • BRPOP key1 [key2 ] timeout 移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超 时或发现可弹出元素为止,超时时间单位秒

image.png
image.png
应用场景:数据已经固定的排行榜(这里排序不是实时的,而是插入后顺序就固定的)

集合set操作命令

Redis set是string类型的无序集合,集合成员是唯一的,不能出现重复的数据。

  • SADD key member1 [member2] 向集合添加一个或多个成员
  • SMEMBERS key 返回集合中的所有成员
  • SCARD key 获取集合的成员数
  • SINTER key1 [key2] 返回给定所有集合的交集
  • SUNION key1 [key2] 返回所有给定集合的并集
  • SDIFF key1 [key2] 返回给定所有集合的差集, 含义是key1有哪个元素在key2中不存在
  • SREM key member1 [member2] 移除集合中一个或多个成员

image.png

有序集合sorted set操作命令

Redis sorted set 有序集合是string类型元素的集合,且不允许重复的成员。每个元素都会关联一个double类型的分数(score)。redis正是通过分数来为集合中的成员进行从小到大排序。有序集合的成员是唯一的,但分数却可以重复。
常用命令:

  • ZADD key score1 member1 [score2 member2] 向有序集合添加一个或多个成员,或者更新已存在成员的 分数
  • ZRANGE key start stop [WITHSCORES] 通过索引区间返回有序集合中指定区间内升序排序的成员 zrevrange降序查询
  • ZINCRBY key increment member 有序集合中对指定成员的分数加上增量 increment
  • ZREM key member [member …] 移除有序集合中的一个或多个成员

image.png
image.png
image.png
应用场景:实时排序, 加入的元素的数字就会比较进行重新排序。

通用命令

Redis中的通用命令,主要是针对key进行操作的相关命令:

  • KEYS pattern 查找所有符合给定模式( pattern)的 key * 代表任意0~多个字符? 代表任意1个字符
  • EXISTS key 检查给定 key 是否存在
  • TYPE key 返回 key 所储存的值的类型
  • TTL key 返回给定 key 的剩余生存时间(TTL, time to live),以秒为单位
  • DEL key 该命令用于在 key 存在是删除 key

redis服务器上一共有16个数据库db0,db1,….db15, 如果不指定默认操作数据在db0的数据库上
切换数据库操作的命令 : select 数字
数字范围:0~15image.png

在Java中操作Redis

Jedis

首先导入依赖
image.png

Spring Data Redis

首先导入依赖
Spring Data Redis中提供了一个高度封装的类:RedisTemplate,针对 Jedis 客户端中大量api进行了归类封装,将同一类型操作封装为operation接口,具体分类如下:

  • ValueOperations:简单K-V操作
  • SetOperations:set类型数据操作
  • ZSetOperations:zset类型数据操作
  • HashOperations:针对hash类型的数据操作
  • ListOperations:针对list类型的数据操作

ValueOperations是最常用的,占到百分之99,其他的用到查API
image.png
ValueOperations能大大简化存储java对象的步骤。
在RedisConfig类中:
image.png
在实体类中:
image.png
这里redis存储的是序列化后的数据,默认的是value的jdk序列器,上面两张图是把jdk序列器改为json序列化器,那么在redis数据库读到的就不是序列号了,而是java中传过去的数据。

Redis的持久化机制

如果不做持久化,redis服务器如果异常退出,会导致所有缓存数据丢失,当redis再次开启没有缓存数据,此时所有的都会去数据库查找数据,导致关系型数据库的压力瞬间变大,可能让数据库会崩溃。
原则:尽量不让redis的数据全部丢失,减少mysql的压力,所以redis有持久化机制

redis支持2种持久化机制:RDBAOF, 默认开启的RDB,AOF默认没有开启

RDB

RDB策略也叫快照策略,持久化到一个dump.rdb文件中

有3个条件进行持久化操作,redis.conf 配置文件有设置:
save 900 1 : 如果有1个key进行了增删改操作,那么900秒(15分钟)持久化一次
save 300 10 : 如果有10个key进行了增删改操作,那么300秒(5分钟)持久化一次
save 60 10000 : 如果有10000个key进行了增删改操作,那么60秒(1分钟)持久化一次

RDB特点:

  1. 优点:几分钟持久化一次,持久化频率不高,不会影响redis运行性能
  2. 缺点:由于持久化频率低,会导致数据丢失较严重,比如服务器崩溃了,可能丢失几分钟的数据

    AOF

    第一步:开启AOF策略: 编辑redis.conf:
    开启AOF策略: 编辑redis.conf
    appendonly no 这是默认设置,需要修改为 appendonly yes 代表开启AOF持久化策略, 提供了3种AOF的方式:image.png

appendfsync always :默认没有启用,这是 实时持久化,操作一个key的写入就持久化一次,
appendfsync everysec:这是默认启动的方式,每秒持久化一次,如果使用AOF推荐这个方式
appendfsync no:默认没有启用,是交给redis服务器自己去处理,忙的时候不持久化,空闲的时候再持久化。

第二步: 重启redis服务和应用最新修改的配置文件
AOF特点:

  1. 优点:每秒持久化一次,持久化频率高,数据不易丢失,可能会丢失1秒内的数据。这种方式数据安全较好。
  2. 缺点:持久化频率非常高,在企业实践应用中如果发现非常耗CPU,一般如果CPU的负载超过0.6建议不要使用这个策略,如果是0.6以下是可以开启的

当RDB和AOP同时开启的时候,服务器启动的时候是如何恢复数据?
答:redis4.0以前是如果开启了AOF,只会恢复AOF的数据
这种方式被开发者社区投诉,说不够智能,建议AOF开始备份时间起应该恢复AOF的数据,时间以前应该恢复RDB的数据
redis4.0以后RDB和AOF数据都恢复了,以AOF开始时间点为基准,时间点前面恢复RDB数据,时间点后使用AOF恢复数据