redis总结

1、什么是redis
  • redis是一个 key-value的 高性能 数据库,是基于内存的;
2、redis的特点
  • 本身是key-value的
  • 内存数据库
  • 可以选择性的进行持久化
  • 性能非常高(每秒10w次读写)是已知的性能最高的数据库
3、redis支持的数据类型
  • string
  • list(底层是链表)
  • set(可以求交集,并集)
  • sortset
  • hash
4、为什么redis要把数据放在内存中
  • 为了达到最快的读写
  • 虽然在内存但是可以异步进行数据落盘
  • 如果不放入内存,io 消耗非常大
  • 在内存越来越便宜的今天,肯定会原理越受欢迎
5、redis 是单进程单线程的
  • redis利用队列技术将开发访问变为串行访问,消除了传统数据库的串行开销
6、虚拟内存
  • 当你的key很小而value很大时,使用VM的效果会比较好.因为这样节约的内存比较大.
    当你的key不小时,可以考虑使用一些非常方法将很大的key变成很大的value,比如你可以考虑将key,value组合成一个新的value.
  • vm-max-threads这个参数,可以设置访问swap文件的线程数,设置最好不要超过机器的核数,如果设置为0,那么所有对swap文件的操作都是串行的.可能会造成比较长时间的延迟,但是对数据完整性有很好的保证.
  • 自己测试的时候发现用虚拟内存性能也不错。如果数据量很大,可以考虑分布式或者其他数据库
7、分布式
  • redis 支持主从模式,原则:master会将数据同步到slave,而slave不会将数据同步到master,slave启动时会连接master来同步数据
  • 这是一个典型的分离模型,master负责插入数据,slave 负责检索数据,这样可以提高性能
8、读写分离模型
  • 为了增加读取数据,可以横向添加slave节点
  • 为了防止master 的单点故障,集群一般都会采用2台master ,这样读写都会很快
  • 读写分离的缺陷是:不管是master还是slave,每个节点都必须保存完整的数据,如果数据的量很大的情况下,集群的扩展能力还是受限于每个节点的储存能力,而且对于write-intensive 类型的应用,读写分离架构并不合适
9、数据分片模型
  • 为了解决读写分离的缺陷,可以进行数据分片模型
  • 可以讲每个几点看成是独立的master,然后根据业务把每个master分成master和多个slave组成的模型
10、redis的回收策略
  • volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
  • volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
  • volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
  • allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
  • allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
  • no-enviction(驱逐):禁止驱逐数据
11、使用redis的好处
  • 速度快
  • 数据类型丰富
  • 支持事务(原子性)
  • 丰富的特性(缓存、列表等)
12、redis比memchad有哪些优势
  • reidis 数据类型丰富,memche 只支持string
  • reidis的速度快
  • redis 可以进行持久化
  • redis的value 最大可以1G memche最大1M
13、redis的常见性能问题和解决方案
  • Master最好不要做任何持久化工作,如RDB内存快照和AOF日志文件
  • 如果数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一次
  • 为了主从复制的速度和连接的稳定性,Master和Slave最好在同一个局域网内
  • 尽量避免在压力很大的主库上增加从库
  • 主从复制不要用图状结构,用单向链表结构更为稳定,即:Master <- Slave1 <- Slave2 <- Slave3...
    这样的结构方便解决单点故障问题,实现Slave对Master的替换。如果Master挂了,可以立刻启用Slave1做Master,其他不变。
14、mysql有2000w数据,redis中只有20w的数据,如何保证redis中的数据都是热点数据

相关知识:redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。redis 提供 6种数据淘汰策略:

  • 参考redis的回收策略
15、memcache与redis的区别有哪些
  • 储存方式(一个可以持久化,一个不行)
  • 数据的支持类型(redis丰富)
  • 使用底层模型不同
    它们之间底层实现方式 以及与客户端之间通信的应用协议不一样。
    Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。
  • value 的大小不一样
