这是我参与「第五届青训营 」伴学笔记创作活动的第21天。
Redis
Redis:Remote Dictionary Server,即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
热数据:经常被访问到的数据。
使用Redis的原因:将热数据存储到内存中。
Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。
Redis基本工作原理:数据从内存中读写、数据保存到硬盘上防止重启数据丢失、单线程处理所有操作命令。
Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等多种编程语言客户端,使用很方便。
string数据结构:sds。
String数据的作用:可以存储字符串、数字、二进制数据,通常和expire配合使用。
String数据使用场景:存储计数、Session。
消息队列:用list作为消息队列。
消息队列使用场景:消息通知。
Quicklist:由一个双向链表和listpack实现。
listpack数据结构
hash结构:可以满足多项计数需求,只需要获得hash的key就可以取出hash中存储的多项数据。
分布式锁的作用:并发场景,要求一次只能有一个写成执行,执行完成后,其他等待中的协程才能执行。
Redis锁利用setnx的特性:Redis(旧版)是单线程执行命令、setnx只有未设置过才能执行成功。
大Key的出现是很危险的
String类型大Key的标准:value的字节数大于10KB。
Hash/Set/Zset/list等复杂数据结构大Key的标准:元素个数大于5000个或总value字节数大于10MB。
解决热Key的方法:设置Localcache、拆分、使用Redis代理的热Key承载能力。
会导致慢查询的操作
缓存穿透:热点数据查询绕过缓存,直接查询数据库。
缓存雪崩:大量缓存同时过期。
缓存穿透的危害:查询一个一定不存在的数据、缓存过期。
应对缓存穿透的方法:缓存空值、布隆过滤器。
产品很小可以先更新数据库再操作Redis。
运用canal可以保证一致性。
跳跃的时候不一定是2的幂次方。
在用户很多时,不需要拆分点赞。