是一个开源的, 使用C语言编写的, 将数据缓存到内存中(程序使用时,可以缓存数据,具有临时性和速度快的特点), key–value(键值对的方式存储)的一种非关系型数据库(严格来说不是一种数据库,只是一种数据存储结构),它支持多种数据类型存储(例如: String 字符 Hash 哈希 List 列表 Set 集合 zset 有序集合 ).
采用关系模型来组织数据的数据库,表与表,列与列,和字段之间的关系存储数据的
优点:
容易理解
使用方便(有通用的sql语句)
易于维护,丰富的完整性,极大的降低了数据的冗余和数据不一致概率缺点
缺点:
磁盘I/O是并发的瓶颈
由于大量的数据导致查询效率降低
横向扩展困难,无法简单的通过硬件和服务节点来扩展性能和负载能力
当需要对数据库进行升级和扩展时,需要停机和数据迁移(工作量增加)
因为要保证数据的安全性,所以 事务控制+锁 导致性能降低
分布式,不遵循ACID原则的数据存储系统.键值对存储,结构不稳定
优点:
根据所需要的字段直接添加,不需要考虑多表关系.仅取对应的vlue,可以说不是数据库,而是一种数据结构化存储方法的集合
缺点:
只适合存储一些较为简单的数据
不适合复杂查询的数据
不适合持久存储数据
String(字符串)
是redis最基本的数据类型,一个key对应一个value
是二进制安全的,意味着他可以包含任何数据,比如 jpg图片或序列化的对象
最大能存储512MB
Hash(哈希)
是一个键值对(key=>value)集合.
是一个String类型的field和value的映射表, 比较适合存储对象
List(列表)
是最简单的字符串列表,按照插入顺序排序,添加元素可以是头部或者尾部
Set(集合)
是String类型的无序集合
是通过哈希表实现的,所以增删改的复杂度都是O(1)
添加一个String元素到key对应的集合中,成功返回1,失败返回0,(Set集合的元素是不重复的)
Zset(sorted set: 有序集合)
和set一样,不同的是每个元素都会关联一个double类型的分数,redis通过分数来为集合中的成员进行排序. 其中的成员是唯一的,但分数却可以重复
一般不设置失效时间的话redis会默认为永久存在,所以对于大部分数据我们一般希望他们在一定时间内会自动销毁.redis提供了一些命令可以让我们对key设置失效时间
EX (表示以秒为单位)
PX(表示以毫秒为单位) 不区分大小写
例如: ser name “ming” ex 30 表示数据将会在30秒后失效
ttl 键 查询数据的剩余失效时间(秒)
pttl 键 查询数据的剩余失效时间(毫秒)
expire 键 (秒)
pexpire 键 (毫秒)
Jedis是redis官方推出的一款面向java的客户端,提供了一些接口供java使用
Spring-data-redis是spring大家族的一部分,提供了在spring中通过简单的配置访问redis服务,它对redis的底层进行了高度封装,RedisTemplate提供了redis的各种操作
1.添加redis依赖
org.springframework.boot spring-boot-starter-data-redis配置连接 redis
spring:
redis:
host: 192.168.31.133
port: 6379
password: 123456
database: 0
pool:
max-active: 8 # 连接池最大连接数(使用负值表示没有限制)
max-wait: -1ms # 连接池最大阻塞等待时间(使用负值表示没有限制)
max-idle: 8 # 连接池中的最大空闲连接
min-idle: 0 # 连接池中的最小空闲连接
timeout: 5000ms # 连接超时时间(毫秒)
3.注入RedisTemplate
@Autowired
RedisTemplate redisTemplate
需要被Redis缓存的类,必须实现序列化接口
是将一台Redis服务器的数据复制到其他的Redis服务器上.前者称位主节点,后者为从节点,数据的复制是单向的,只能由主节点到从节点.
使用一个Redis实例作为主机,其余的作为备份,主机与从机的数据完全一致.主机支持写入和读取的操作,而从机只是读取和同步数据的作用.也就是说客户端可以将数据写入主机,由主机自动将数据同步到从机.主从模式和好的解决了数据备份问题,并且主从服务的数据几乎完全一致.因此可以将写入的操作交给主机,读取的操作交给从机.从而实现主从分离的目的.
1.数据冗余: 主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式.
2.故障恢复: 当主节点出现问题时,可以有从节点提供服务,快速实现故障恢复.
3.负载均衡: 在主从服务的基础上,配合读写分离. 由主节点提供度服务写服务,由从节点提供读 服务,分担服务器负载. 通过多个从节点分担负载.可以大大提高Redis服务器的并发量
4.高可用(集群)基石: 石哨兵和集群能够实施的基础. 主从复制是Redis高可用的基础
首先Redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独立运行.其原理是哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例
单哨兵: 以独立的进程监控服务器Redis是否正常执行
哨兵集群: 除了监控各个Redis服务器之外,哨兵之间也会互相监控.
数据库中没有key; 客户端利用数据库中没有的key区访问缓存,缓存中没有就去数据库请求,数据库也没有返回空,如果反复此操作,就可能击垮数据库
数据库没有,缓存中也没有
key在某个时间节点过期了,此时如果有大量的并发请求过来,就会从后端DB加载数据并返回给缓存,但是大量的并发请求可能会直接把DB压垮.
在高并发的情况下,大量的数据失效/缓存层出现故障.于是所有的请求就会到达数据库,数据库由于调用量的增加也会挂掉.
总结: 穿透是数据库没有key,击穿是一个热点key突然失效,雪崩是多个key同时失效
事发前:
实现Redis的高可用(主从架构+哨兵),尽量避免Redis挂掉的情况.
事发中:
如果挂掉了,我们可以设置本地缓存+限流,尽量避免我们的数据库被干掉(还可以保证服务能够正常操作)
事发后:
redis持久化,重启后自动从磁盘上加载数据,快速恢复缓存数据
定时删除:在设置键的时间时,同时设置一个计时器.当键过期时,立即执行对键的删除操作
惰性操作:当获取键时,判断键是否过期,如果过期,就立即删除返回空,如果没有过期,返回该键
定期操作:每个一段时间,对键进行一次检查,删除里面的过期键.
小结:定时删除对CPU不友好,当过期键比较多时就会影响正常的请求; 惰性删除对CPU友好,但是会占用大量的内存.因为如果键没有被删除那么它就会一直占用着内存. 定期删除策略对CPU好内存都比较友好.因为Redis中过期的key是由主线程删除的,为了不阻塞用户的请求,所以删除的时候尽量少量多次.
实际上是一个很长的二进制向量和一系列映射函数.布隆过滤器可以用于检索一个元素是否在一个集合中.
优点是空间效率和查询时间都比一般的算法低.缺点是误识别率和删除的困难.
算法:
首先需要k个hash函数,每个函数可以把key散列成为一个整数.
初始化时,需要一个长度为n比特的数组,每个比特 初始化都为0
某个key加入集合时,用k个hash函数计算出他的散列值,并把数组中对应的比特位置变为1
判断每个key是否在集合中,当查询到所在的比特位时,如果所有的比特位都为1,则可能在集合中
**注意:**查询出所在的比特位后,如果任何一个点有0,则查询变量一定不存在; 如果都为1,则查询变量可能存在.