搞懂这些Redis知识点

Redis是什么

Redis 是一种NoSql数据库,是 C 语言开发的一个开源的(遵从 BSD 协议)高性能键值对(key-value)的内存数据库,可以用作数据库、缓存、消息中间件等。

优点

  • 性能优秀,数据在内存中,读写速度非常快,支持并发 10W QPS。
  • 单进程单线程,是线程安全的,采用 IO 多路复用机制。
  • 丰富的数据类型,支持字符串(strings)、散列(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)等。
  • 支持数据持久化。可以将内存中数据保存在磁盘中,重启时加载。
  • 主从复制,哨兵,高可用。
  • 可以用作分布式锁。
  • 可以作为消息中间件使用,支持发布订阅。

6种数据类型的介绍

  • String是Reids最基本的数据类型,是一个key对应一个Value。Value不仅可以是string,也可以是数字。String的类型是二进制的,Redis 的 String 类型可以包含任何数据,比如 jpg 图片或者序列化的对象。String 类型的值最大能存储 512M。
  • Hash是一个键值(key-value)的集合。Redis 的 Hash 是一个 String 的 Key 和 Value 的映射表,Hash 特别适合存储对象。常用命令:hget,hset,hgetall 等。每个 hash 可以存储 2^32 - 1 键值对(40多亿)。
  • List 列表是简单的字符串列表,按照插入顺序排序。可以添加一个元素到列表的头部(左边)或者尾部(右边) 常用命令:lpush、rpush、lpop、rpop、lrange(获取列表片段)等。list的使用场景很多因为List就是链表,可以用来当消息队列用。也可以用于比如微博的粉丝列表。
  • 集合(Set)是 String 类型的无序集合。集合是通过 hashtable 实现的。Set 中的元素是没有顺序的,而且是没有重复的。常用命令:sdd、spop、smembers、sunion 等。Set的功能和list差不多特殊之处在于 Set 是自动去重的,set还可以判断某个成员是否在集合中。
  • 有序集合(sorted set)和 Set 一样是 String 类型元素的集合,且不允许重复的元素。常用命令:zadd、zrange、zrem、zcard 等。使用场景Sorted Set 可以提供一个额外的优先级来自动排序。
  • HyperLogLog 注:Redis 在 2.8.9 版本添加的HyperLogLog 结构。Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。 在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。 但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。常用命令:pzadd、pfcount、pfmerge 等。

使用Redis遇到的问题

Redis雪崩

比如一个团购项目所有商品的缓存key的有效时间都是12小时早上8点去刷新晚上8点有大量的用户请求,假如有6000个请求本来缓存可以抗住每秒5000个请求但是缓存key失效了。这个时候所有的压力都落在了数据库上。数据库必然是扛不住会挂掉,挂掉后在重启还是一样。这个时候就会大面积瘫痪,这就是redis的雪崩。

如何处理那?

在业务层在批量Redis里面赋值的时候在过期时间后面加上随机数避免数据同时失效。或者设置数据不要失效更新数据库的时候更新缓存数据。如果Redis是集群部署可以将缓存部署在不同的Redis上面。

缓存穿透和击穿

  • 缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求。比如我们的团购商品id都是自增的。如果用户发起一个id=-1或者id很大的数据这样的不断请求导致数据库压力很大,严重会击垮数据库。
  • 缓存击穿是指一个Key非常热点,在不停地扛着大量的请求,大并发集中对这一个点进行访问,当这个 Key 在失效的瞬间,持续的大并发直接落到了数据库上,就在这个 Key 的点上击穿了缓存。
鲁ICP备16017569号-2