Redis 是完全开源的,遵守 BSD 协议,是一个高性能的 key-value 数据库。

Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。

为什么要用 redis

内存存储,不能永久保存,重启后丢失

一般我们只是使用 Redis 存储一些常用和主要的数据,减少数据库的压力

使用场景

  1. 一般而言在使用 Redis 进行存储的时候,我们需要从以下几个方面来考虑:
  2. **业务数据常用吗?命中率如何?**如果命中率很低,就没有必要写入缓存;
  3. **该业务数据是读操作多,还是写操作多?**如果写操作多,频繁需要写入数据库,也没有必要使用缓存;
  4. **业务数据大小如何?**如果要存储几百兆字节的文件,会给缓存带来很大的压力,这样也没有必要;

原生命令

Redis命令十分丰富,包括的命令组有Cluster、Connection、Geo、Hashes、HyperLogLog、Keys、Lists、Pub/Sub、Scripting、Server、Sets、Sorted Sets、Strings、Transactions一共14个redis命令组两百多个redis命令

  1. String
  2. GET/MGET
  3. SET/SETEX/MSET/MSETNX
  4. INCR/DECR
  5. GETSET
  6. DEL
  7. List的操作命令如下:
  8. LPUSH/LPUSHX/LPOP/RPUSH/RPUSHX/RPOP/LINSERT/LSET
  9. LINDEX/LRANGE
  10. LLEN/LTRIM
  11. 集合
  12. SADD/SPOP/SMOVE/SCARD
  13. SINTER/SDIFF/SDIFFSTORE/SUNION

五大数据类型

redis提供五种数据类型:string,hash,list,set及zset(sorted set)

字符串,不仅能够存储字符串、还能存储图片、视频等多种类型, 最大长度支持512M
列表
哈希,field和value都是字符串类型的
集合 Set,元素没有顺序,且唯一
顺序集合 ZSet

特性 - 事务

特性 - 持久化

为了应对高并发,将数据先存在 redis,然后再将redis的数据同步到数据库中

特性 - 发布订阅

常见问题 - 缓存穿透

概念:在Redis获取某一key时, 由于key不存在, 而必须向DB发起一次请求的行为, 称为“Redis击穿”。

  1. 引发击穿的原因:
  2. 第一次访问
  3. 恶意访问不存在的key
  4. Key过期
  5. 合理的规避方案:
  6. 服务器启动时, 提前写入
  7. 规范key的命名, 通过中间件拦截
  8. 对某些高频访问的Key,设置合理的TTL或永不过期

常见问题 - 雪崩

Redis缓存层由于某种原因宕机后,所有的请求会涌向存储层,短时间内的高并发请求可能会导致存储层挂机,称之为“Redis雪崩”。 合理的规避方案:

  • 使用Redis集群
  • 限流

Spring Boot 中使用

  1. <!-- Radis -->
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-data-redis</artifactId>
  5. </dependency>

参考

葡萄城 - Redis是什么?看这一篇就够了