一篇文章入门Redis

栏目: 数据库 · 发布时间: 5年前

内容简介:Redis是目前最流行的NoSQL数据库,最重要的是它是运行在内存上的数据库。所以几乎所有高并发需求的产品都会考虑使用Redis作为数据库缓存。不同于MongoDB的以硬盘存储为主、内存为辅,Redis是Redis特点:

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

设置方法:

redis.conf
redis.conf
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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

The Probabilistic Method Second Edition

The Probabilistic Method Second Edition

Noga Alon、Joel H. Spencer / Wiley-Blackwell / 2000 / $121.95

The leading reference on probabilistic methods in combinatorics-now expanded and updated When it was first published in 1991, The Probabilistic Method became instantly the standard reference on one......一起来看看 《The Probabilistic Method Second Edition》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换