最近阅读了《redis设计与实现》,这是一本比较枯燥的书,毕竟涉及到redis底层数据结构。我写本文章的目的,主要围绕redis设计与实现这本书整体的一个印象,然后梳理了这本书整体思路:

  1. 为什么要选择Redis:介绍Redis的使用场景与使用Redis的原因;
  2. Redis常用命令总结:包括时间复杂度总结与具体数据类型在Redis内部使用的数据结构;
  3. Redis的高级功能:包括持久化、复制、哨兵、集群介绍;
  4. 理解Redis:理解内存、阻塞;这部分是非常重要的,前面介绍的都可以成为术,这里应该属于道的部分;
  5. 开发技巧:主要是一些开发实战的总结,包括缓存设计与常见坑点。

本篇文章主要还是讲redis能做什么,为什么能做这些?

背景

在面试的时候,常被问比较下Redis与Memcache的优缺点,个人觉得这二者并不适合一起比较,一个是非关系型数据库不仅可以做缓存还能干其它事情,一个是仅用做缓存。常常让我们对这二者进行比较,主要也是由于Redis最广泛的应用场景就是Cache。那么Redis到底能干什么?又不能干什么呢?

注:笔者会在以后的文章来分析Redis与Memcache的优缺点。

Redis能做什么

  1. 缓存,毫无疑问这是Redis当今最为人熟知的使用场景。再提升服务器性能方面非常有效;

  2. 排行榜,如果使用传统的关系型数据库来做这个事儿,非常的麻烦,而利用Redis的SortSet数据结构能够非常方便搞定;

  3. 计算器/限速器,利用Redis中原子性的自增操作,我们可以统计类似用户点赞数、用户访问数等,这类操作如果用MySQL,频繁的读写会带来相当大的压力;限速器比较典型的使用场景是限制某个用户访问某个API的频率,常用的有抢购时,防止用户疯狂点击带来不必要的压力;

    注:限速器也是对请求限流的一种实现方式。

  4. 好友关系,利用集合的一些命令,比如求交集、并集、差集等。可以方便搞定一些共同好友、共同爱好之类的功能;

  5. 简单消息队列,除了Redis自身的发布/订阅模式,我们也可以利用List来实现一个队列机制,比如:到货通知、邮件发送之类的需求,不需要高可靠,但是会带来非常大的DB压力,完全可以用List来完成异步解耦;

  6. Session共享,默认Session是保存在服务器的文件中,即当前服务器,如果是集群服务,同一个用户过来可能落在不同机器上,这就会导致用户频繁登陆;采用Redis保存Session后,无论用户落在那台机器上都能够获取到对应的Session信息。

    注:对于基于Redis实现分布式session 笔者会在以后文章接入说明

Redis不能做什么

Redis感觉能干的事情特别多,但它不是万能的,合适的地方用它事半功倍。如果滥用可能导致系统的不稳定、成本增高等问题。

比如,用Redis去保存用户的基本信息,虽然它能够支持持久化,但是它的持久化方案并不能保证数据绝对的落地,并且还可能带来Redis性能下降,因为持久化太过频繁会增大Redis服务的压力。

简单总结就是数据量太大、数据访问频率非常低的业务都不适合使用Redis。

数据太大会增加成本,访问频率太低,保存在内存中纯属浪费资源。如果不担心浪费资源,那请忽略。

Redis为什么能做这些

上面说了Redis的一些使用场景,那么这些场景的解决方案也有很多其它选择,比如缓存可以用Memcache,Session共享还能用MySql来实现,消息队列可以用RabbitMQ,我们为什么一定要用Redis呢?

那是因为Redis执行速度快:

  • 速度快,完全基于内存;
  • 使用C语言实现,网络层使用epoll解决高并发问题;
  • 单线程模型避免了不必要的上下文切换及竞争条件;

注意:单线程仅仅是说在网络请求这一模块上用一个请求处理客户端的请求,像持久化它就会重开一个线程/进程去进行处理

丰富的数据类型;

Redis有8种数据类型,当然常用的主要是 String、Hash、List、Set、 SortSet 这5种类型(还有Bitmaps-位图、HyperLogLog、GEO-地理信息定位),他们都是基于键值的方式组织数据。每一种数据类型提供了非常丰富的操作命令,可以满足绝大部分需求,如果有特殊需求还能自己通过 lua 脚本自己创建新的命令(具备原子性);

除了提供的丰富的数据类型,Redis还提供了像慢查询分析、性能测试、Pipeline、事务、Lua自定义命令、Bitmaps、HyperLogLog、发布/订阅、Geo等个性化功能。

Redis的代码开源在GitHub,代码非常简单优雅,任何人都能够吃透它的源码;它的编译安装也是非常的简单,没有任何的系统依赖;有非常活跃的社区,各种客户端的语言支持也是非常完善。另外它还支持事务(没用过)、持久化、主从复制让高可用、分布式成为可能。

做为一个开发者,对于我们使用的东西不能让它成为一个黑盒子,我们应该深入进去,对它更了解、更熟悉。

