一篇文章学会Redis数据库

一、什么是Redis?

  • redis的官网地址:redis.io
  • redis是一个高性能的key-value存储系统数据库。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型支持丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了主从同步
  • Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。

总结一下Redis的特点:

  • 读写速度快,数据存放在内存中。
  • 丰富的数据类型:字符串,哈希,链表、集合、有序集合
  • 支持事务watch
  • 可以用作缓存和消息队列,按key设置过期时间,超时自动删除
  • 数据持久化,支持AOF日志和RDB快照两种持久化方式,防止数据丢失
  • 支持主从复制来实现数据备份,主机数据会同步到从机

二、Redis的安装配置

接下来我们先在本地安装redis,下载地址:

https://download.csdn.net/download/qq_40558166/11965269

1.解压文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w019Gx0j-1573140533813)(../AppData/Roaming/Typora/typora-user-images/1573105282175.png)]

2.配置环境变量

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zIlVSwvd-1573140533815)(../AppData/Roaming/Typora/typora-user-images/1573105295141.png)]

3.变成服务,进入安装目录下,地址栏cmd,然后输入命令

redis-server --service-install redis.windows.conf --loglevel verbose --maxheap 200m

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SFPWLJ4E-1573140533815)(../AppData/Roaming/Typora/typora-user-images/1573105332893.png)]

4.启动服务在这里插入图片描述

5.启动客户端和服务端命令

打开cmd,启动redis-server:服务器命令

redis-server redis.windows.conf	

再打开cmd。启动redis-cli :客户端命令

redis-cli

注意:一个redis。windows.conf配置就是一个redis服务器,需要启动多个服务器时,只需要修改一下这个配置文件的名称redis.windows.conf,再用redis-server就可以启动

三、Redis的数据类型

redis是一个高性能的key-value存储系统数据库。它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(有序集合)和hash(哈希类型)

类型特点使用场景
string字符串key=value的形式,可存数字定时持久化,常规计数
hash映射表string类型的key=value的映射表,适合存储对象存储部分变更数据,比如用户信息表
list链表有序可重复的链表
set集合无序不可重复的序列常用交并差集,比如可以求共同关注的博主
zset有序集合带score排名的无序不可重复序列排行榜

四、Redis的基础命令

命令作用
keys *返回键(key)
keys list*返回名以list开头的所有键(key)
exists list1判断键名为list1的是否存在 存在返回1, 不存在返回0
del list1删除一个键(名为list1)
expire list1 10设置键名为list1的过期时间为10秒后
ttl list1查看键名为list1的过期时间,若为-1表示已过期 或 永不过期
move age 1将键名age的转移到1数据库中
select 1/表示进入到1数据库中,默认在0数据库
persist age移除age的过期时间。
flushdb删除所有的数据 清除当前所在库的所有数据
flushall清空所有数据

五、数据类型的常见操作命令

① [string-字符串]的操作命令

命令解释
set age 1添加键值age=1,存在则替换
get age获取age
setnx age 2添加不存在的age=2
setex age 5 3添加有效期为5s的age=3
mset age 1 age2 1添加多个age=1,age2=3
msetnx age 1 age2 3添加多个不存在的age=1,age2=3
getset age 3获取age以前的值,并设置为新值age=3
mget name age获取多个值name,age
setrange name 5 hello设置name索引从5以后的值,类似name[5:]=‘hello’
getrange name 0 5获取name[0:5]
append name asasa在name后边追加asasa
decr age对age-1
incr age对age+1
decyby age 10对age-10
incrby age 8对age+8
strlen name求age的长度
del name删除name
type name返回name的数据类型

② [hash-哈希对象]的操作命令

命令解释
hset user:001 name zs在user:001表中添加name=zs,有就替换
hget user:001 name获取user:001表中的name
hsetnx user:001 age 5在user:001表中设置不存在的age=5
hmset user:001 age 3 age2 5在user:001表中添加age=3和age2=5
hmget user:001 age age2在user:001表中获取age和age2
hdel user:001 age删除user:001表中的age
hincrby user:001 age 5在user:001表中对age+5
hdecrby user:001 age 3在user:001表中对age—3
hkeys user:001展示user:001表中的所有key
hvals user:001展示user:001表中的所有value
hexists user:001 name判断user:001表中中是否存在name
hlen user:001 age求user:001表中的长度

