SpringBoot整合Redis缓存

了解redis

Redis是一种用键值对格式存储数据的NoSQL数据库,由于Redis数据库是在内存中缓存数据的,因此他的读写性能很高
优点:

  1. 读写数据的性能较高
  2. 支持多种数据类型
  3. 支持数据持久化

缺点

  1. 较难支持扩容操作
  2. 数据过多时造成内存问题
  3. 基于单线程操作,持久化等操作时会阻塞工作线程

Redis常用命令

set和get

set key value [ex seconds][PX milliseconds] [NX|XX]

set student_001 perter EX 3600
get student_001

del命令

del student_001

exits命令

判断指定的键是否存在

exists student_001

Redis基本数据类型

字符串类型

mset和mget命令同时设置和读取多个字符串类型的数据

mset key value [key velue...]
mget key [key...]

Hash类型

Redis中通过Hash类型的变量来缓存对象数据

hset key field value
hget key field

列表类型

在Redis中,可以用列表的形式在一个健中存储一个或多个数据。具体可以通过lpush命令把一个和多个值依次插入列表的头部
通过index命令可以读取列表格式的值,其中通过key参数能指定待读取的列表,通过index能指定待读取列表值的索引号,从0开始##

lpush key element [element...]
lindex key index

集合类型

和列表相似,但是不能重复

sadd key member [member ...]
smember key

有序集合类型

和集合相似,不过在有序集合中,每个元素都会对应一个score参数,依此来描述该数据在有序集合中的分数,并且该分数是有序集合中排序的基础
NX参数表示只有当key对应的有序集合不存在时才能添加元素,而XX参数表示当有序集合存在时才能添加元素
通过zrange命令能读取指定key中score区间范围内的数据,其中start和stop表示最低和最高的score,如果带WITHSCORES参数,则会同时显示元素所对应的score值

zadd key [NX}XX] [CH] [INCR] score member [score member ...]
zrange key start stop [WITHSCORES]

SpringBoot整合数据库与Redis缓存

在数据库整合Redis缓存时,应用程序会先从Redis服务器中读取数据,如果读到则直接使用,否则访问数据库,同时把从数据库中读到的数据放入缓存
在删除数据时,会在删除数据库中数据的同时删除缓存中的数据,更新时,首先删除缓存数据,在更新数据库数据

防缓存穿透的设计

如果在高并发的场景中,大量的查询请求会“穿透Redis缓存”,如果并发量超过了数据库的负载,数据库就会无法继续接受请求,从而造成严重的产线问题。
防穿透的做法是,缓存null值和数据库不存在的健,这些请求会被Redis挡住,就不会再到数据库中查询一遍。

防内存溢出的设计

如果不设置超时时间,每次的缓存数据就会一直保存在内存中,时间长了,就会导致内存溢出问题。
可以在缓存数据时为每个数据设置一个合理的超时时间。
采用整数加随机数的方式,从而在避免内存溢出的同时,也能避免缓存穿透问题