Redis超详细入门手册教程!还不快来看看?

news/2024/11/23 3:50:20/

 地址:

RedisRedis is an open source (BSD licensed), in-memory data structure store, used as a database, cache, and message broker. Redis provides data structures …https://redis.io/

1:NoSQL简介

1.1:数据库应用的演变历程

                单机数据库时代、Memcached时代、读写分离时代、分表分库时代(集群)、nosql时代。

1.2:NoSQL数据库

            NoSQL = Not Only SQL(不仅仅是SQL) ,泛指non-relational(非关系型数据库)。今天随着互联网web2.0网站的兴起,比如谷歌或Facebook每天为他们的用户收集万亿比特的数据,这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展,就是一个数据量超大。传统的SQL语句库不再适应这些应用了。NoSQL数据库是为了解决大规模数据集合多重数据种类带来的挑战,特别是超大规模数据的存储。

NoSQL数据库的一个显著特点就是去掉了关系数据库的关系型特性,数据之间一旦没有关系,使得扩展性、读写性能都大大提高。

1.3:当前NoSQL的使用

         NoSQL和传统的关系型数据库不是排斥和取代的关系,在一个分布式应用中往往是结合使用的。复杂的互联网应用通常都是多数据源、多数据类型,应该根据数据的使用情况和特点,存放在合适的数据库中。 

1.4:NoSQL数据模型

传统关系型数据库:

t_student、t_address、t_course

 NoSql数据库:聚合结构

{"student":{"id":1001,"name":"zhangsan","addresses":{"province":"beijing","city":"daxingqu","street":"liangshuihe"},"courses":[{"id":01,"name":"java"},{"id":02,"name":"mybatis"},{"id":03,"name":"spring"}]}
}

2:Redis

1.2:Redis简介

           Remote Dictionary Server(远程字典服务器),是一个用C语言编写的、开源的、基于内存运行并支持持久化的、高性能的NoSQL数据库.也是当前热门的NoSQL数据库之一。

1.2:Redis的特点

1、支持数据持久化Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。

2支持多种数据结构:Redis不仅仅支持简单的key-value类型的数据,同时还提供listsetzsethash等数据结构的存储。

3支持数据备份:Redis支持数据的备份,即master-slave模式的数据备份。

1.3:Redis客户端

1:Redis客户端是一个程序,通过网络连接到Redis服务器,从而实现跟 Redis服务器的交互。

2:Redis客户端发送命令,同时显示Redis服务器的处理结果。

3:redis-cli(Redis Command Line Interface)是Redis自带的基于命令行的Redis客户端,用于与服务端交互,我们可以使用该客户端来执行redis的各种命令。

  1. 启动Redis客户端:
  1. 直接连接redis (默认ip127.0.0.1,端口6379):redis-cli

在任意目录执行  redis-cli

此命令是连接本机127.0.0.1 ,端口6379的redis

  1. 指定IP和端口连接redis:redis-cli –h 127.0.0.1 -p 6379
  2. redis-cli  -h 相连接主机的IP地址 –p redis的端口号

-h redis主机IP(可以指定任意的redis服务器)

-p端口号(不同的端口表示不同的redis应用)

在任意目录下执行  redis-cli -h 127.0.0.1 -p 6379

退出Redis客户端:exit或者quit指令。

1.4:Redis基本知识

1. 测试Redis性能

2. Redis沟通命令,查看状态

redis >ping 返回PONG

解释:输入ping,redis给我们返回PONG,表示redis服务运行正常

 

 3. 查看redis服务器的统计信息:info

语法:info [section]

作用:以一种易于解释且易于阅读的格式,返回关于 Redis 服务器的各种信息和统计数值。section 用来返回指定部分的统计信息。 section的值:server , clients ,memory等等。不加section 返回全部统计信息

返回值:指定section的统计信息或全部信息

1:统计server的信息

 2:统计全部信息

 

 4. redis默认使用16个库

 Redis默认使用16个库,从0到15。 对数据库个数的修改,在redis.conf文件中databases 16,理论上可以配置无限多个。

 Redis的库和关系型数据库中的数据库实例类似,但又有一些不同,比如redis中各个库不能自定义命名,只能用序号表示,redis中各个库不是完全独立的,使用时最好一个应用使用一个redis实例,不建议一个redis实例中保存多个应用的数据。Redis实例本身所占存储空间其实是非常小的,因此不会造成存储空间的浪费。

5. 切换库命令:select db

 默认使用第0个,如果要使用其他数据库,命令是 select index

6. 查看当前数据库中key的数目:dbsize

语法:dbsize

作用:返回当前数据库的 key 的数量。

返回值:数字,key的数量

7. 查看当前数据库中有哪些key:keys *

 8. 清空当前库:flushdb

 9. 清空所有数据库:flushall

 这也体现出redis中的库并不是完全无关的。

 10. config get * 获得redis的所有配置值

语法:config get parameter

