超详细Redis数据库入门教程

本文是一篇详尽的Redis入门教程,涵盖了Redis的介绍、作者、使用者、安装、启动、客户端使用,以及重点讲解了Redis的五大数据结构:Strings、Lists、Sets、Sorted Sets和Hashes。此外,还提到了Redis的持久化、主从复制、事务处理、配置理解及客户端操作。文章还探讨了Redis的性能优势和常用场景,如消息队列、分页、会话存储等。
摘要由CSDN通过智能技术生成

【本教程目录】

1. redis是什么
2.redis
的作者何许人也
3.
谁在使用redis
4.
学会安装redis
5.
学会启动redis
6.
使用redis客户端
7.redis
数据结构简介
8.redis
数据结构 – strings
9.redis
数据结构 – lists
10.redis
数据结构集合
11.redis
数据结构有序集合
12.redis
数据结构哈希
13.
聊聊redis持久化两种方式
14.
聊聊redis持久化 – RDB
15.
聊聊redis持久化 – AOF
16.
聊聊redis持久化 – AOF重写
17.
聊聊redis持久化如何选择RDBAOF
18.
聊聊主从用法
19.
聊聊主从同步原理
20.
聊聊redis的事务处理
21.
教你看懂redis配置简介
22.
教你看懂redis配置 -通用
23.
教你看懂redis配置快照
24.
教你看懂redis配置复制
25.
教你看懂redis配置安全
26.
教你看懂redis配置 -限制
27.
教你看懂redis配置追加模式
28.
教你看懂redis配置 – LUA脚本
29.
教你看懂redis配置慢日志
30.
教你看懂redis配置事件通知
31.
教你看懂redis配置高级配置

redis是什么】

 

Redis是一个开源,高级的键值存储和一个适用的解决方案,用于构建高性能,可扩展的Web应用程序。

Redis有三个主要特点,使它优越于其它键值数据存储系统 -

·        Redis将其数据库完全保存在内存中,仅使用磁盘进行持久化。

·        与其它键值数据存储相比,Redis有一组相对丰富的数据类型。

·        Redis可以将数据复制到任意数量的从机中。

Redis官方网网站是:http://www.redis.io/ ,如下:

Redis的优点

以下是Redis的一些优点。

·        异常快 - Redis非常快,每秒可执行大约110000次的设置(SET)操作,每秒大约可执行81000次的读取/获取(GET)操作。

·        支持丰富的数据类型 - Redis支持开发人员常用的大多数数据类型,例如列表,集合,排序集和散列等等。这使得Redis很容易被用来解决各种问题,因为我们知道哪些问题可以更好使用地哪些数据类型来处理解决。

·        操作具有原子性 - 所有Redis操作都是原子操作,这确保如果两个客户端并发访问,Redis服务器能接收更新的值。

·        多实用工具 - Redis是一个多实用工具,可用于多种用例,如:缓存,消息队列(Redis本地支持发布/订阅),应用程序中的任何短期数据,例如,web应用程序中的会话,网页命中计数等。

Redis与其他键值存储系统

·        Redis是键值数据库系统的不同进化路线,它的值可以包含更复杂的数据类型,可在这些数据类型上定义原子操作。

·        Redis是一个内存数据库,但在磁盘数据库上是持久的,因此它代表了一个不同的权衡,在这种情况下,在不能大于存储器(内存)的数据集的限制下实现非常高的写和读速度。

·        内存数据库的另一个优点是,它与磁盘上的相同数据结构相比,复杂数据结构在内存中存储表示更容易操作。因此,Redis可以做很少的内部复杂性。

 

redis的作者何许人也】

这位便是redis的作者,他叫Salvatore Sanfilippo,来自意大利的西西里岛,现在居住在卡塔尼亚。目前供职于Pivotal公司。

他使用的网名是antirez,如果你有兴趣,可以去他的博客逛逛,地址是antirez.com,当然也可以去follow他的github,地址是http://github.com/antirez

【谁在使用redis

Blizzarddiggstackoverflowgithubflickr …

【学会安装redis

1.离线安装:

redis.io下载最新版redis-X.Y.Z.tar.gz后解压tar -zxvf  redis-X.Y.Z.tar.gz,然后进入redis-X.Y.Z文件夹后直接make即可,安装非常简单。

安装完成之后make test进行测试,看安装是否完全。

