Redis的简介与基本操作

一. 在centos6.5中安装Redis

  • 1. 到官网下载Redis:https://redis.io/download
  • 2. 或者直在Linux下运行下面命令
$ wget http://download.redis.io/releases/redis-3.2.8.tar.gz

$ tar xzf redis-3.2.8.tar.gz

$ cd redis-3.2.8

$ make
  • 3. 先启动Redis服务器端:redis-server
  • 4. 然后再启动Redis客户端:redis-cli redis-cli --raw(可以在命令行中显示中文)
  • 5. 安装完成在centos中克隆会话输入redis-cli就可以进行操作
  • 6. python操作Redis需要安装Redis模块( pip install redis )
# redis-cli        #启动Redis客户端
# redis> set foo bar        #设置字典key=foo   value=bar
# OK
# redis> get foo            #获取字典中key foo的值bar
# "bar"

7. 远程客户端无法登录Redis服务器报错,解除保护模式

  • 1)修改redis服务器的配置文件(否则redis默认本机启动无法远程连接操作)

注:源码安装的redies配置文件默认在当前文件夹下( vim /bbb/redis-3.2.8/redis.conf 这里以在/bbb文件夹下安装redis)

vi redis.conf

注释以下绑定的主机地址 : # bind 127.0.0.1 (将绑定修改成:bind 0.0.0.0 )

关闭保护模式:protected-mode no

  • 2)修改redis服务器的参数配置**

a. 修改redis的守护进程为no ,不启用

127.0.0.1:6379> config set daemonize "no"         #可能无法执行

b.修改redis的保护模式为no,不启用                #上一步执行报错,就只执行这条命令,就可行了

127.0.0.1:6379> config set protected-mode "no" 

8. yum安装redis: https://www.linuxidc.com/Linux/2018-02/150956.htm

9、修改配置文件让redis后台启动

1) 修改配置文件

vim /bbb/redis-3.2.8/redis.conf  
daemonize yes         # 将daemonize配置修改成yes

2)启动命令

 cd  /bbb/redis-3.2.8/src
./redis-server ../redis.conf 

3) 确认redis已启动(并根据进程号杀死进程)

(env)[root@op-dev-xiaonaiqiang src]# ps -ef|grep redis
root     31416     1  0 18:51 ?        00:00:00 ./redis-server 127.0.0.1:6379

10、将redis加入环境变量

1# vi /etc/profile           在最后添加以下内容

## Redis env
export PATH=$PATH:/aaa/redis-3.2.8/src

2)使配置生效:

# source /etc/profile                       现在就可以直接使用 redis-cli 等 redis 命令了

二. Redis两种基本操作

1、Redis简介

  1. redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多

  2. 包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)

  3. 这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,且这些操作都是原子性的

  4. 与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步

2、Redis支持以下两种操作方法

1. 第一种操作方法: 操作模式

redis操作模式:

import redis

r = redis.Redis(host='1.1.1.3', port=6379)
r.set('foo', 'Bar')
print(r.get('foo'))

2. 第二种操作方法:连接池

1)redis-py使用connection pool来管理对一个redis server的所有连接,避免每次建立、释放连接的开销

2)默认,每个Redis实例都会维护一个自己的连接池

3)可以直接建立一个连接池,然后作为参数Redis,这样就可以实现多个Redis实例共享一个连接池

redis连接池:

import redis
pool = redis.ConnectionPool(host='1.1.1.3', port=6379)

r = redis.Redis(connection_pool=pool)
r.set('foo', 'Bar')
print(r.get('foo'))

3、Redis的操作可以分为以下几类

1. String 操作

2. Hash 操作

3. List 操作

4. Set 操作

5. Sort Set 操作

三. redis持久化

1、redis持久化介绍

  • 由于Redis的数据都存放在内存中,如果没有配置持久化,redis重启后数据就全丢失了
  • redis提供两种方式进行持久化:
    • 第一种:RDB (将Redis中数据定时dump到硬盘)
    • 第二种:AOF (将Reids的操作日志以追加的方式写入文件)

2、二者原理