作用:获取运行中Redis服务器的配置参数, 获取全部配置可以使用*。参数信息来自redis.conf 文件的内容。

例1:获取数据库个数 config get databases

 例2:获取端口号config get port

1.5:手册地址:

redis英文版命令大全:Commands | Redishttps://redis.io/commandsredis中文版命令大全:Redis 命令参考 — Redis 命令参考http://redisdoc.com/

3:Redis的五种数据类型

 A: 字符串类型 string

 字符串类型是Redis中最基本的数据结构,它能存储任何类型的数据,包括二进制数

据,序列化后的数据,JSON化的对象甚至是一张图片。最大512M。

B: 列表类型 list

 Redis列表是简单的字符串列表,按照插入顺序排序,元素可以重复。你可以添加一个元素到列表的头部(左边)或者尾部(右边),底层是个链表结构。

C: 集合类型 set

 Redis的Set是string类型的无序无重复集合。

D: 哈希类型 hash

Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。

E: 有序集合类型 zset (sorted set)

Redis 有序集合zset和集合set一样也是string类型元素的集合,且不允许重复的成员。

不同的是zset的每个元素都会关联一个分数(分数可以重复),redis通过分数来为集合中的成员进行从小到大的排序。

4: Redis的常用操作命令

4.1 Redis的Key的操作命令

语法:keys pattern

作用:查找所有符合模式pattern的key.  pattern可以使用通配符。

通配符:

  1. *:表示0或多个字符,例如:keys * 查询所有的key。
  2. ?:表示单个字符,例如:wo?d , 匹配 word , wood
  3. [] :表示选择[]内的一个字符,例如wo[or]d, 匹配word, wood, 不匹配wold、woord

4.2  exists

语法:exists key [key…]

作用:判断key是否存在

返回值:整数,存在key返回1,其他返回0。使用多个key,返回存在的key的数量。

4.3 move

语法:move key db

作用:移动key到指定的数据库,移动的key在原库被删除。

返回值:移动成功返回1,失败返回0.

4.4 ttl

语法:ttl key

作用:查看key的剩余生存时间(ttl: time to live),以秒为单位。

返回值:

  1. -1 :没有设置key的生存时间, key永不过期。
  2. -2:key不存在

 4.5 expire

语法:expire key seconds

作用:设置key的生存时间,超过时间,key自动删除。单位是秒。

返回值:设置成功返回数字 1,其他情况是 0 。

4.6 type

语法:type key

作用:查看key所存储值的数据类型

返回值:字符串表示的数据类型

  1. none (key不存在)
  2. string (字符串)
  3. list (列表)
  4. set (集合)
  5. zset (有序集)
  6. hash (哈希表)

4.7  rename

语法:rename key newkey

作用:将key改为名newkey。当 key 和 newkey 相同,或者 key 不存在时,返回一个错误。

当 newkey 已经存在时, RENAME 命令将覆盖旧值。

 4.8  del

语法:del key [key…]

作用:删除存在的key,不存在的key忽略。

返回值:数字,删除的key的数量。

5:  字符串类型(string)

       字符串类型是Redis中最基本的数据类型,它能存储任何形式的字符串,包括二进制数

据,序列化后的数据,JSON化的对象甚至是一张图片。

字符串类型的数据操作总的思想是通过key操作value,key是数据标识,value是我们感

兴趣的业务数据。

6:set

语法:set key value

功能:将字符串值 value 设置到 key 中,如果key已存在,后放的值会把前放的值覆盖掉。

返回值:OK表示成功

 6.1 get

语法:get key

功能:获取 key 中设置的字符串值

返回值:key存在,返回key对应的value;

                key不存在,返回nil

6.2 append

语法:append key value

功能:如果 key 存在,则将 value 追加到 key 原来旧值的末尾

          如果 key 不存在,则将key 设置值为 value

返回值:追加字符串之后的总长度(字符个数)

 6.3 strlen

语法:strlen key

功能:返回 key 所储存的字符串值的长度

返回值:如果key存在,返回字符串值的长度;

        key不存在,返回0

 6.4 incr

语法:incr key

功能:将 key 中储存的数字值加1,如果 key 不存在,则 key 的值先被初始化为 0 再执行incr操作。

返回值:返回加1后的key值

 6.5 decr

语法:decr key

功能:将 key 中储存的数字值减1,如果 key 不存在,则么 key 的值先被初始化为 0 再执行 decr 操作。

返回值:返回减1后的key值

6.6  incrby

语法:incrby key offset

功能:将 key 所储存的值加上增量值,如果 key 不存在,则 key 的值先被初始化为 0 再执行 INCRBY 命令。

返回值:返回增量之后的key值。

6.7  decrby

语法:decrby key offset

功能:将 key 所储存的值减去减量值,如果 key 不存在,则 key 的值先被初始化为 0 再执行 DECRBY 命令。

返回值:返回减量之后的key值。

 6.8  getrange