16、redis常见的想能问题有哪些,如何解决
  • Master写内存快照,save命令调度rdbSave函数,会阻塞主线程的工作,当快照比较大时对性能影响是非常大的,会间断性暂停服务,所以Master最好不要写内存快照。
  • Master AOF持久化,如果不重写AOF文件,这个持久化方式对性能的影响是最小的,但是AOF文件会不断增大,AOF文件过大会影响Master重启的恢复速度。Master最好不要做任何持久化工作,包括内存快照和AOF日志文件,特别是不要启用内存快照做持久化,如果数据比较关键,某个Slave开启AOF备份数据,策略为每秒同步一次。
  • Master调用BGREWRITEAOF重写AOF文件,AOF在重写的时候会占大量的CPU和内存资源,导致服务load过高,出现短暂服务暂停现象。
  • Redis主从复制的性能问题,为了主从复制的速度和连接的稳定性,Slave和Master最好在同一个局域网内
17、redis最适合的场景

Redis最适合所有数据in-momory的场景,虽然Redis也提供持久化功能,但实际更多的是一个disk-backed的功能,跟传统意义上的持久化有比较大的差别,那么可能大家就会有疑问,似乎Redis更像一个加强版的Memcached,那么何时使用Memcached,何时使用Redis呢?
如果简单地比较Redis与Memcached的区别,大多数都会得到以下观点:
Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
Redis支持数据的备份,即master-slave模式的数据备份。
Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。

  • 回话缓存
    最常用的一种使用Redis的情景是会话缓存(session cache)。用Redis缓存会话比其他存储(如Memcached)的优势在于:Redis提供持久化。当维护一个不是严格要求一致性的缓存时,如果用户的购物车信息全部丢失,大部分人都会不高兴的,现在,他们还会这样吗?
    幸运的是,随着 Redis 这些年的改进,很容易找到怎么恰当的使用Redis来缓存会话的文档。甚至广为人知的商业平台Magento也提供Redis的插件。
  • 全页缓存
    除基本的会话token之外,Redis还提供很简便的FPC平台。回到一致性问题,即使重启了Redis实例,因为有磁盘的持久化,用户也不会看到页面加载速度的下降,这是一个极大改进,类似PHP本地FPC。
    再次以Magento为例,Magento提供一个插件来使用Redis作为全页缓存后端。
    此外,对WordPress的用户来说,Pantheon有一个非常好的插件 wp-redis,这个插件能帮助你以最快速度加载你曾浏览过的页面。
  • 队列
    Reids在内存存储引擎领域的一大优点是提供 list 和 set 操作,这使得Redis能作为一个很好的消息队列平台来使用。Redis作为队列使用的操作,就类似于本地程序语言(如Python)对 list 的 push/pop 操作。
    如果你快速的在Google中搜索“Redis queues”,你马上就能找到大量的开源项目,这些项目的目的就是利用Redis创建非常好的后端工具,以满足各种队列需求。例如,Celery有一个后台就是使用Redis作为broker,你可以从这里去查看。
  • 排行榜、计数器
    Redis在内存中对数字进行递增或递减的操作实现的非常好。集合(Set)和有序集合(Sorted Set)也使得我们在执行这些操作的时候变的非常简单,Redis只是正好提供了这两种数据结构。所以,我们要从排序集合中获取到排名最靠前的10个用户–我们称之为“user_scores”,我们只需要像下面一样执行即可:
    当然,这是假定你是根据你用户的分数做递增的排序。如果你想返回用户及用户的分数,你需要这样执行:
    ZRANGE user_scores 0 10 WITHSCORES
    Agora Games就是一个很好的例子,用Ruby实现的,它的排行榜就是使用Redis来存储数据的,你可以在这里看到。
  • 发布、订阅
    最后(但肯定不是最不重要的)是Redis的发布/订阅功能。发布/订阅的使用场景确实非常多。我已看见人们在社交网络连接中使用,还可作为基于发布/订阅的脚本触发器,甚至用Redis的发布/订阅功能来建立聊天系统!(不,这是真的,你可以去核实)。
    Redis提供的所有特性中,我感觉这个是喜欢的人最少的一个,虽然它为用户提供如果此多功能
