Redis学习笔记

Redis是什么?

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

Redis的应用场景

通常把Redis当成内存数据库(如登录信息)、缓存服务器(如商品信息)、解决分布式集群架构中的session共享问题等。之前在工作中,我们同时用了Redis和Memcached两种缓存。两者分工明确,Redis用于业务数据缓存,Memcached用于接口数据缓存。我们所谓的业务数据缓存,是指把和用户相关的业务数据缓存起来,让用户登录和收听速度更快,有更好的用户体验。我们用Redis缓存的业务数据有:用户sessionId、验证码、验证码发送次数;用户账号、角色、权限、收藏、上次收听状态等;内容分类、播放地址等。我们所谓的接口数据缓存,是在代码层面把提供给客户端的接口数据缓存起来。

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会自动将内存中的数据进行快照并持久化到硬盘。

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

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

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值