介绍一下Redis

Redis是一个由C语言编写的开源高性能非关系型的键值对数据库。Redis 可以存储键和五种不同类型的值之间的映射。键的类型只能为字符串,值支持五种数据类型:字符串、列表、集合、散列表、有序集合。与传统数据库不同的是 Redis 的数据是存在内存中的,所以读写速度非常快,因此 redis 被广泛应用于缓存方向,每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Value DB。另外,Redis 也经常用来做分布式锁。除此之外,Redis 支持事务 、持久化、LUA脚本、LRU驱动事件、多种集群方案。

Redis支持的数据类型

String,List,Set,Zset,Hash

redis每秒qps最大 redis一秒能写入多少key_分布式

Redis有那些优势?

  • 读写性能优异, Redis能读的速度是110000次/s,写的速度是81000次/s。
  • 支持数据持久化,支持AOF和RDB两种持久化方式。
  • 支持事务,Redis的所有操作都是原子性的,同时Redis还支持对几个操作合并后的原子性执行。
  • 数据结构丰富,除了支持string类型的value外还支持hash、set、zset、list等数据结构。
  • 支持主从复制,主机会自动将数据同步到从机,可以进行读写分离。

你们都用Redis干什么?

计数器(使用string);缓存;会话缓存;分布式锁;

扩展:
string: 适合最简单的k-v存储,类似于memcached的存储结构,短信验证码,配置信息等,就用这种类型来存储。

hash: 一般key为ID或者唯一标示,value对应的就是详情了。如商品详情,个人信息详情,新闻详情等。

list: 因为list是有序的,比较适合存储一些有序且数据相对固定的数据。如省市区表、字典表等。因为list是有序的,适合根据写入的时间来排序,如:最新的***,消息队列等。

set: 可以简单的理解为ID-List的模式,如微博中一个人有哪些好友,set最牛的地方在于,可以对两个set提供交集、并集、差集操作。例如:查找两个人共同的好友等。

ZSet: 是set的增强版本,增加了一个score参数,自动会根据score的值进行排序。比较适合做排行榜之类的信息。

了解Redis持久化吗?

持久化就是把内存的数据写到磁盘中去,防止服务宕机了内存数据丢失。
Redis 提供两种持久化机制
RDB快照(默认Redis DataBase):将内存数据以快照的方式保存在.rdb文件中;
AOF 机制(Append-only file):将redis的每次写操作记录到单独的日志文件,当重启Redis会重新将持久化的日志中文件恢复数据。

Redis的过期键的删除策略

  • 定时过期:每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除。该策略可以立即清除过期的数据,对内存很友好;但是会占用大量的CPU资源去处理过期的数据,从而影响缓存的响应时间和吞吐量。
  • 惰性过期:只有当访问一个key时,才会判断该key是否已过期,过期则清除。该策略可以最大化地节省CPU资源,却对内存非常不友好。极端情况可能出现大量的过期key没有再次被访问,从而不会被清除,占用大量内存。
  • 定期过期:每隔一定的时间,会扫描一定数量的数据库的expires字典中一定数量的key,并清除其中已过期的key。该策略是前两者的一个折中方案。通过调整定时扫描的时间间隔和每次扫描的限定耗时,可以在不同情况下使得CPU和内存资源达到最优的平衡效果。

常见的缓存异常你都知道哪些

缓存击穿: 指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力。和缓存雪崩不同的是,缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。

缓存雪崩: 指缓存同一时间大面积的失效,所以,后面的请求都会落到数据库上,造成数据库短时间内承受大量请求而崩掉。

缓存穿透: 指缓存和数据库中都没有的数据,导致所有的请求都落到数据库上,造成数据库短时间内承受大量请求而崩掉。
解决方案:
1.从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,缓存有效时间可以设置短点;
2.采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的 bitmap 中,一个一定不存在的数据会被这个 bitmap 拦截掉,从而避免了对底层存储系统的查询压力

补充知识:
布隆过滤器
我们考虑一个问题,如何从海量元素中判断一个元素是否存在?
这里引入一个巧妙的方法叫位图他是一个有序的数组,只有两个值,0 和 1。0代表不存在,1代表存在。然后我们还需要一个映射关系,可以用到哈希函数就像在hashMap中存数据一样可以均匀分布

布隆过滤器就是用到这样的原理,进过三个哈希函数的计算得出的值如果都为1,那么这个元素可能存在,如果有一个不为1,那么一定不存在,当然这存在一定程度上的误判

redis每秒qps最大 redis一秒能写入多少key_缓存_02


从上我们得出一个很重要的结论(从容器的角度)

如果布隆过滤器判断元素在集合中存在,不一定存在
如果布隆过滤器判断不存在,一定不存在

---------------------------------- 持续更新(个人观点,欢迎纠错)----------------------------------