1. RDB持久化原理

  • RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘
  • 实际操作过程是fork一个子进程,先将数据集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储
    在这里插入图片描述

2. AOF持久化原理

  • AOF持久化以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录。
    在这里插入图片描述

3、RDB优缺点介绍(快照)

1. RDB优点

  1. 整个Redis数据库将只包含一个文件,一旦系统出现灾难性故障,我们可以非常容易的进行恢复。
  2. 性能最大化,它仅需要fork出子进程,由子进程完成持久化工作,极大的避免服务进程执行IO操作了。
  3. 相比于AOF机制,如果数据集很大,RDB的启动效率会更高

2. RDB缺点

  1. RDB容易丢数据,因为系统一旦在定时持久化之前出现宕机现象,此前没有来得及写入磁盘的数据都将丢失
  2. RDB通过fork子进程来完成持久化的,如果当数据集较大时,可能会导致整个服务器停止服务几百毫秒,甚至是1秒钟。

4、AOF优缺点介绍(镜像)

1. AOF优点

  1. 数据安全性高,Redis中提供了3中同步策略,即每秒同步、每修改同步和不同步
  2. 由于该机制对日志文件的写入操作采用的是append模式,因此在写入过程中即使出现宕机现象,也不会破坏日志文件中已经存在的内容
  3. 如果日志过大,Redis可以自动启用rewrite机制。即Redis以append模式不断的将修改数据写入到老的磁盘文件中
  4. AOF包含一个格式清晰、易于理解的日志文件用于记录所有的修改操作。事实上,我们也可以通过该文件完成数据的重建

2. AOF缺点

  1. 对于相同数量的数据集而言,AOF文件通常要大于RDB文件,RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快。
  2. AOF在运行效率上往往会慢于RDB

四. 在/etc/redis.conf文件中配置持久化

1、在 /etc/redis.conf 中配置使用RDP

1. RDP配置选项(这3个选项都屏蔽,则rdb禁用))

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

2. RDP其他配置

# stop-writes-on-bgsave-error yes  // 后台备份进程出错时,主进程停不停止写入?  主进程不停止 容易造成数据不一致
# rdbcompression yes               // 导出的rdb文件是否压缩    如果rdb的大小很大的话建议这么做
# Rdbchecksum yes                  // 导入rbd恢复时数据时,要不要检验rdb的完整性 验证版本是不是一致
# dbfilename dump.rdb              //导出来的rdb文件名
# dir ./                           //rdb的放置路径

2、在 /etc/redis.conf 中配置使用AOF

# appendonly no                  // 是否打开aof日志功能     aof跟  rdb都打开的情况下 
# 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-benchmark  -n  10000    表示 执行请求10000次,执行ls   发现出现 rdb 跟 aof文件。appendonly.aof     dump.rdb

3、注意的事项

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

注: aof重写是指什么?
      答: aof重写是指把内存中的数据,逆化成命令,写入到.aof日志里,以解决aof日志过大的问题.

问: 如果rdb文件,和aof文件都存在,优先用谁来恢复数据?
      答: aof

问: 2种是否可以同时用?
      答: 可以,而且推荐这么做

问: 恢复时rdb和aof哪个恢复的快
      答: rdb快,因为其是数据的内存映射,直接载入到内存,而aof是命令,需要逐条执行

五. redis主从复制

参考博客: https://www.cnblogs.com/kevingrace/p/5685332.html

1、介绍

  • 和MySQL主从复制的原因一样,Redis虽然读取写入的速度都特别快,但是也会产生读压力特别大的情况。
  • 为了分担读压力,Redis支持主从复制,Redis的主从结构可以采用一主多从或者级联结构。
  • Redis主从复制可以根据是否是全量分为全量同步和增量同步。

下图为级联结构:
在这里插入图片描述

2、全量同步

注:Redis全量复制一般发生在Slave初始化阶段,这时Slave需要将Master上的所有数据都复制一份。具体步骤如下:

  • 1)从服务器连接主服务器,发送SYNC命令;
  • 2)主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命令;
  • 3)主服务器BGSAVE执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令;
  • 4)从服务器收到快照文件后丢弃所有旧数据,载入收到的快照;
  • 5)主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令;
  • 6)从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令;
          
    - 7)完成上面几个步骤后就完成了从服务器数据初始化的所有操作,从服务器此时可以接收来自用户的读请求。
    在这里插入图片描述