③ [list-链表]的操作命令

命令解释
lpush list 1在list的头部添加元素1
rpush list 1在list的尾部添加元素1
lpop list 1在list的头部弹出元素
rpop list 1在list的尾部弹出元素
rpoplpush list 1 list2弹出list尾部的元素添加到list2的头部
lrange list 0 -1展示出list[0:-1],也就是所有元素
lindex list 0展示出list[0]
ltrim list 0 2删除其他元素,只剩下list[0:2]
lset list 0 5list[0]=5
linsert list before a b在list元素a的前边添加b元素
llen listlist的长度
lrem list 0 a删除list中全部的a元素
lrem list 5 a从头开始搜索,删除list中5个a元素
lrem list -2 a从尾部开始搜索,删除list中

④ [set-集合]的操作命令

命令解释
sadd set 1在set集合添加1
srem set 1删除set中的1成员
spop set随机弹出一个成员
smember set展示set中的所有成员
smove set1 set2 5将set1集合中的5成员,移动到set2中
srandmember set随机展示set中的一个成员
sismember set 5判断5是不是set集合中的成员
scard setset集合中的成员个数
sdiff set1 set2差集,展示出set1-set2的差别成员
sdiffstore set set1 set2将set1-set2的差别成员存到set3
sinter set1 set2交集,展示出set1和set2的交集成员
sinterstore set set1 set2将set1,set2的交集成员存到set3
sunion set1 set2并集,展示出set1和set2的并集成员
sunionstore set set1 set2将set1,set2的并集成员存到set3

⑤ [zset-有序集合]的操作命令

命令解释
zadd zset 1 a在zset成员中添加分数为1的成员a
zrange zset 0 -1展示按分数从低到高排序后的zset[0:-1]的成员
zrange zset 0 -1 withscores展示按分数从低到高排序后的zset[0:-1]的成员,包括排名
zrevrange zset 0 -1展示按分数从高到低排序后的zset[0:-1]的成员
zrevrange zset 0 -1 withscores展示按分数从高到低排序后的zset[0:-1]的成员,包括排名
zrangebyscore zset 4 5 withscores获取zset中分数[4:5]的成员,包括排名
zcount zset1 3 4获取zset中分数[3:4]的成员数量
zrevrank zset a展示按分数从高到低的zset的a成员的索引
zrem zset a删除zset的a成员
zincrby zset 3 a对zset中的a成员的排名+3
zcard zsetzset的成员个数
zremrangebyrank zset1 1 2删除zset索引在[1:2]之间的成员
zremrangebyscore zset1 3 4删除zset分数在[3:4]之间的成员

六、Redis的事务

数据库事务是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。

Redis支持简单的事务,下面我们来看一下Redis与 mysql事务的对比:
在这里插入图片描述

问题1:rollback与discard 的区别 :
如果已经成功执行了2条语句,第3条语句出错.Rollback后,前2条的语句影响消失.Discard只是结束本次事务,前2条语句造成的影响仍然还在。

问题2:在mutil后面的语句中, 语句出错可能有2种情况:

  1. 语法就有问题,这种,exec时,报错, 所有语句得不到执行
  2. 语法本身没错,但适用对象有问题. 比如 zadd 操作list对象,Exec之后,会执行正确的语句,并跳过有不适当的语句。

七、Redis持久化配置

1.RDB和AOF比较

为了防止数据丢失以及服务重启时能够恢复数据,Redis支持数据的持久化,主要分为两种方式:RDB和AOF,redis默认采用的是RDB的方式