语法:getrange key startIndex endIndex

功能:获取 key 中字符串值从 startIndex 开始到 endIndex 结束的子字符串,包括startIndex和endIndex, 负数表示从字符串的末尾开始,-1 表示最后一个字符。

6.9  setrange

语法:setrange key offsetIndex value

功能:用value覆盖key的存储的值从offset开始。

返回值:修改后的字符串的长度。

6.10  setex

语法:setex key seconds value

功能:设置key的值,并将 key 的生存时间设为 seconds (以秒为单位)  ,如果key已经存在,将覆盖旧值。

返回值:设置成功,返回OK。

6.11  mset

语法:mset key value [key value…]

功能:同时设置一个或多个 key-value 对

返回值:设置成功,返回OK。

6.12  mget

语法:mget key [key …]

功能:获取所有(一个或多个)给定 key 的值

返回值:包含所有key的列表,如果key不存在,则返回nil。

6.13  msetnx

语法:msetnx key value[key value…]

功能:同时设置一个或多个 key-value 对,如果有一个key是存在的,则设置不成功。

返回值:设置成功,返回1

设置失败,返回0

7:列表(List)

        Redis列表是简单的字符串列表,按照插入顺序排序,左边(头部)、右边(尾部)或者中间都可以添加元素。链表的操作无论是头或者尾效率都极高,但是如果对中间元素进行操作,那效率会大大降低了。

        列表类型的数据操作总的思想是通过key和下标操作value,key是数据标识,下标是数据在列表中的位置,value是我们感兴趣的业务数据。

 7.1 lpush

语法:lpush key value [value…]

功能:将一个或多个值 value 插入到列表 key 的最左边(表头),各个value值依次插入到表头位置。

返回值:插入之后的列表的长度。

7.2  rpush

语法:rpush key value [value…]

功能:将一个或多个值 value 插入到列表 key 的最右边(表尾),各个 value 值按依次插入到表尾。

返回值:插入之后的列表的长度

 7.3 lrange

语法:lrange key startIndex endIndex

功能:获取列表 key 中指定下标区间内的元素,下标从0开始,到列表长度-1;下标也可以是负数,表示列表从后往前取,-1表示倒数第一个元素,-2表示倒数第二个元素,以此类推;startIndex和endIndex超出范围不会报错。

返回值:获取到的元素列表。

 7.4 lpop

语法:lpop key

功能:移除并返回列表key头部第一个元素,即列表左侧的第一个元素。

返回值:列表左侧第一个元素的值;列表key不存在,返回nil。

 7.5 rpop

语法:rpop key

功能:移除并返回列表key尾部第一个元素,即列表右侧的第一个元素。

返回值:列表右侧第一个元素的值;列表key不存在,返回nil。

7.6  lindex

语法:lindex key index

功能:获取列表 key 中下标为指定 index 的元素,列表元素不删除,只是查询。0 表示列表的第一个元素,1 表示列表的第二个元素;index也可以负数的下标, -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。

返回值:key存在时,返回指定元素的值;

              Key不存在时,返回nil。

 7.7  llen

语法:llen key

功能:获取列表 key 的长度

返回值:数值,列表的长度;key不存在返回0

7.8  lrem

语法:lrem key count value

功能:根据参数 count 的值,移除列表中与参数 value 相等的元素,

count >0 ,从列表的左侧向右开始移除;

count < 0 从列表的尾部开始移除;

count = 0移除表中所有与 value 相等的值。

返回值:数值,移除的元素个数

7.9  ltrim

语法:ltrim key startIndex endIndex

功能:截取key的指定下标区间的元素,并且赋值给key。下标从0开始,一直到列表长度-1;下标也可以是负数,表示列表从后往前取,-1表示倒数第一个元素,-2表示倒数第二个元素,以此类推;startIndex和endIndex超出范围不会报错。

返回值:执行成功返回ok

 7.10  lset

语法:lset key index value

功能:将列表 key 下标为 index 的元素的值设置为 value。

功能:设置成功返回ok ; key不存在或者index超出范围返回错误信息。

7.11  linsert

语法:linsert key before/after pivot value

功能:将值 value 插入到列表 key 当中位于值 pivot 之前或之后的位置。key不存在或者pivot不在列表中,不执行任何操作。

返回值:命令执行成功,返回新列表的长度。没有找到pivot返回 -1, key不存在返回0。

8:集合类型(set)

Redis的Set是string类型的无序不重复集合。

集合类型的数据操作总的思想是通过key确定集合,key是集合标识,元素没有下标,只有直接操作业务数据和数据的个数。

8.1 sadd

语法:sadd key member [member…]

功能:将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略,不会再加入。

返回值:加入到集合的新元素的个数(不包括被忽略的元素)。

8.2  smembers

语法:smembers key

功能:获取集合 key 中的所有成员元素,不存在的key视为空集合。

