redis学习
Kale

之前在项目中使用了redis,但是只是简单使用了redis以避免后台数据库中表字段的冗余,现在重新学习一下redis.

数据类型

redis一共有五大数据类型,分别是:

  • 字符串(String): 简单来说就是键值对,即映射,一个键对应一个值,命令为SET name kale,GET name.项目中用过这个数据类型,在设计新的消息功能的时候,在redis中为用户设置自增值,自增值代表新的消息数量.
  • 哈希(Hash): redis hash是一个string类型的key和value的映射表.所以非常适合存储对象,命令为HSET,HGET, HMGET, HMSET,加了M则是代表对多个键值对进行操作.
  • 列表(List): 列表是简单的字符串列表,可以类比为python中的列表,是链表结构,可以添加元素到头部或者尾部,命令为LPUSH, RPUSH, LPOP, RPOP, LLEN等.
  • 集合(SET): 集合是字符串类型的无序集合,集合中元素不能重复,命令有SADD, SDIFF等.
  • 有序集合(sorted set): 有序集合与集合不同的是在有序集合中每个元素都会关联一个double类型的分数,redis通过分数对集合中的元素进行排序.,命令有ZADD, ZCARD等等.

应用场景

字符串的应用场景很多,常规的可以存储数量,比如点赞数,新的消息数等等.

哈希则是字符串的功能升级版,如果要存储一个对象的很多个属性,为了避免键的冗余,直接采用hash存储会比较方便.

列表可以用来解决点赞的相关功能,但是我在做项目的时候使用集合解决的,不过好像没什么太大的区别.

集合相比于列表来说,更加关注集合之间的运算,比如一个人的好友是一个集合A,另一个人的好友是集合B,那么集合A和集合B的差集则可以理解为可能认识的人.

有序集合则是可以理解为集合的一个补充,经典使用场景则是需要实时动态更新的排行榜.

redis的持久化

redis是内存数据库,肯定会面临断电或者服务停止后数据丢失的问题,所以dredis是支持数据持久化的,持久化有两个方案,分别是RDB和AOF.

RDB持久化

RDB持久化是把当前进程数据生成快照保存到硬盘的过程,触发RDB持久化过程分为手动触发和自动触发,手动触发对性能影响较大,所以一般使用自动触发,自动触发可以设置多长时间持久化一次.

RDB的优点是.rdb文件是一个非常紧凑的二进制文件,代表redis在某一时刻的数据快照,非常适合进行每隔多长时间进行的容灾备份.并且恢复数据的速度远远优于AOF策略,不过缺点是不是实时持久化,也就是可能会造成少量数据丢失的问题,不过我觉得这就是和AOF之间应用场景不同的问题.

AOF持久化

AOF持久化是以独立日志的方式记录每次写命令,重启时再重新执行AOF文件中的命令达到恢复数据的目的,实现了实时持久化.

另外可以通过expire设置数据类型的时效,失效的数据会自动删除,而采用AOF持久化策略时,需要定期对AOF文件进行重写,因为重写失效的数据不会再被写入内存,所以可以有效减小AOF文件的大小.

缓存问题

一个请求的处理过程是这样的:
Avatar

可以类比为操作系统中的快表机制,先查询缓存,如果没有查到,再查数据库,如果查到了就更新缓存,然后返回正确数据.

缓存穿透

缓存穿透是指缓存和数据库中都没有的数据,但是用户不断发起请求查询,这样相当于绕过了缓存,不断查询数据库,增大了数据库的压力,解决方案则是在接口层增加校验,进行一些过滤,防止直接查询.

缓存击穿

缓存击穿是指缓存中没有但是数据库中有的数据,这时相当于没有缓存了,因为所有的请求都会去读取数据库,增加了数据库的压力.

不同的场景有不同的解决方案,比如一个产品刚刚上线,第一时间肯定是高并发的查询状态,那么可以先进行缓存预热,将热点数据先存到缓存中.

在缓存中已经有热点数据后,可以设置热点数据的时效为永不过期,这样可以有效避免缓存击穿.

缓存雪崩

缓存雪崩其实也是属于缓存击穿的,但是稍有不同的是缓存雪崩指同一时间内大量缓存数据过期,导致查询不同的数据全部都要查询数据库,增大数据库的压力.和缓存击穿不同的是缓存雪崩指大量数据,而缓存击穿则是针对一条数据.解决方案是可以将过期时间设为随机,或者永不过期,避免缓存雪崩.

扩展知识

使用redis后,还是对数据库实时操作的,虽然有时候避免查询数据库,但是需要查询的数据库的时候都是实时操作的,为了更好地解决高并发问题,可以使用消息队列来进行削峰填谷.

简单了解了一下消息队列,即是将请求先存到消息队列,然后慢慢进行数据库操作,可以理解为一个缓冲带,在数据库查询数低谷时增加查询量,在高峰期时减小查询量,即起到了削峰填谷的作用.

  • 本文标题:redis学习
  • 本文作者:Kale
  • 创建时间:2020-03-14 12:38:16
  • 本文链接:https://kalew515.com/2020/03/14/redis学习/
  • 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!