RDBAOF
全名Redis DataBaseAppend Only File
简要RDB是将某一个时刻的内存快照,以二进制的方式写入磁盘的过程。AOF 可以把 Redis 每个键值对操作都记录到文件中。Redis 默认是关闭 AOF 持久化的。
优点RDB 的内容为二进制的数据,占用内存更小,更紧凑,更适合做为备份文件,因此可以更快的传输到远程服务器进行Redis 服务恢复;①AOF 持久化保存的数据更加完整,AOF 提供了三种保存策略:每次操作保存、每秒钟保存一次(默认)、跟随系统的持久化策略保存;
②AOF 采用的是命令追加的写入方式,所以不会出现文件损坏的问题,即使由于某些意外原因,导致了最后操作的持久化数据写入了一半,也可以通过 redis-check-aof 工具轻松的修复;
③AOF 持久化文件,非常容易理解和解析,它是把所有 Redis 键值操作命令,以文件的方式存入了磁盘。即使不小心使用 flushall 命令删除了所有键值信息,只要使用 AOF 文件,删除最后的 flushall 命令,重启 Redis 即可恢复之前误删的数据。
缺点①RDB 只能保存某个时间间隔的数据,如果中途 Redis 服务被意外终止了,则会丢失一段时间内的 Redis 数据;
②RDB的时候数据集很大就会很耗时;
① 对于相同的数据集来说,AOF 文件要大于 RDB 文件;
②在 Redis 负载比较高的情况下,RDB 比 AOF 性能更好;

两种持久化机制的比较
在这里插入图片描述

2.混合持久化

RDB 和 AOF 持久化各有利弊,RDB 可能会导致一定时间内的数据丢失,而 AOF 由于文件较大则会影响 Redis 的启动速度,为了能同时使用 RDB 和 AOF 各种的优点,Redis 4.0 之后新增了混合持久化的方式。 在开启混合持久化的情况下,AOF 重写时会把 Redis 的持久化数据,以 RDB 的格式写入到 AOF 文件的开头,之后的数据再以 AOF 的格式化追加的文件的末尾。

混合持久化优点:

  • 混合持久化结合了 RDB 和 AOF 持久化的优点,开头为 RDB 的格式,使得 Redis 可以更快的启动,同时结合 AOF 的优点,有减低了大量数据丢失的风险。

混合持久化缺点:

  • AOF 文件中添加了 RDB 格式的内容,使得 AOF 文件的可读性变得很差;
  • 兼容性差,如果开启混合持久化,那么此混合持久化 AOF 文件,就不能用在 Redis 4.0 之前版本了。

3.redis持久化相关的问题

1.在dump rdb过程中,aof如果停止同步,会不会丢失?
答:不会,所有操作缓存在内存的队列里,dump完成后,统一操作。

2、aof重写是指什么?
答:由于日志保存的是所有操作命令,导致存的日志会过大,而且数据库中有可能数据进行过删除,因此日志中的一些命令就相当于无效,因此日志先会删除,然后内存中的数据会逆化成命令,再重新写入到日志文件中,以解决 aof日志过大的问。
 
3、如果rdb文件,和aof文件都存在,优先用谁来恢复数据?
答: 在这种情况下,当redis重启的时候会优先载入AOF文件来恢复原始的数据,因为在通常情况下AOF文件保存的数据集要比RDB文件完整。
 
4、恢复时rdb和aof哪个恢复的快
答: rdb快,因为其是数据的内存映射,直接载入到内存,而aof是命令,需要逐条执行

4.配置持久化

RDB的配置

Rdb快照的配置选项,在redis.windows.conf:

save 900 1 // 900,1条写入,则产生快照
save 300 1000 // 如果300秒内有1000次写入,则产生快照
save 60 10000 // 如果60秒内有10000次写入,则产生快照

(3个选项都屏蔽,则rdb禁用)

和持久化相关的redis配置:

  • stop-writes-on-bgsave-error yes // 后台备份进程出错时,主进程停不停止写入
  • rdbcompression yes // 导出的rdb文件是否压缩
  • Rdbchecksum yes // 导入rbd恢复时数据时,要不要检验rdb的完整性
  • dbfilename dump.rdb //导出来的rdb文件名
  • dir ./ //rdb的放置路径