如果安装完全会出现上图提示。

make成功后会在src文件夹下产生一些二进制可执行文件,包括redis-serverredis-cli等等:

src文件夹下执行如下命令:

$ find . -type f-executable
./redis-benchmark //
用于进行redis性能测试的工具
./redis-check-dump //
用于修复出问题的dump.rdb文件
./redis-cli //redis
的客户端
./redis-server //redis
的服务端
./redis-check-aof //
用于修复出问题的AOF文件
./redis-sentinel //
用于集群管理

 

2.在线安装:

[yiibai@ubuntu:~]$sudo apt-get update

[yiibai@ubuntu:~]$sudo apt-get install redis-server

【学会启动redis

启动redis非常简单,直接./redis-server就可以启动服务端了,还可以用下面的方法指定要加载的配置文件:

默认情况下,redis-server会以非daemon的方式来运行,且默认服务端口为6379

 在开启redis服务端的时候,需要再打开一个终端启动客户端。

 

【使用redis客户端】

Redis中,在Redis的根目录下有一个配置文件(redis.conf)。当然您可以通过Redis CONFIG命令获取和设置所有的Redis配置。

语法
以下是Redis中的CONFIG命令的基本语法。

redis127.0.0.1:6379> CONFIG GET CONFIG_SETTING_NAME

Shell

示例

redis127.0.0.1:6379> CONFIG GET loglevel 

1)"loglevel"

2)"notice"

Shell

要获取所有配置设置,请使用*代替CONFIG_SETTING_NAME

示例

redis127.0.0.1:6379> CONFIG GET *

  1) "dbfilename"

  2) "dump.rdb"

  3) "requirepass"

  4) ""

  5) "masterauth"

  6) ""

  7) "unixsocket"

  8) ""

  9) "logfile"

 10)"/var/log/redis/redis-server.log"

 11) "pidfile"

 12)"/var/run/redis/redis-server.pid"

 13) "maxmemory"

 14) "3221225472"

 15) "maxmemory-samples"

 16) "3"

 17) "timeout"

 18) "0"

要更新配置,可以直接编辑redis.conf文件,也可以通过CONFIG set命令更新配置。

语法
以下是CONFIG SET命令的基本语法。

redis127.0.0.1:6379> CONFIG SET CONFIG_SETTING_NAME NEW_CONFIG_VALUE

Shell

示例

redis127.0.0.1:6379> CONFIG SET loglevel "notice"

OK

redis127.0.0.1:6379> CONFIG GET loglevel 

1)"loglevel"

2) "notice"



//
通过客户端来关闭redis服务端
127.0.0.1:6379> shutdown 
127.0.0.1:6379>

 Redis命令是用于在Redis服务器上执行一些操作。
要在Redis服务器上运行命令,需要一个Redis客户端。Redis客户端在Redis包中有提供,这个包在我们前面的安装教程中就有安装过了。

语法
以下是Redis客户端的基本语法。

[yiibai@ubuntu:~]$redis-cli

Shell

示例
以下示例说明了如何启动Redis客户端。

要启动Redis客户端,请打开终端并键入命令redis-cli这将连接到您的本地Redis服务器,现在可以运行任何的Redis命令了。

[yiibai@ubuntu:~]$redis-cli

redis127.0.0.1:6379>

redis127.0.0.1:6379> PING 

PONG

Shell

在上面的示例中,连接到到在本地机器上运行的Redis服务器并执行PING命令,该命令检查服务器是否正在运行。

在远程服务器上运行命令

要在Redis远程服务器上运行命令,需要通过客户端redis-cli连接到服务器

语法

[yiibai@ubuntu:~]$redis-cli -h host -p port -a password

Shell

示例
以下示例显示如何连接到Redis远程服务器,在主机(host)127.0.0.1,端口(port)6379上运行,并使用密码为 mypass

[yiibai@ubuntu:~]$redis-cli -h 127.0.0.1 -p 6379 -a "mypass"

redis127.0.0.1:6379>

redis127.0.0.1:6379> PING 

PONG

 

redis数据结构简介】

Redis支持5种数据类型。

redis是一种高级的key:value存储系统,而关于key,有几个点要提醒大家:

1.key不要太长,尽量不要超过1024字节,这不仅消耗内存,而且会降低查找的效率;
2.key
也不要太短,太短的话,key的可读性会降低;
3.
在一个项目中,key最好使用统一的命名模式,例如user:10000:passwd