18 进阶总结
  • 为什么使用redis
    1、高性能
    2、高并发

  • 使用redis有什么缺点
    1、缓存和数据库的双写一致性问题
    2、缓存雪崩
    3、缓存击穿
    4、缓存的并发竞争

  • 单线程redis为什么这么快
    1、单线程避免线程上下文切换
    2、纯内存操作
    3、采用非阻塞i/o多路复用机制

  • redis 数据类型,以及每种类型的使用场景
    1、string
    单点登录系统的session保存

2、hash
订单保存
购物车保存

3、list
伪消息队列
并集 交集

4、set
去重

5、sortset
比set多了一个权重core参数,多了一个排序

  • redis的过期策略以及内存淘汰机制
    1、如果redis只能存5g数据,你要写10g数据怎么办?
    2、如果你设置了数据的过期时间,但是时间到了,内存占用率还是很高,原因是什么?

3、内存的定时删除celue
定时删除
有一个定时器专门复杂删除过期的key,但是在大量的并发时,它是浪费资源的,cup应该用在key的读写上 而不是用在删除key上

定期删除+惰性删除
定期删除,就是每隔段时间(100ms)就是随机抽取过期的key进行删除,这样造成有一些就不会删除,这时惰性删除就排上用场了
惰性删除是在key被使用的时候 先判断是否过期,如果过期则删除,不过期则用
当然,定时删除+惰性删除也会存没有被随机到也没访问的key岂不是一直在?
这时就需要内部淘汰机制
内部淘汰机制
在redis.conf中有一行配置

# maxmemory-policy volatile-lru

#参数:其他的不说明 这是最常用的
allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的 Key。推荐使用,目前项目在用这种
  • redis和数据库的双写一致性问题
    1、强一致性 就是不用缓存
    2、最终一致性 用缓存,但是从根本上无法避免读写一致性问题,只能优化,

  • 如何应对缓存穿透和缓存雪崩的问题
    1、缓存穿透:黑客去请求缓存中不存在的数据,则就会出现大量的并发出现在数据库上,从而数据库异常
    解决:
    1、互斥锁
    2、异步更新策略(其实就是即使的更新缓存,eg 每次开机更新缓存)
    3、提供一个能迅速判断请求是否有效的拦截机制

2、缓存雪崩:缓存同一时间集体大面积失效,这个时候来了一大波请求,结果都怼到数据库上了,
解决:
1、缓存失效时间加上随机数 避免集体失效
2、使用互斥锁(是从数据库方面考虑,但是性能降低了)
3、双缓存(一个有失效时间 一个没有)

  • 如何解决redis的并发竞争key的问题
    1、事务( 不推荐)
    2、不分顺序(分布式锁)
    3、分顺序(分布式锁+时间戳标记)

参考文章

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351

推荐阅读更多精彩内容

  • 本文是我自己在秋招复习时的读书笔记,整理的知识点,也是为了防止忘记,尊重劳动成果,转载注明出处哦!如果你也喜欢,那...
    波波波先森阅读 3,424评论 0 40
  • 文章已经放到github上 ,如果对您有帮助 请给个star[https://github.com/qqxuanl...
    尼尔君阅读 2,284评论 0 22
  • 超强、超详细Redis入门教程 转载2017年03月04日 16:20:02 16916 转载自: http://...
    邵云涛阅读 17,434评论 3 313
  • 过去的时间无法挽留,已经渐行渐远。但是,留给我最多的,是时间中的记忆。我曾幻想着让时光倒流,但我毕竟做不到,所以,...
    爱情是短暂的阅读 420评论 0 0
  • 平庸和优秀,是人类互相之间对比之后得出的结论。优秀代表着这个人比别的人好,要么更有钱,要么更有学问、有才华,要么更...
    沐璎阅读 1,603评论 1 3