返回值:返回指定集合的所有元素集合,不存在的key,返回空集合。

8.3  sismember

语法:sismember key member

功能:判断 member 元素是否是集合 key 的元素

返回值:member是集合成员返回1,其他返回 0 。

8.4  scard

语法:scard key

功能:获取集合里面的元素个数

返回值:数字,key的元素个数。其他情况返回 0 。

8.5  srem

语法:srem key member [member…]

功能:移除集合中一个或多个元素,不存在的元素被忽略。

返回值:数字,成功移除的元素个数,不包括被忽略的元素。

8.6  srandmember

语法:srandmember key[count]

功能:只提供key,随机返回集合中一个元素,元素不删除,依然在集合中;

          提供了count时,count 正数, 返回包含count个数元素的集合,集合元素各不重复。count是负数,返回一个count绝对值的长度的集合,集合中元素可能会重复多次。

返回值:一个元素或者多个元素的集合

8.7  spop

语法:spop key[count]

功能:随机从集合中删除一个或count个元素。

返回值:被删除的元素,key不存在或空集合返回nil。

8.8  smove

语法:smove src dest member

功能:将 member 元素从src集合移动到dest集合,member不存在,smove不执行操作,返回0,如果dest存在member,则仅从src中删除member。

返回值:成功返回 1 ,其他返回 0 。

8.9  sdiff

语法:sdiff key key [key…]

功能:返回指定集合的差集,以第一个集合为准进行比较,即第一个集合中有但在其它任何集合中都没有的元素组成的集合。

返回值:返回第一个集合中有而后边集合中都没有的元素组成的集合,如果第一个集合中的元素在后边集合中都有则返回空集合。

8.10  sinter

语法:sinter key key [key…]

功能:返回指定集合的交集,即指定的所有集合中都有的元素组成的集合。

返回值:交集元素组成的集合,如果没有则返回空集合。

8.11  sunion

语法:sunion key key [key…]

功能:返回指定集合的并集,即指定的所有集合元素组成的大集合,如果元素有重复,则保留一个。

返回值:返回所有集合元素组成的大集合,如果所有key都不存在,返回空集合。

9:哈希类型(hash)

       Redis的hash 是一个string类型的key和value的映射表,这里的value是一系列的键值对,hash特别适合用于存储对象。

       哈希类型的数据操作总的思想是通过key和field操作value,key是数据标识,field是域,value是我们感兴趣的业务数据。

9.1  hset

语法:hset  key  field  value  [field  value …]

功能:将键值对field-value设置到哈希列表key中,如果key不存在,则新建哈希列表,然后执行赋值,如果key下的field已经存在,则value值覆盖。

返回值:返回设置成功的键值对个数。

9.2  hget

语法:hget key field

功能:获取哈希表 key 中给定域 field 的值。

返回值:field域的值,如果key不存在或者field不存在返回nil。

9.3  hmset

语法:hmset key  field value [field value…]

功能:同时将多个 field-value (域-值)设置到哈希表 key 中,此命令会覆盖已经存在的field,hash表key不存在,创建空的hash表,再执行hmset.

返回值:设置成功返回ok,如果失败返回一个错误

9.4  hmget

语法:hmget key field [field…]

功能:获取哈希表 key 中一个或多个给定域的值

返回值:返回和field顺序对应的值,如果field不存在,返回nil。

9.5  hgetall

语法:hgetall key

功能:获取哈希表 key 中所有的域和值

返回值:以列表形式返回hash中域和域的值,key不存在,返回空hash.

9.6  hdel

语法:hdel key field [field…]

功能:删除哈希表 key 中的一个或多个指定域field,不存在field直接忽略。

返回值:成功删除的field的数量。

9.7  hlen

语法:hlen key

功能:获取哈希表 key 中域field的个数

返回值:数值,field的个数。key不存在返回0.

9.8  hexists

语法:hexists key field

功能:查看哈希表 key 中,给定域 field 是否存在

返回值:如果field存在,返回1,其他返回0。

9.9  hkeys

语法:hkeys key

功能:查看哈希表 key 中的所有field域列表

返回值:包含所有field的列表,key不存在返回空列表

9.10  hvals

语法:hvals key

功能:返回哈希表 中所有域的值列表

返回值:包含哈希表所有域值的列表,key不存在返回空列表。

9.11  hincrby

语法:hincrby key field int

功能:给哈希表key中的field域增加int

返回值:返回增加之后的field域的值

9.12  hincrbyfloat

语法:hincrbyfloat key field float

功能:给哈希表key中的field域增加float

返回值:返回增加之后的field域的值

 9.13  hsetnx

语法:hsetnx key field value

功能:将哈希表 key 中的域 field 的值设置为 value ,当且仅当域 field 不存在的时候才设置,否则不设置。