3、增量同步

  • Redis增量复制是指Slave初始化后开始正常工作时主服务器发生的写操作同步到从服务器的过程。
  • 增量复制的过程主要是主服务器每执行一个写命令就会向从服务器发送相同的写命令,从服务器接收并执行收到的写命令。

4、Redis主从同步策略

  • 主从刚刚连接的时候,进行全量同步;全同步结束后,进行增量同步。
  • 当然,如果有需要,slave 在任何时候都可以发起全量同步。
  • redis 策略是,无论如何,首先会尝试进行增量同步,如不成功,要求从机进行全量同步。

5、注意点

  • 如果多个Slave断线了,需要重启的时候,因为只要Slave启动,就会发送sync请求和主机全量同步,当多个同时出现的时候,可能会导致Master
    IO剧增宕机。

六. redis的五大数据类型实现原理

1、string

  • 字符串是Redis最基本的数据类型,不仅所有key都是字符串类型,其它几种数据类型构成的元素也是字符串。
  • 编码:int 编码是用来保存整数值,raw编码是用来保存长字符串,而embstr是用来保存短字符串。

  • 注:字符串的长度不能超过512M。

2、list(列表)

  • list 列表,它是简单的字符串列表,按照插入顺序排序,你可以添加一个元素到列表的头部(左边)或者尾部(右边),它的底层实际上是个链表结构。
  • 编码: 可以是 ziplist(压缩列表) 和 linkedlist(双端链表)。

3、哈希对象

  • 哈希对象的键是一个字符串类型,值是一个键值对集合。
  • 编码:哈希对象的编码可以是 ziplist 或者 hashtable。

4、集合对象

  • 集合对象 set 是 string 类型(整数也会转换成string类型进行存储)的无序集合。

5、有序集合

  • 与列表使用索引下标作为排序依据不同,有序集合为每个元素设置一个分数(score)作为排序依据。
  • 编码:有序集合的编码可以是 ziplist 或者 skiplist。

七. redis事物与分布式锁

1、redis事物

  • 严格意义来讲,Redis的事务和我们理解的传统数据库(如mysql)的事务是不一样的;
  • Redis的事务实质上是命令的集合,在一个事务中要么所有命令都被执行,要么所有事物都不执行。

需要注意的是:

1.Redis的事务没有关系数据库事务提供的回滚(rollback),所以开发者必须在事务执行失败后进行后续的处理;
2.如果在一个事务中的命令出现错误,那么所有的命令都不会执行;
3.如果在一个事务中出现运行错误,那么正确的命令会被执行。

2、redis原子操作

  • 原子操作是指不会被线程调度机制打断的操作
  • 这种操作一旦开始,就会一直运行到结束,中间不会切换任何进程

3、分布式锁

  • 分布式锁本质是占一个坑,当别的进程也要来占坑时发现已经被占,就会放弃或者稍后重试
  • 占坑一般使用 setnx(set if not exists)指令,只允许一个客户端占坑
  • 先来先占,用完了在调用del指令释放坑

setnx lock:codehole true
… do something critical …
del lock:codehole

  • 但是这样有一个问题,如果逻辑执行到中间出现异常,可能导致del指令没有被调用,这样就会陷入死锁,锁永远无法释放
  • 为了解决死锁问题,我们拿到锁时可以加上一个expire过期时间,这样即使出现异常,当到达过期时间也会自动释放锁

setnx lock:codehole true
expire lock:codehole 5
… do something critical …
del lock:codehole

  • 这样又有一个问题,setnx和expire是两天指令而不是原子指令
  • 为了治理上面乱象,在redis 2.8中加入了set指令的扩展参数,使setnx和expire指令可以一起执行

set lock:codehole true ex 5 nx
‘’’ do something ‘’’
del lock:codehole

发布了46 篇原创文章 · 获赞 10 · 访问量 1863

猜你喜欢

转载自blog.csdn.net/longlong6682/article/details/104592072