12 Redis

约 3 分钟 · 608 字评论
请注意,本文编写于 784 天前,最后修改于 145 天前,其中某些信息可能已经过时。

Redis

项目中的使用场景

基本数据类型和使用场景

String

  1. 数据类型安全
  2. k-v对
  3. 可以设置key的过期时间
java
set key value get key set expiretime key setnx key value

使用场景
只要数据可以按照 k-v对形成字符串类型,都可以使用string存储,并可以设置精确到key的ttl
可用于缓存对象,用incr命令统计文章的阅读量等

List

  1. 单键多值
  2. 按照插入顺序排序
java
lpush key value1 value2... rpop key 从list右边删除一个元素 llen key # 查看list的长度 lrange key 0 -1 # 查看该key的所用元素

使用场景
消息队列,按照时间周期性更新的排行榜(lrange)等

Hash

  1. 单键多值,每个value类似Java中的Map类型
java
hset key field1 value1 field2 value2... hget key field

使用场景
存储对象实例,用户的购物车(hset userId skuId nums)

Set

元素不可重复的集合

java
sadd key member1 member2 ... smembers key # 去除一个集合中的所有元素 sinter key1 key2 .. # 对多个集合取交集 sunion key1 key2 .. # 对多个集合取并集 sdiff key1 key2 .. # 对多个集合取差集

使用场景
共同关注好友等(sinter)

Zset

  1. 数据不可重复的集合
  2. 数据按照score进行排序
java
zadd key score1 member1 socre2 member2 ... # 向集合加入元素 zrangebyscore key start end withsocres # 从集合中取出指定score范围的数据,默认从小到大

使用场景
排行榜等问题(zadd rank value1 key1 value2 key2 ; ZREVRANGEBYSCORE rank 3 0取前三名)

项目中使用Flink状态和Redis作为旁路缓存的对比

Flink的状态收到flink内部的管理,无法使用其他的进程访问Flink内部的状态做缓存的更新,故排除
使用旁路缓存需要考虑的点:

  1. 旁路缓存中数据需要更新如何保证数据源和缓存的一致性
java
# 主要考虑维度数据发生变更时,将缓存中的旧维度数据做一个同步的更新 # 则当向HBase写维度数据,判断通过maxwell实时采集的ODS层数据是否类型为Update?,为Update,则说明维度数据发生了变更 # 此时需要删除redis中的旧缓存即可,保证了redis总是最新的维度数据
  1. 对缓存长期未命中的数据是否需要设置过期时间,否则冷数据将会占用大量的内存
java
# 项目中使用了热缓存的方式,即设置了缓存的ttl,为2天,主要是维度数据 // 写维度数据到redis String key = tableName + ":" + id; // 并设置key的生命周期为2天 client.setex(key,24 * 2 * 60 * 60,dim.toJSONString());

缓存击穿

何为缓存击穿?单一数据热点,高并发访问导致缓存失效
一般来说维度数据读取不会存在高并发访问的情况,故不会出现缓存击穿

缓存穿透

大量无效的key即不存在与redis,也不存在数据库,造成数据的访问压力
HBase中维度总是来源于ODS中过滤出的维度数据,之后写入HBase;当DWS层需要维度,首先向Redis读取,redis无所需的数据,才会向HBase读取,稍后就写入Redis,不会出现缓存穿透问题

缓存雪崩

缓存雪崩指的是大量的热点数据无法在 Redis 缓存中处理(大面积热点数据缓存失效、Redis 宕机),流量全部打到数据库,导致数据库极大压力
目前的系统是存在缓存雪崩的问题的!!!!

版权声明

本文作者:hedeoer

本文链接:/post/__gh__52

许可说明:本博客所有文章除特别声明外,均采用 许可协议。转载请注明出处!

12 Redis

0

匿名访客仅支持文本评论。

暂无评论