vlambda博客
学习文章列表

tyro系列之三:Redis学习笔记

Redis是什么?

   Redis是用C语言开发的一个开源的高性能键值对内存数据库,是一种NoSQL数据库。它提供五种数据类型:string、hash、list,set,zset。

 Redis的应用场景

Redis序列化

  在SpringDataRedis中,RedisTemplate默认使用的是JdkSerializationRedisSerializer,StringRedisTemplate默认使用的是StringRedisSerializer。我们之前习惯用StringRedisTemplate,像验证码本来就是字符串。如果是复杂对象,保存时我们手动调用JSON.toJSONString()把对象转化成字符串,获取时手动调用 JSON.parseObject()还原成对象。这种做法肯定比采用Spring提供的Jackson2JsonRedisSerializer性能要差。我准备以后在项目中具体比较下。

Redis远不止这么多

    一般开发人员,配一个连接池、一个StringRedisSerializer,就可以get、set了,Redis就用起来了。这样还不够。《Redis开发与运维》这本书中给出的“用好Redis的建议”是:1、切勿当做黑盒使用,开发与运维同样重要。2、阅读源码。这本书中说很多线上故障都是把Redis当成黑盒使用造成的。

Redis事务

   Redis本身是单线程的。每个命令都是原子操作。Redis事务服务的对象是命令集合,它将命令集合序列化并确保处于同一事务的命令集合连续且不被打断地执行。它不支持回滚操作。事务是通过MULTI,EXEC,DISCARD和WATCH命令完成的

Redis持久化方案

  Redis提供了两种持久化方案:RDB方式(默认)和AOF方式。RDB方式是通过快照完成的,当符合一定条件时Redis会自动将内存中的数据进行快照并持久化到硬盘。

   开启AOF持久化后每执行一条会更改Redis中的数据的命令,Redis就会将该命令写入硬盘中的AOF文件。

缓存穿透、缓存雪崩缓存击穿

    这几个词是最近才知道的(感觉自己真的像个江湖郎中)。我们通常都是根据key去缓存查询,如果找不到就去DB查询。如果key对应的value是一定不存在的,并且对该key并发请求量很大,就会对DB造成很大的压力。这就叫做“缓存穿透”。

     当缓存服务器重启或者大量缓存集中在某个时间段失效,会给DB带来很大压力。这就叫做“缓存雪崩”。

     某个key的缓存值在某个时间点失效的时候,恰好有大量的请求过来,这些请求发现缓存过期又从DB加载数据并回设到缓存。此时可能瞬间把DB压垮。这就叫“缓存击穿”。 缓存击穿指查询同一个key,缓存雪崩是查询不同key。