Redis是目前最流行的NoSQL数据库,最重要的是它是运行在内存上的数据库。所以几乎所有高并发需求的产品都会考虑使用Redis作为数据库缓存。

不同于MongoDB的以硬盘存储为主、内存为辅,Redis是真·内存存储,即所有数据都存在内存中,只是偶尔间歇性的保存到硬盘上备份。

Redis特点:

  • NoSQL:采用类似JSON的Key-Value键值对存储。
  • 存储在内存中:几乎是计算机存储的最高读写速度(除CPU寄存器外)。
  • 可持久化:定期可以把内存中的数据备份到硬盘。
  • 轻量化:整个软件才1M,内存占用极少。
  • 单机多实例:同机器可以给多个应用配置多个Redis数据库,因为资源占用极少。

理解Redis

原子性

Redis处理高并发最强的就是其原子性。完全基于单线程,抛弃多进程、多线程等逻辑。

什么是“原子性”?参考:深入学习RedisAPI的原子性分析

原子性是数据库的事务中的特性。在数据库事务的情景下,原子性指的是:
一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。
对于Redis而言,命令的原子性指的是:一个操作的不可以再分,操作要么执行,要么不执行。

Redis vs. JSON

作为NoSQL初学者,我觉得所有的NoSQL不过是一个更复杂的JSON文件而已。

但是只是一个文本文件的JSON面临IO堵塞、文本解析等很大屏障,速度决定了它的天花板。即使是放在Ram Disk内存盘上的JSON,也解决不了高并发的问题
而Redis不光用了内存,还用了原子性逻辑来加速运行,同时还加入了一系列的备份、恢复、分布式多机器运行的功能。

所以真的没法再说和JSON一样了。

Redis vs. MongoDB

MongoDB是基于Documentation的,

....

Redis vs. Memcached

....

安装

参考:How To Install and Secure Redis on Ubuntu 18.04

整个软件大约1M左右。

Mac的Homebrew安装:

brew install redis

Ubuntu安装:

sudo apt install redis-server

Docker安装:
因为Redis实在是太轻量了,而且原生支持多实例运行,配置也是单文件配置,所以不太需要专门用docker来做隔离。如果真有docker需要的话,也不会难。参考hub.docker.com。

编译安装:
如果需要自己编译的话,就到Redis的下载最新的release,一般用tar.gz格式。
目前最新的稳定版5.0。中文官网地址:http://www.redis.cn/

wget http://download.redis.io/releases/redis-5.0.0.tar.gz
tar -xvzf redis-*.tar.gz
cd redis-*make
make test
sudo make install

配置

Redis配置很好理解,只需一个redis.conf配置文件。

找到文件后,一般需要修改的地方只有以下几点:

# 绑定主机IP和端口,端口是redis默认
bind 127.0.0.1
port 6379# (推荐)以守护进程方式运行,这样就不会进入命令行”前台堵塞模式“
daemonize yes# 数据文件
dbfilename dump.db# 数据存储的位置,运行前需手动创建文件夹,否则报错
dir /var/lib/redis/# 日志文件
log /var/log/redis/redis-server.log# 数据库数量,默认16个数据库
database 16

运行交互

启动redis服务器:

redis-server# 或指定配置文件启动
redis-server /etc/redis/redis.conf

如果没有在配置中设置daemonize,那么这里就会在前端启动,即堵塞整个shell来运行这个程序。如果已经是守护进程了,那么就会在后台运行,可以用ps aux |grep redis看到。
如果要开机启动,直接在/etc/rc.local中加入启动redis的命令即可,不过这样的还不如设置系统service好管理。关闭服务器的方法就是直接kill掉进程即可:pkill redis-server

客户端:

# 客户端shell,与服务器进行命令交互
redis-cli # 关闭客户端
redis-cli shutdown

Redis的主从 "RAID 1"

以上是最简单的单机设置。然而,Redis的主从设置也不难,很简单。

记住:Redis的Master-Slave的结构,实际上只是一种备份关系!而不是数据分散在各地的那种。

Redis的Master-slave架构的作用:

  • 备份:slave从的最主要作用是备份,以弥补单机内存数据不稳固的缺点。
  • 读、写分离:写入是很耗时间的,而读很快。那么如果读和写分离,会加速很多。

设置方法:

  • 主从两台机器上,都安装了redis-server
  • 两台机子上都有一个配置文件redis.conf
  • 两台机子上的redis.conf中,互相指明自己是主还是从,主的IP是什么,以及权限等相关设置。
  • 两台机子同时启动redis-server

这个设置方法是最简单的主从设置,甚至有点像ssh-tunnelfrp内网穿越等设置。都是基于一个配置文件就能完成自动连接的。

主从可以在同一台机器(但是没有什么意义),只是注意端口号不要冲突。如果不是同一台机器,那么端口号就无所谓了。

Redis集群 "RAID 0"

如果说主从架构是硬盘组合的RAID 1模式,那么Redis集群就是RAID 0——数据是分布在各个机器上的。

如果只是简单的主从架构,那么主要的压力还是都集中在Master主机上,万百万级别的高并发肯定是扛不住的。所以要用到Redis集群。

Redis集群才是真正的分布式

集群分为软件层面的和硬件层面的。
Redis在同一台机器可以启动多个服务,也就是在本机可以使用多个Redis数据库服务,这叫软件层面集群(没什么用)。因为一台机器死机,整个集群就没了。所以软件方面的只适合同一台机器给不同应用配置redis数据库,不适合集群。
硬件集群是每台机器上都有redis,用于分担数据。