总结Redis特性

  1. 速度快

    数据存放在内存中;单线程模式,避免了线程上下文切换及多线程竞争访问;c语言实现,更容易接近系统api;采用epoll非阻塞IO,不在网络上浪费时间;

  2. 支持多种数据类型

    支持8种数据类型:String、Hash、List、Set、 SortSet、Bitmaps、HyperLogLog、GEO;

  3. 功能丰富

    丰富的API,如可设置键过期,存在即设置(这可以用来解决分布式锁问题),基于发布订阅可实现简单的消息队列,通过Lua创建新命令,具有原子性,管道(pipeline)功能,解决网络开销;

  4. 服务器简单

    开源代码优雅,容易阅读源码,采用单线程模型,避免并发问题,redis自己实现了多路复用;

  5. 客户端语言版本多

    如Java、Php、Go

  6. 支持多种持久化方式

    RDB和AOP,这两种持久化深入分析请看:https://blog.csdn.net/u014229282/article/details/81121214

  7. 支持集群部署

    支持主从复制,高可用集群,内部集群方式与Memcache做集群实现不一样的机制。

本文章来源:https://github.com/Zeb-D/my-review

Redis——redis能做干什么相关推荐

  1. 搭建redis给mysql做缓存

    安装redis的前提是lnmp或者lamp的环境已经搭建完成. 安装redis 1.安装redis(或可以选择yum安装) 1 2 3 4 5 6 7 8 9 10 11 12 [root@redis ...

  2. redis cluster 设置密码做集群时gem下client.rb文件修改

    redis cluster 设置密码做集群时gem下client.rb文件修改 来源 https://www.cnblogs.com/shihaiming/p/5949772.html redis节点 ...

  3. Redis | 001能做什么?

    本博客 猫叔的博客,转载请申明出处 前言 本系列整理出于<Redis深度历险:核心原理与应用实践>一书,摘抄整理读后感与总结. 好的程序员都会Redis 说说Redis能做什么呢? 1.记 ...

  4. redis概念、做什么及其应用场景

    1.什么是Redis Redis是由意大利人Salvatore Sanfilippo(网名:antirez)开发的一款内存高速缓存数据库.Redis全称为:Remote Dictionary Serv ...

  5. 放弃redis使用mongodb做任务队列支持增删改管理

    使用mongodb做任务队列管理支持增删改 ,我是喜欢用redis的list做队列的,但是这边经常堆积任务,需要查看并删除清空队列,有可能会根据一些content的字段来进行删除,有可能是会针对发件人 ...

  6. redis夺命连环问10--说说Redis是怎么做旁路缓存的?

    目录 相关前置知识文章 说说Redis是怎么做旁路缓存的? 先谈缓存大概怎么做 再谈旁路缓存两种模式 redis和mysql如何保证数据一致性? 那怎么解决缓存和数据库的数据不一致问题? 如何保证缓存 ...

  7. 常见面试题------Redis为什么可以做缓存?

    Redis为什么可以做缓存? 1.Redis将其数据库完全保存在内存中,仅使用磁盘进行持久化.与其它键值数据存储相比,Redis有一组相对丰富的数据类型.Redis可以将数据复制到任意数量的从机中. ...

  8. redis为什么要做持久化及持久化的方式

    1 redis为什么要做持久化 许多小伙伴会去了解redis做持久化的方式,因为这确实非常有用,但是我们为什么要对redis做持久化?明明我们在本地自己搭环境的时候有重启过计算机,但是在重启后甚至过了 ...

  9. [redis] Redis 配置文件置参数详解

    ################################ 基础配置 ################################# #daemonize no 默认情况下, redis 不 ...

最新文章

  1. Solidity合约记录——(三)如何在合约中对操作进行权限控制
  2. 0320-学习进度条
  3. Python之路番外(第二篇):PYTHON基本数据类型和小知识点
  4. mysql表级别的操作_MySql 库/表级操作 及 数据类型 - 纪宇
  5. Android系统兼容性问题(持续更新)
  6. 三相四线怎样查漏电_漏电保护器的选用
  7. rhel6.x版本和rehel7.x版本破解密码及恢复损坏的文件分区
  8. 直接加QQ好友的链接或会话的方法
  9. Jquery插件ajaxFileUpload文件上传与Bootstrap之fileinput插件上传文件的使用与MultipartFile使用与导入Excel和导出Excel
  10. 计算机课程反馈报告怎么写,计算机概论a课程报告范文.doc
  11. Apq.Threading.js
  12. 阿里华为腾讯美的全套人力资源管理资料合集(员工手册+员工关系及胜任能力+人事常用图表+岗位面试、说明+人才梯队建设),共2170份,1G
  13. Windows如何强制关闭电脑全部代理
  14. Hadoop学习之虚拟机环境配置,防火墙、selinux关闭、集群时间同步(LinuxcentOS7版本)
  15. 什么是GCC,ICC,IAR
  16. 取消检验批过账(取消检验批UD判定到Rerel,再把非限性库存转到质检库存,然后就可以取101收货了)
  17. springboot发送邮件-163邮箱
  18. 最难得的素养,是等人把话说完
  19. 多媒体视频开发_(27)ffmpeg格式转换bsf的使用
  20. ​可以给证件照换衣服的软件有哪些?教你如何一键换装

热门文章

  1. 寻找局部最高点-1D
  2. 写给想学和在学编程的你们,学习编程的7个好处
  3. 整理各种Vue项目在IE浏览器白屏报错 SCRIPT1002:语法错误
  4. 升讯威在线客服系统客服端英文界面的实现方法
  5. 移动终端web开发必备知识
  6. QMUI Android
  7. cmd同时执行多条命令
  8. 股价飙升20%市值增长100亿,《纸牌屋》之父Netflix凭什么比他的竞争者要强12倍?...
  9. 山东大学软件学院创新实训——飞讯(四)
  10. 通过jquery实现星级评价效果