redis数据结构 – strings

 

字符串

Redis中的字符串是一个字节序列。Redis中的字符串是二进制安全的,这意味着它们的长度不由任何特殊的终止字符决定。因此,可以在一个字符串中存储高达512兆字节的任何内容。

示例

redis127.0.0.1:6379> set name "yiibai.com"

OK

redis127.0.0.1:6379> get name

"yiibai.com"

Shell

在上面的示例中,setgetRedis命令,nameRedis中使用的键,yiibai.com是存储在Redis中的字符串的值。

- Redis命令不区分大小写,如SET,Setset都是同一个命令。字符串值的最大长度为 512MB

redis数据结构哈希】

hashes存的是字符串和字符串值之间的映射,比如一个用户要存储其全名、姓氏、年龄等等,就很适合使用哈希。

有关hashes的操作,同样很丰富,需要时,大家可以从这里查询

 

散列/哈希

Redis散列/哈希(Hashes)键值对的集合。Redis散列/哈希是字符串字段和字符串值之间的映射。因此,它们用于表示对象。

示例:
//
建立哈希,并赋值
127.0.0.1:6379> HMSET user:001 username antirez password P1pp0 age 34 
OK
//
列出哈希的内容
127.0.0.1:6379> HGETALL user:001 
1) "username"
2) "antirez"
3) "password"
4) "P1pp0"
5) "age"
6) "34"
//
更改哈希中的某一个值
127.0.0.1:6379> HSET user:001 password 12345 
(integer) 0
//
再次列出哈希的内容
127.0.0.1:6379> HGETALL user:001 
1) "username"
2) "antirez"
3) "password"
4) "12345"
5) "age"
6) "34"

 

在上述示例中,散列/哈希数据类型用于存储包含用户的基本信息的用户对象。这里HMSETHGETALLRedis的命令,而ukey是键的名称。

每个散列/哈希可以存储多达2^32 - 1个健-值对(超过40亿个)

redis数据结构 – lists

 

列表

Redis列表只是字符串列表,按插入顺序排序。您可以向Redis列表的头部或尾部添加元素。

首先要明确一点,redis中的lists在底层实现上并不是数组,而是链表,也就是说对于一个具有上百万个元素的lists来说,在头部和尾部插入一个新元素,其时间复杂度是常数级别的,比如用LPUSH10个元素的lists头部插入新元素,和在上千万元素的lists头部插入新元素的速度应该是相同的。

虽然lists有这样的优势,但同样有其弊端,那就是,链表型lists的元素定位会比较慢,而数组型lists的元素定位就会快得多。

lists的常用操作包括LPUSHRPUSHLRANGE等。我们可以用LPUSHlists的左侧插入一个新元素,用RPUSHlists的右侧插入一个新元素,用LRANGE命令从lists中指定一个范围来提取元素。

 

 

示例

redis127.0.0.1:6379> lpush alist redis

(integer) 1

redis127.0.0.1:6379> lpush alist mongodb

(integer) 2

redis 127.0.0.1:6379>lpush alist sqlite

(integer) 3

redis127.0.0.1:6379> lrange alist 0 10 

 

1)"sqlite"

2)"mongodb"

3)"redis"

Shell

列表的最大长度为2^32 - 1个元素(4294967295,每个列表可容纳超过40亿个元素)

有人说,如果只使用redis中的字符串类型,且不使用redis的持久化功能,那么,redis就和memcache非常非常的像了。这说明strings类型是一个很基础的数据类型,也是任何存储系统都必备的数据类型。


字符串类型的用法就是这么简单,因为是二进制安全的,所以你完全可以把一个图片文件的内容作为字符串来存储。

 

另外,我们还可以通过字符串类型进行数值操作:


127.0.0.1:6379> set mynum "2"
OK
127.0.0.1:6379> get mynum
"2"
127.0.0.1:6379> incr mynum
(integer) 3
127.0.0.1:6379> get mynum
"3"

 

看,在遇到数值操作时,redis会将字符串类型转换成数值。

由于INCR等指令本身就具有原子操作的特性,所以我们完全可以利用redisINCRINCRBYDECRDECRBY等指令来实现原子计数的效果,假如,在某种场景下有3个客户端同时读取了mynum的值(值为2),然后对其同时进行了加1的操作,那么,最后mynum的值一定是5。不少网站都利用redis的这个特性来实现业务上的统计计数需求。

 