集群有这几大特点:

  • Slots:代表Redis对数据自动切分(Split)的能力
  • Partition:代表数据的高可用性(Availability)

集群的槽 Slots

Redis怎么把全部数据分配个集群的每台机器?
它会先把数据分为16,384个slots槽,然后把这些槽平均分配个每台机器。比如机器A分了0-1000的槽用来存数据,机器B分了1001-2000的槽。。。每台机器都会知道自己会负责哪些槽。

如果一台机器接收到不是自己负责的slot的数据,就会把请求“转发”给该负责的机器。这个就叫转向 (Redirection)。

怎么确定新来的数据在哪台机器上写入呢?

Redis利用了Hash Table数据结构的基本原理,即通过一个Hash function把key映射为一个固定的整数number。通过number % 16384而得到一个固定的index整数值,根据这个index就能直到它所属的slot在哪个“负责人”位置了。

集群的分区 Partition

如果有partition分区,那么及时有些机器突然不可用、断线,集群也可以继续完成请求任务。

Redis于Python交互

Python需要安装redis包:pip install redis

基础交互代码test.py

import redis

一篇文章入门Redis相关推荐

  1. 一篇文章入门 Redis(万字长文干货)

    导语 之前给团队的同事做了一次超容易理解的 Redis 入门分享,这里加以整理修改成文章分享给需要的童鞋. 本文将会从:Redis 使用场景与介绍 -> 数据结构与简单使用 -> 小功能大 ...

  2. 一篇文章入门深度学习框架PyTorch

    一篇文章入门深度学习框架PyTorch 1 Tensor(张量) 2 Variable(变量) 3 Dataset(数据集) 4 nn.Module(模组) 5 torch.optim(优化) 一阶优 ...

  3. 写给仿真软件研发的“一篇文章入门”系列(终)

    "一篇文章入门"系列不再更新,点击绿色标题可打开链接. 一篇文章入门系列主要针对工业仿真软件研发测试人员,也可作为相关从业人员和学生,以及对仿真软件开发感兴趣的读者. 所有文章来自 ...

  4. HTML完结《一篇文章入门编程系列之从零基础入门HTML+CSS前端开发》12.24

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(QQ_3336392096.jpg)] 一篇文章让你从HTML零基础入门前端开发 前言: 此文为玄子,复习ACCP-S1课程后,整 ...

  5. 日常更新《一篇文章入门编程系列之从零基础入门HTML+CSS前端开发》12.23

    一篇文章让你从HTML零基础入门前端开发 前言: 此文为玄子,复习ACCP-S1课程后,整理的文章,文中对知识点的解释仅为个人理解,源码均可直接复制运行 配套PPT,站点源码,等学习资料请加文章封面联 ...

  6. python 的库如何开发_一篇文章入门Python生态系统

    译者按:原文写于2011年末,虽然文中关于Python 3的一些说法可以说已经不成立了,但是作为一篇面向从其他语言转型到Python的程序员来说,本文对Python的生态系统还是做了较为全面的介绍.文 ...

  7. 一篇文章入门Python生态系统

    开发者从PHP.Ruby或其他语言转到Python时,最常碰到的第一个障碍,就是缺乏对Python生态系统的全面了解.开发者经常希望能有一个教程或是资源,向他们介绍如何以大致标准的方式完成大部分的任务 ...

  8. 一篇文章入门Mysql

    文章目录 01数据库的用途 02 娱乐化讲解表关系 03.mysql 数据库安装 04数据语句操作类型 05. 连接数据库 06. 数据库结构定义语句 07. 类型.字符集.引擎和索引 08. 增删改 ...

  9. 一篇文章入门Spring

    Spring 1.Spring入门(IOC) 首先要在pom文件里导入依赖 <dependency><groupId>org.springframework</group ...

最新文章

  1. 有界阻塞队列ArrayBlockingQueue和无界阻塞队列LinkedBlockingQueue
  2. Logstic与Softmax比较
  3. QT精彩实例分析第5章-0
  4. Android SDK更新下载失败以及Studio首次安装取消自动下载SDK
  5. 看动画学算法之:排序-count排序
  6. [前台]---js重复上传一张图片两次,第二次失败的解决办法和思路
  7. APUE 学习笔记(三) 文件和目录
  8. 为什么要从vmware切换到kvm?
  9. ubuntu上解决evolution邮箱附件为dat格式
  10. 拟合函数,偏差和方差
  11. 【IoT】产品设计之商业模式分析:一篇文章九个维度,带你认知小米的商业模式
  12. 【C语言】BC90小乐乐算多少人被请家长(DAY 5)
  13. aspose获取文件纸张方向以及设置纸张方向
  14. 前端利用正则对手机号码,身份证号,姓名进行脱敏处理
  15. LaTeX 相对于 Word 有什么优势?
  16. Wireshark菜单栏介绍之编辑菜单4-4
  17. element 实现 表格 跨页选择
  18. 中国电信光猫路由模式端口映射问题记录
  19. 27个强大的PDF在线工具,完全免费!
  20. 3000亿紫光集团破产重整,原因是啥?

热门文章

  1. sql顶部菜单项消失_SQL选择顶部
  2. python的any函数_Python any()函数
  3. python生成器_Python生成器
  4. 参数化测试 junit_JUnit参数化测试
  5. Python Frozenset()
  6. jsf表单验证_JSF验证示例教程–验证器标签,定制验证器
  7. C++进阶教程之文件和流
  8. CakePHP 3.7.6 发布,PHP 快速开发框架
  9. Spring Cloud Config客户端使用
  10. 《Cassandra权威指南》第二版书评及访谈