Aof 的配置:

  • appendonly no # 是否打开 aof日志功能
  • appendfsync always # 每1个命令,都立即同步到aof.安全,速度慢
  • appendfsync everysec # 折衷方案,每秒写1次
  • appendfsync no # 写入工作交给操作系统,由操作系统判断缓冲区大小,统一写入到 aof. 同步频率低,速度快。
  • no-appendfsync-on-rewrite yes: # 正在导出rdb快照的过程中,要不要停止同步aof
  • auto-aof-rewrite-percentage 100 #aof文件大小比起上次重写时的大小,增长率100%时,重写
  • auto-aof-rewrite-min-size 64mb #aof文件,至少超过64M时,重写

八、Redis主从复制

1、集群的特点和布局方式

  • 主从备份----防止主机宕机
  • 读写分离----分担master 的任务
  • 任务分离----如从服分别分担备份工作与计算工作

在这里插入图片描述

第二种方案有一个好处:master宕机后,可以直接切换到slave1

2、主从配置(配置两个从机)

步骤一:进入redis目录,先复制两个redis.windows.conf

在这里插入图片描述

步骤二:修改主机配置文件(禁用rdb,打开aof)
在这里插入图片描述

步骤三:配置两个从服务器(一台启用rdb,两台禁用aof,设置slave-of)

6380端口

在这里插入图片描述
在这里插入图片描述

6381端口
在这里插入图片描述

在这里插入图片描述

步骤四:进入redis目录下cmd,启动三台服务器

redis-server redis.windows.conf    默认启动
redis-server redis.windows6380.conf 
redis-server redis.windows6381.conf 

在这里插入图片描述
在这里插入图片描述

步骤五:启动客户端,再5库插入一条数据
在这里插入图片描述
步骤六:退出客户端,登录80端口看是否存在

九、批处理工具pipeline

redis客户端执行一条命令的过程:发送命令 >命令排队>命令执行>返回结果

使用python给redis发送命令时的过程:

  1. 客户端发送请求,获取socket,阻塞等待返回;
  2. 服务端执行命令并将结果返回给客户端;

当redis需要执行的命令较多时,这样的一来一回的网络传输所消耗的时间被称为RTT(Round Trip Time),显而易见,如果可以将这些命令作为一个请求一次性发送给服务端,并一次性将结果返回客户端,会节约很多网络传输的消耗,可以大大提升响应时间。因此我们通过pipeline来进行效率提升。

在这里插入图片描述
使用Pipeline执行速度比逐条执行要快,特别是客户端与服务端的网络延迟越大,性能体能越明显

原生批命令(mset, mget)与Pipeline对比

  • 原生批命令是原子性,pipeline是非原子性

  • 原生批命令一命令多个key, 但pipeline支持多命令(存在事务),非原子性

  • 原生批命令是服务端实现,而pipeline需要服务端与客户端共同完成

十、Python操作Redis

安装redis模块:pip install redis

操作redis:

import redis

r1 = redis.Redis(host='localhost', port='6379', db=1, password='') # 连接方式1
r2 = redis.Redis(host='127.0.0.1', port=6379, db=8,password='')  # 连接方式2

key='age'
print(redis.get(key))

使用pipeline

# coding:utf-8
import redis

r = redis.StrictRedis.from_url('redis://127.0.0.1/0')
# 创建管道对象
pipe = r.pipeline()
pipe.set('name', '张三')
pipe.set('age', 15)
pipe.set('gender', '男')
# 执行
pipe.execute()

连续执行pipeline

pipe.set('hello', 'redis').sadd('faz', 'baz').incr('num').execute()

接收批量值,返回类型为列表

with r.pipeline() as pipe:
    for i in range(num_len):
        pipe.rpop('num_list')
    try:
        result = pipe.execute()
        print result
    except Exception as e:
        print e
  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

张烫麻辣亮。

谢谢老板,祝你生8个儿子!

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

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

打赏作者

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

抵扣说明:

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

余额充值