lists的应用相当广泛,随便举几个例子:

1.我们可以利用lists来实现一个消息队列,而且可以确保先后顺序,不必像MySQL那样还需要通过ORDER BY来进行排序。
2.
利用LRANGE还可以很方便的实现分页的功能。
3.
在博客系统中,每片博文的评论也可以存入一个单独的list中。

redis数据结构集合】

redis的集合,是一种无序的集合,集合中的元素没有先后顺序。

集合相关的操作也很丰富,如添加新元素、删除已有元素、取交集、取并集、取差集等。我们来看例子:

 

集合

Redis集合是字符串的无序集合。在Redis中,您可以添加,删除和测试成员存在的时间O(1)复杂性。

示例


//
向集合myset中加入一个新元素"one"
127.0.0.1:6379> sadd myset "one" 
(integer) 1
127.0.0.1:6379> sadd myset "two"
(integer) 1
//
列出集合myset中的所有元素
127.0.0.1:6379> smembers myset 
1) "one"
2) "two"
//
判断元素1是否在集合myset中,返回1表示存在
127.0.0.1:6379> sismember myset "one" 
(integer) 1
//
判断元素3是否在集合myset中,返回0表示不存在
127.0.0.1:6379> sismember myset "three" 
(integer) 0
//
新建一个新的集合yourset
127.0.0.1:6379> sadd yourset "1" 
(integer) 1
127.0.0.1:6379> sadd yourset "2"
(integer) 1
127.0.0.1:6379> smembers yourset
1) "1"
2) "2"
//
对两个集合求并集
127.0.0.1:6379> sunion myset yourset 
1) "1"
2) "one"
3) "2"
4) "two"

 

对于集合的使用,也有一些常见的方式,比如,QQ有一个社交功能叫做好友标签,大家可以给你的好友贴标签,比如大美女土豪欧巴等等,这时就可以使用redis的集合来实现,把每一个用户的标签都存储在一个集合之中。

 

注意如果一个元素被添加了两次,但是由于集合的唯一属性,所以它只算添加一次。

一个集合中的最大成员数量为2^32 - 1(4294967295,每个集合中元素数量可达40亿个)个。

redis数据结构有序集合】

redis不但提供了无需集合(sets),还很体贴的提供了有序集合(sorted sets)。有序集合中的每个元素都关联一个序号(score),这便是排序的依据。

很多时候,我们都将redis中的有序集合叫做zsets,这是因为在redis中,有序集合相关的操作指令都是以z开头的,比如zrangezaddzrevrangezrangebyscore等等

 

可排序集合

Redis可排序集合类似于Redis集合,是不重复的字符集合。不同之处在于,排序集合的每个成员都与分数相关联,这个分数用于按最小分数到最大分数来排序的排序集合。虽然成员是唯一的,但分数值可以重复。

示例


127.0.0.1:6379> zadd myzset 1 baidu.com 
(integer) 1
//
myzset中新增一个元素360.com,赋予它的序号是3
127.0.0.1:6379> zadd myzset 3 360.com 
(integer) 1
//
myzset中新增一个元素google.com,赋予它的序号是2
127.0.0.1:6379> zadd myzset 2 google.com 
(integer) 1
//
列出myzset的所有元素,同时列出其序号,可以看出myzset已经是有序的了。
127.0.0.1:6379> zrange myzset 0 -1 with scores 
1) "baidu.com"
2) "1"
3) "google.com"
4) "2"
5) "360.com"
6) "3"
//
只列出myzset的元素
127.0.0.1:6379> zrange myzset 0 -1 
1) "baidu.com"
2) "google.com"
3) "360.com"

Shell

 

Redis命令–HyperLogLog

Redis HyperLogLog是一种使用随机化的算法,以少量内存提供集合中唯一元素数量的近似值。

HyperLogLog 可以接受多个元素作为输入,并给出输入元素的基数估算值:

·        基数:集合中不同元素的数量。比如 {‘apple’, ‘banana’, ‘cherry’, ‘banana’,‘apple’} 的基数就是 3

·        估算值:算法给出的基数并不是精确的,可能会比实际稍微多一些或者稍微少一些,但会控制在合理的范围之内。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

文宇肃然

精神和物质鼓励你选一个吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值