返回值:设值成功返回1,其他返回0.

 10:有序集合类型(Zset)

        Redis 有序集合zset和集合set一样也是string类型元素的集合,且不允许重复的成员。

       不同的是zset的每个元素都会关联一个分数(分数可以重复),redis通过分数来为集合中的成员进行从小到大的排序。

10.1 zadd

语法:zadd key score member [score member…]

功能:将一个或多个 member 元素及其 score 值加入到有序集合 key 中,如果member存在集合中,则覆盖原来的值;score可以是整数或浮点数.

返回值:数字,新添加的元素个数.

10.2  zrange

语法:zrange key startIndex endIndex [WITHSCORES]

功能:查询有序集合,指定区间的内的元素。集合成员按score值从小到大来排序;startIndex和endIndex都是从0开始表示第一个元素,1表示第二个元素,以此类推; startIndex和endIndex都可以取负数,表示从后往前取,-1表示倒数第一个元素;WITHSCORES选项让score和value一同返回。

返回值:指定区间的成员组成的集合。

10.3  zrangebyscore

语法:zrangebyscore key min max [WITHSCORES ] [LIMIT offset count]

功能:获取有序集 key 中,所有 score 值介于 min 和 max 之间(包括min和max)的成员,有序成员是按递增(从小到大)排序;

          使用符号”(“ 表示包括min但不包括max;

          withscores 显示score和 value;

      limit用来限制返回结果的数量和区间,在结果集中从第offset个开始,取count个。

返回值:指定区间的集合数据

10.4  zrem

语法:zrem key member [member…]

功能:删除有序集合 key 中的一个或多个成员,不存在的成员被忽略。

返回值:被成功删除的成员数量,不包括被忽略的成员。

10.5  zcard

语法:zcard key

作用:获取有序集 key 的元素成员的个数。

返回值:key存在,返回集合元素的个数; key不存在,返回0。

10.6  zcount

语法:zcount key min max

功能:返回有序集 key 中, score 值在 min 和 max 之间(包括 score 值等于 min 或 max )的成员的数量。

返回值:指定有序集合中分数在指定区间内的元素数量。

10.7  zrank

语法:zrank key member

功能:获取有序集 key 中成员 member 的排名,有序集成员按 score 值从小到大顺序排列,从0开始排名,score最小的是0 。

返回值:指定元素在有序集合中的排名;如果指定元素不存在,返回nil

10.8  zscore

语法:zscore key member

功能:获取有序集合key中元素member的分数。

返回值:返回指定有序集合元素的分数。

10.9  zrevrank

语法:zrevrank key member

功能:获取有序集 key 中成员 member 的排名,有序集成员按 score 值从大到小顺序排列,从0开始排名,score最大的是0 。

返回值:指定元素在有序集合中的排名;如果指定元素不存在,返回nil。

10.10  zrevrange

语法:zrevrange key startIndex endIndex [WITHSCORES]

功能:查询有序集合,指定区间的内的元素。集合成员按score值从大到小来排序;startIndex和endIndex都是从0开始表示第一个元素,1表示第二个元素,以此类推; startIndex和endIndex都可以取负数,表示从后往前取,-1表示倒数第一个元素;WITHSCORES选项让score和value一同返回。

返回值:指定区间的成员组成的集合。

10.11  zrevrangebyscore

语法:zrevrangebyscore key max min  [WITHSCORES ] [LIMIT offset count]

功能:获取有序集 key 中,所有 score 值介于 max 和 min 之间(包括max和min)的成员,有序成员是按递减(从大到小)排序;

          使用符号”(“ 表示不包括min和max;

          withscores 显示score和 value;

      limit用来限制返回结果的数量和区间,在结果集中从第offset个开始,取count个。

返回值:指定区间的集合数据

3 Redis的配置文件

3.1  redis.conf存放位置:

        Redis的安装根目录下(/opt/redis-5.0.2),Redis在启动时会加载这个配置文件,在运行时按照配置进行工作。 这个文件有时候我们会拿出来,单独存放在某一个位置,启动的时候必须明确指定使用哪个配置文件,此文件才会生效。

3.2  Redis 的网络相关配置

1、bind:绑定IP地址,其它机器可以通过此IP访问Redis,默认绑定127.0.0.1,也可以修改为本机的IP地址。

2、port:配置Redis占用的端口,默认是6379。

3、tcp-keepalive:TCP连接保活策略,可以通过tcp-keepalive配置项来进行设置,单位为秒,假如设置为60秒,则server端会每60秒向连接空闲的客户端发起一次ACK请求,以检查客户端是否已经挂掉,对于无响应的客户端则会关闭其连接。如果设置为0,则不会进行保活检测。

3.3  Redis的常规配置

1、loglevel:日志级别,开发阶段可以设置成debug,生产阶段通常设置为notice或者warning.

2、logfile:指定日志文件名,如果不指定,Redis只进行标准输出。要保证日志文件所在的目录必须存在,文件可以不存在。还要在redis启动时指定所使用的配置文件,否则配置不起作用。

3、databases:配置Redis数据库的个数,默认是16个。

3.4  Redis的安全配置

1、requirepass:配置Redis的访问密码。默认不配置密码,即访问不需要密码验证。此配置项需要在protected-mode=yes时起作用。使用密码登录客户端:redis-cli -h ip -p 6379 -a pwd

3.5  Redis的RDB配置

1、save <seconds> <changes>:配置复合的快照触发条件,即Redis 在seconds秒内key改变changes次,Redis把快照内的数据保存到磁盘中一次。默认的策略是:

1分钟内改变了1万次

或者5分钟内改变了10

或者15分钟内改变了1

如果要禁用Redis的持久化功能,则把所有的save配置都注释掉。

2、stop-writes-on-bgsave-error:当bgsave快照操作出错时停止写数据到磁盘,这样能保证内存数据和磁盘数据的一致性,但如果不在乎这种一致性,要在bgsave快照操作出错时继续写操作,这里需要配置为no。

3、rdbcompression:设置对于存储到磁盘中的快照是否进行压缩,设置为yes时,Redis会采用LZF算法进行压缩;如果不想消耗CPU进行压缩的话,可以设置为no,关闭此功能。

4、rdbchecksum:在存储快照以后,还可以让Redis使用CRC64算法来进行数据校验,但这样会消耗一定的性能,如果系统比较在意性能的提升,可以设置为no,关闭此功能。

5、dbfilename:Redis持久化数据生成的文件名,默认是dump.rdb,也可以自己配置。

6、dir:Redis持久化数据生成文件保存的目录,默认是./即redis的启动目录,也可以自己配置。

3.6  Redis AOF配置

1、appendonly:配置是否开启AOF,yes表示开启,no表示关闭。默认是no。

2、appendfilename:AOF保存文件名

3、appendfsync:AOF异步持久化策略

always:同步持久化,每次发生数据变化会立刻写入到磁盘中。性能较差但数据完整性比较好(慢,安全)
everysec:出厂默认推荐,每秒异步记录一次(默认值)
no:不即时同步,由操作系统决定何时同步。

4no-appendfsync-on-rewrite:重写时是否可以运用appendsync,默认no,可以保证数据的安全性。

5auto-aof-rewrite-percentage:设置重写的基准百分比

6auto-aof-rewrite-min-size:设置重写的基准值

Redis的事务

4.1  Redis的事务

       Redis的事务允许在一次单独的步骤中执行一组命令,并且能够保证将一个事务中的所有命令序列化,然后按顺序执行;在一个Redis事务中,Redis要么执行其中的所有命令,要么什么都不执行。即Redis的事务要能够保证序列化和原子性。

4.2 事务的常用命令

1.multi

语法:multi

功能:用于标记事务块的开始。Redis会将后续的命令逐个放入队列中,然后才能使用EXEC命令原子化地执行这个命令序列。

返回值:开启成功返回OK

2.exec

语法:exec

功能:在一个事务中执行所有先前放入队列的命令,然后恢复正常的连接状态。

如果在把命令压入队列的过程中报错,则整个队列中的命令都不会执行,执行结果报错;

如果在压队列的过程中正常,在执行队列中某一个命令报错,则只会影响本条命令的执行结果,其它命令正常运行;

当使用WATCH命令时,只有当受监控的键没有被修改时,EXEC命令才会执行事务中的命令;而一旦执行了exec命令,之前加的所有watch监控全部取消。

返回值:这个命令的返回值是一个数组,其中的每个元素分别是原子化事务中的每个命令的返回值。 当使用WATCH命令时,如果事务执行中止,那么EXEC命令就会返回一个Null值。

3.discard

语法:discard

功能:清除所有先前在一个事务中放入队列的命令,并且结束事务。

如果使用了WATCH命令,那么DISCARD命令就会将当前连接监控的所有键取消监控。

返回值:清除成功,返回OK。

4.watch

语法:watch key [key …]

功能:当某个事务需要按条件执行时,就要使用这个命令将给定的键设置为受监控的。如果被监控的key值在本事务外有修改时,则本事务所有指令都不会被执行。Watch命令相当于关系型数据库中的乐观锁。

返回值:监控成功,返回OK。

5. unwatch

语法:unwatch

功能:清除所有先前为一个事务监控的键。

          如果在watch命令之后你调用了EXEC或DISCARD命令,那么就不需要手动调用UNWATCH命令。

返回值:清除成功,返回OK。

4.3 Redis事务小结 

1、单独的隔离操作:事务中的所有命令都会序列化、顺序地执行。事务在执行过程中,不会被其它客户端发来的命令请求所打断,除非使用watch命令监控某些键。

2、不保证事务的原子性:redis同一个事务中如果一条命令执行失败,其后的命令仍然可能会被执行,redis的事务没有回滚。Redis已经在系统内部进行功能简化,这样可以确保更快的运行速度,因为Redis不需要事务回滚的能力。

5. Redis消息的发布与订阅(了解)

5.1 Redis发布订阅

      Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。Redis 客户端可以订阅任意数量的频道。

5.2  Redis发布订阅示意图

5.3  Redis发布订阅的常用命令

5.3.1 subscribe

语法:subscribe channel [channel…]

功能:订阅一个或多个频道的信息

返回值:订阅的消息

5.3.2 publish

语法:publish chanel message

功能:将信息发送到指定的频道。

返回值:数字。接收到消息订阅者的数量。

5.3.3 psubscribe

语法:psubscribe pattern [pattern]

功能:订阅一个或多个符合给定模式的频道。模式以 * 作为通配符,例如:news.* 匹配所有以 news. 开头的频道。

返回值:订阅的信息。

6:Redis的主从复制

       主机数据更新后根据配置和策略,自动同步到从机的master/slave机制,Master以写为主,Slave以读为主。

6.1  一主二从(原理)

1、配从(库)不配主(库)

2、配从(库): slaveof 主库IP 主库端口

3、主写从读、读写分离

4、从连前后同

5、主断从待命、从断重新连

6.2  一主二从搭建

1、一台服务器模拟三台主机:

第一步:将redis.conf 拷贝三份,名字分别是,redis6379.confredis6380.confredis6381.conf
第二步:修改三个文件的port端口,pid文件名,日志文件名,rdb文件名

                如:

port 6379

pidfile /var/run/redis_6379.pid

logfile "6379.log"

dbfilename dump6379.rdb
第三步:分别打开三个窗口模拟三台服务器,开启redis服务。

 2、查询主从信息:info replication

 3、写操作6379

4、设置主从关系:

63806381主机上分别执行命令:slaveof 127.0.0.1 6379

 另一种方式,就是修改63806381的配置文件,在最后加上:

注意:如果主redis设置了密码,从库的redis.conf中还需要设置masterauth为主redis的密码。 

5、全量复制:在63806381分别执行命令get k1

 6、增量复制:6379执行命令:set k2 v2。然后6380端口和6381端口,分别执行命令:get k2

 7、主写从读、读写分离:在63806381上执行写操作set k3 v3

 8、主机宕机:6379执行指令shutdown,并查看63806381redis信息

从机原地待命。

9、主机宕机后恢复:重启6379,并且执行写命令set k4 v463806381上分别执行get k4

主机重启后,一切正常。

10、从机宕机:6380执行指令shutdown,并查看63796381redis信息

 11、从机宕机后恢复:重启6380,并查看638063796381redis信息

注意:从机跟master断开联系,必须重新连接,除非写进配置文件。

12、从机恢复连主机前,主机写操作:6379执行写命令set k5 v563806381分别执行命令get k5

 13、从机恢复连接主机,6380执行命令:slaveof 127.0.0.1 6379,并且执行命令:get k5

14、从机上位:

第一步:主机宕机,6379执行命令:shutdown

 第二步:6380断开主从关系,执行命令:SLAVEOF no one

 第三步:重新搭建主从,6381执行命令:info replicationSLAVEOF 127.0.0.1 6380

 第四步:之前主机恢复,重启6379Redis服务,并执行命令:info replication

6379主机宕机后,6380从机断开主从关系,6381开始还在原地待命;后来6380从机上位,6381投靠63806379主机即使回来但它已是孤寡老人,空头司令。

15、天堂变地狱:6379执行命令saveof 127.0.0.1 6381,并在63796381执行info replication

 一台主机配多台从机,一台从机再配多台从机,从而实现了庞大的集群架构。同时也减轻了一台主机的压力,缺点是增加了服务器间的延迟。

7:复制原理

7.1 全量复制

       slave启动成功连接到master后会发送一个sync命令;Master接到命令启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令,在后台进程执行完毕之后,master将传送整个数据文件到slave,以完成一次完全同步;slave服务在接收到数据库文件数据后,将其存盘并加载到内存中。只要是重新连接master,一次完全同步(全量复制)将被自动执行。

7.2  增量复制

Master将新的所有收集到的修改命令依次传给slave,完成同步。

8:哨兵模式

8.1  哨兵模式原理

        从机上位的自动版。Redis提供了哨兵的命令,哨兵命令是一个独立的进程,哨兵通过发送命令,来监控主从服务器的运行状态,如果检测到master故障了根据投票数自动将某一个slave转换master,然后通过消息订阅模式通知其它slave,让它们切换主机。然而,一个哨兵进程对Redis服务器进行监控,可能会出现问题,为此,我们可以使用多哨兵进行监控。

8.2  哨兵模式搭建

1—7步跟1.17.2.2一主二从搭建一样:一台服务器模拟三台主机、查询主从信息、写操作6379、设置主从关系、全量复制、增量复制、主写从读、读写分离

8创建redis_sentinel.conf文件,并编辑里边的内容:

sentinel monitor dc-redis 127.0.0.1 6379 1

,表示:指定监控主机的ip地址,port端口,得到哨兵的投票数(当哨兵投票数大于或者等于此数时切换主从关系)

9、新开窗口,启动哨兵:redis-sentinel /opt/redis-5.0.2/redis_sentinel.conf

 10、主机宕机:

 11、等待从机投票,在sentinel窗口中查看打印信息

 12、查看63806381redis信息

 13、原主机恢复,启动6379

8.3  哨兵模式搭建(配置文件模式)

1—7步跟1.17.2.2一主二从搭建一样:一台服务器模拟三台主机、查询主从信息、写操作6379、设置主从关系、全量复制、增量复制、主写从读、读写分离。

8复制三份redis_ sentinel.conf文件为redis_sentinel26379.confredis_sentinel26380.confredis_sentinel 26381.conf,并修改内容:

端口分别修改为263792638026381

哨兵监控策略都修改为:

sentinel monitor mymaster 192.168.235.128 6379 2,表示:指定监控主机的ip地址,port端口,得票数多于2时表示需要切换主从关系。

如果设置密码了,都还需要设置密码:

sentinel auth-pass mymaster 123456

9、新开三个窗口,启动哨兵:./redis-sentinel ../myconfs/sentinel26379.conf

 10、主机宕机:

 11、等待从机投票,在sentinel窗口中查看打印信息。

 12、查看63806381redis信息:

 13、原主机恢复

 


http://www.ppmy.cn/news/59878.html

相关文章

【VScode】的 安装--配置--使用(中文插件下载不了怎么办?)

&#x1f58a;作者 : D. Star. &#x1f4d8;专栏 : VScode &#x1f606;今日分享 : ”兰因絮果“是世间定律吗&#xff1f; 一段美好爱情开始时你侬我侬、缠缠绵绵&#xff0c;最后却以相看两厌结尾&#xff0c;让人唏嘘。清代词人纳兰容若于是咏出「人生若只如初见&#xff…

眼见为实,来瞧瞧MySQL中的隐藏列!

在介绍mysql的多版本并发控制MVCC的过程中&#xff0c;我们提到过mysql中存在一些隐藏列&#xff0c;例如行标识、事务ID、回滚指针等&#xff0c;不知道大家是否和我一样好奇过&#xff0c;要怎样才能实际地看到这些隐藏列的值呢&#xff1f; 本文我们就来重点讨论一下诸多隐…

Windows上使用CLion配置OpenCV环境,CMake下载,OpenCV的编译,亲测可用的方法(一)

一、Windows上使用CLion配置OpenCV环境,亲测可用的方法: Windows上使用CLion配置OpenCV环境 教程里的配置: widnows 10 clion 2022.1.1 mingw 8.1.0 opencv 4.5.5 Cmake3.21.1 我自己的配置: widnows 10 clion 2022.2.5 mingw 8.1.0 https://sourceforge.net/projects/min…

11. Kubernetes 开章

本章讲解知识点 Kubernetes 概念为什么要使用 KubernetesKubernetes 的部署架构Kubernetes 基本命令本章主要是针对 Kubernetes 基本概念为读者讲解,读者能有一个大概印象即可,不需要过于斟酌细节,针对 Kubernetes 的概念将在后面章节中详细讲解。 1. Kubernetes 概念 我们…

今天来聊一聊京东服务接口的高可用设计

前言 到底啥是高可用 为啥做高可用 高可用的关键点 接口高可用设计的几个原则 1、控制依赖 2、避免单点 3、负载均衡 4、资源隔离 5、接口限流 6、服务熔断 7、异步处理 8、降级方案 9、灰度发布 10、混沌工程 前言 作为一个后端研发人员&#xff0c;开发服务接…

让Linux中的SCP远程复制不再需要输入密码

SCP是Secure Copy的缩写&#xff0c;SCP是Linux系统下基于SSH登陆进行安全的远程文件拷贝命令。Linux的scp命令可以在Linux服务器之间复制文件和目录。 让SCP不再需要输入密码&#xff0c;以便我们在Shell中方便调用&#xff0c;下面介绍一下配置方法&#xff1a; 生成密匙对…

手残也不该敲的命令

Linux命令是一种很有趣且有用的东西&#xff0c;但在你不知道会带来什么后果的时候&#xff0c;它又会显得非常危险。所以&#xff0c;在输入某些命令前&#xff0c;请多多检查再敲回车。 rm –rf rm –rf是删除文件夹和里面附带内容的一种最快捷的方法&#xff0c;但是细微的…

第一次使用服务器部署项目

前言&#xff1a;相信看到这篇文章的小伙伴都或多或少有一些编程基础&#xff0c;懂得一些linux的基本命令了吧&#xff0c;本篇文章将带领大家服务器如何部署一个使用django框架开发的一个网站进行云服务器端的部署。 文章使用到的的工具 Python&#xff1a;一种编程语言&…