笔记——Redis从基础到高级一篇拿下

Redis是一个KV结构的数据库,可用把Redis看成一个Map。String、Hash、List、Set、ZSet为Redis的五大基本数据类型。

作用

        1、redis 是一个数据库,可对数据进行CRUD。
        2、redis 可作为Cache(缓存)使用,提升数据的查询性能,redis 作为缓存应该存储用户经常访问的数据。
        3、作为分布式锁。

启动

        1、前台启动:./redis-server redis.conf(redis.conf文件的路径)
        2、后台启动:./redis-server redis.conf(redis.conf文件的路径) &

关闭

        1、./redis-cli shutdown
        2、kill -9 端口号

客户端功能

        1、发送redis命令,编写redis命令。
        2、显示服务器的处理结果,显示数据。

        访问其他服务器的redis:./redis-cli -h ip -p 端口号

基本命令

        查看命令:ping        返回pong。表示redis服务运行正常
        查看当前数据库Key的数目:dbsize
        redis默认有16个数据库,在redis.conf中可以对数据库个数进行修改:databases 16
        切换数据库:select db
        清空当前数据库:flushdb
        redis自带的客户端退出当前redis连接:exit / quit

Key命令

        keys pattern:查找所有符合格式pattern的key,pattern可以使用通配符;
                                * :表示0—多个字符,查询所有。
                                ? :表示单个字符
        exists key:判断key是否存在
        expire key seconds:设置key的存活时间(秒),成功返回 1 。
        ttl key:返回key的剩余存活时间(秒)
        type key:插卡key存储的数据类型
        del key:删除key

String

基本命令

        1、set命令
        2、get命令
        3、incr命令:将key中的数值加1。若key不存在,则key的值初始化为0,再执行incr操作。incr key
        4、decr命令:将key中的数值减1。若key不存在,则key的值初始化为0,再执行decr操作。decr key
        5、append key value:将value值追加到key值的后面,若key不存在,则等同于执行set命令。

常用命令

        1、strlen key:返回key所存储的字符串值的长度。key不存在,则返回0
        2、getrange key start end:获取key值中从start开始到end结束的字符串,包含start、end。0表示头部第一位,-1表示最后一位。start或end为负数,表示从字符串的末尾开始。若start、end值域范围大于key的值域范围,则超出部分自动忽略。
        3、setrang key offset value:用value值替换key的值,从offset开始,不存在的key做空字符串。返回值:修改后字符串的长度(setrang key 5 value)
        4、mset key value[key value...]:同时设置一个/多个Key—Value对
        5、mget key1 key2 ...:同时获取一个/多个key的值,值与Key 一 一对应

Hash

基本命令

        1、hset key field value:将哈希表key中的域field的值设为value,key不存在,则新建hash表;存在,则覆盖。( key是redis的key。field是Map<key,value>中的key )
        2、hget key field:获取key中field的值
        3、hmset key field value[field value ...]:同时设置一个/多个哈希的值
        4、hmget key field1 field2 ...:同时获取一个/多个哈希的值,值一一对应
        5、hdel key field1 field2 ...:删除指定key中的field的值

常用命令

        1、hkeys key:显示key中所有的field
        2、hvals key:显示key中所有field的值
        3、hexists key field:查看key中field是否存在,存在返回1,其它返回0

List

基本命令

        1、lpush key value[value...]:将一个/多个value插入到key的列表(最左边),从左到右的顺序插入列表。返回值:数字,新列表的长度。
                eq:lpush mylist a b c        ==>        插入的结果:c b a
        2、lpush key value[value...]:将一个/多个value插入到key的列表(最右边),从右到左的顺序插入列表。
        3、lrange key start stop:获取列表key中指定区间的元素;0表示第一个元素;start、stop是列表的下标值,也可以是负数的下标。-1表示倒数第一个元素;start、stop超出列表范围不会报错;取值时包含start、stop。
        4、lindex key index:取下标指定的值
        5、llen key:获取列表key的长度;key不存在返回0

常用命令

        1、lrem key count value:根据参数count的值,移除列表中与参数value相同的元素。count>0从左边开始移除;count<0从右边开始移除;count=0移除列表中所有与value相同的值。
        2、lset key index value:对指定key中index下标的成员替换成value。
        3、linsert key befor|after pirot value:将值value插入列表key中位于值pirot之前/后的位置。key不存在、pirot不在列表,则不执行任何操作。
                返回值:成功,返回列表长度;没有pirot返回-1;key不存在返回0。

Set

基本命令

        1、sadd key member[menber...]:将一个/多个member元素加入到集合key中。已经存在与集合中的member元素将被忽略,不会再加入。
        2、smembers key:获取集合中所有成员元素。不存在的key视为空集合。
        3、sismember key member:判断member元素是否为集合key的成员。返回值:是 返 1 。其它 返 0
        4、scard key:获取集合里的元素个数
        5、srem key member[member...]:删除集合key中一个/多个member元素,不存在的元素被忽略。

常用命令

        1、srandmember key [count]:只提供key,随机返回集合中的一个元素,元素不删除,依然在集合中。
        提供count,count为正数,返回count个数元素的集合,集合元素各不相同。
        count为负数,返回一个count绝对值的长度集合,集合元素可能会又重复。
        2、spop key [count]:随机从集合中删除一个元素,count是删除的个数。返回值:被删除的元素;key不存在或空集合返回nil

ZSet

基本命令

        1、zadd key score member[score member...]:将一个或多个member元素及其score值加入到有序集合key中。若member存在集合中,则覆盖;score可以是整数或小数。
        2、zrange key start stop [withscores]:查询有序集合指定区间内的元素,由小到大。
        从左开始,start、stop都是从0开始。从右开始,start、stop都是从-1开始。
        3、zrevrange key start stop [withscores]:返回有序集合key中指定区间内的成员,由大到小。
        4、zrem key member[member...]:删除有序集合key中一个或多个成员,不存在的被忽略
        5、zcard key:获取有序key集合的元素个数,key不存在返回0

常用命令

        1、zrangebyscore key min max [widthscores][limit offset count]:获取有序集合key中所有score值介于min、max之间的成员(包含min、max)由小到大排序;limit用来限制返回结果的数量和区间(分页)若要不包含min、max 则在min和max前加小括号"("。min可以用-inf替代,表示最小;max可以用+inf替代,表示最大。
        2、zrevrangebyscore key max min [widthscores][limit offset count]:获取有序集合key中所有score值介于max、min之间的成员(包含max、min)由大到小排序。
        3、zcount key min max:返回有序集合key中score值在min和max之间的成员变量。包含min和max。

事务

        Redis事务是一组命令的集合;Redis事务没有回滚。
        1、multi:标记一个事务的开始,事务内的多条命令会按照先后顺序被放进一个队列中。
        2、exec:执行所有事务块中的命令。
        3、discard:取消事务,放弃执行事务块内的所有命令。

multi
sadd key value
sadd key1 value1
......
exec 或 discard

        当事务执行exec之前,入列命令错误(语法错误,严重错误导致服务器不能正常工作(内存不足))放弃事务
        事务执行exec之后,命令语法没有错误,但命令执行错误,则事务提交。

事务的Watch机制

        Watch观察机制是为解决Redis多事务执行的数据不安全问题。

原理

        使用watch监视一个或多个key,跟踪key的value修改情况,若有key的value值在事务exec执行之前被修改了,整个事务被取消;exec返回“事务已失败”的提示信息。
        wacth机制使得事务的执行exec变的有条件,事务只有在被watch监视的key没有被修改的前提下才能被执行。不满足条件则被取消。使用watch监视一个带有过期时间的key,那么即使这个key过期,事务仍然可以正常执行。

        watch key [key1...]:监视一个或多个key;若在执行之前这些key被改动,则事务取消。
        unwatch:取消watch命令对所有key的监视。若在watch命令之后,exec、discard命令之前被执行,则不需要在执行unwatch。

持久化

        持久化可理解为存储,就是将数据存储在一个不会丢失的嗲放哪个,故放内存中的数据不是持久化的,而放磁盘就算一种持久化。
        Redis提供俩种(RDB、AOF)机制对数据进行持久化存储,便于发生故障后快速恢复数据。

RDB

        Redis DataBase 就是指在指定的时间间隔内将内存中的数据集快照写入磁盘,数据恢复时,将快照文件直接再写入内存。

        RDB保存了在某个时间点的数据集(全部数据)存在一个二进制文件中,只有一个文件,默认dump.rdb。RDB技术非常适合做备份,可以保存最近的全部数据。保存数据是在单独的进程中写文件,不影响redis的正常使用,RDB恢复数据比AOF速度快。

实现
        RDB的数据持久化,仅需要在redis.conf中配置即可。默认是开启的。
        在配置文件redis.conf中找snapshotting,在注释开始和结束之间的关于RDB的配置说明。配snapshotting的地方有三处:
        1、配置执行RDB快照文件的时间策略:
                对Redis进行设置,让它在“N秒内数据集至少有M个key改动”这一条件满足时,自动保存一次。
        格式:save <seconds> <change>        eq:save 300 10        300秒内有10个key改动
        2、dbfilename:设置RDB的文件名,默认:dump.rdb
        3、dir:指定RDB文件的存放位置,默认“./”当前目录
缺点
        会引起数据丢失。

AOF

        Append-Only File 。Redis每次接收一条改变数据的命令时,它会将该命令写入一个AOF文件中(只记写操作),当Redis重启后,它通过执行AOF文件中的所有命令来恢复数据。

        AOF方式的数据持久化,在redis.conf文件中的配置项:
                1、appendonly:默认no,改成yes。即可开始AOF持久化
                2、appendfilename:指定AOF文件名。默认appentonly.aof
                3、dir:指定RDB和AOF文件的目录。默认“./”当前目录。
                4、appendfsync:配置向AOF文件写命令数据的策略。
                        1)no:不主动进行同步操作,而是完全由操作系统来做(即30秒一次)比较快,但不安全。
                        2)always:每次执行写入都会执行同步。慢,但安全。
                        3)everysec:每秒执行一次同步,比较平衡,介于速度和安全之间。是默认项。
                5、auto-aof-rewrite-min-size:允许重写的最小AOF文件大小,默认64m。当AOF文件大于64m时,开始整理AOF文件,去掉无用的命令,缩小AOF文件。

主从复制

        通过持久化功能,保证了即使有服务器重启的情况下也不会造成数据丢失,但由于数据在一台服务器上,若服务器出现故障,也会导致数据丢失。
        为了避免单点故障,需要将数据复制多份存储在不同的服务器上,即使有一台服务器故障,其它服务器依然可以继续提供服务。
        Redis提供了复制(replication)功能来自动实现多台Redis服务器的数据同步。

        通过部署多台Redis服务器,并在配置文件中指定这些Redis之间的主从关系,主负责写入,同时把写入的数据实时同步到从服务器。这种模式叫主从复制。即master/slave,并且redis默认master用于写,slave用于读,向slave写数据会导致错误。

# 主Redis不变
# 从Redis增加一下配置
slaveof 主IP 主端口号

当主服务器宕机后,从服务器会一系列的连接错误信息。

[16772] 29 Dec 14:08:59.534 # Sending command to master in replication handshake: -Writing to master: Unknown error
[16772] 29 Dec 14:08:59.658 * Connecting to MASTER 127.0.0.1:6380
[16772] 29 Dec 14:08:59.658 * MASTER <-> SLAVE sync started
[16772] 29 Dec 14:09:00.068 * Discarding previously cached master state.

这时,我们指向其中一个从服务器提升到主服务器。

E:\masterslave\Redis-x64-3.2.100-6381>redis-cli.exe -p 6381
127.0.0.1:6381> get name         #测试宕机的主服务器添加的key能否获取到
"zhangsanlisi"
127.0.0.1:6381> slaveof no one    #从服务器提升为主服务器
OK

而其他的从服务器主从关系还是原来的。这时需要重新加入主从关系。

E:\masterslave\Redis-x64-3.2.100-6382>redis-cli.exe -p 6382
127.0.0.1:6382> get name
"zhangsanlisi"
127.0.0.1:6382> slaveof 127.0.0.1 6381    #为从服务器重新指定新的主服务器
OK

查看Redis是master还是slave:info replication 

# master 查看示例
127.0.0.1:6381> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6382,state=online,offset=1023,lag=0
master_repl_offset:1037
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:1036
# slave查看示例
127.0.0.1:6382> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6381
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:883
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

哨兵Sentinel

        Sentinel系统是Redis官方提供的高可用方案,可以用来监控多个Redis服务器实例的运行情况。
        Redis Sentinel是一个运行在特殊模式下的Redis服务器,Redis Sentinel是在多个Sentinel进程环境下互相协作工作的。

主要任务

        1、监控:Sentinel不断检查master和slave是否按照预期正常工作。
        2、提醒:被监控的master不能正常工作,Sentinel会通知管理员或其他应用程序。
        3、自动故障移除:监控的master不能正常工作,Sentinel会开始进行故障迁移操作。将一个slave升级为新的master,同时向客户端提供新的master地址。

哨兵模式的redis.conf中的配置和主从复制的一样,直接拿过来就好。在master和slave中新建sentinel.conf文件。

#master
port 7380

#Sentinel去监视一个名为mymaster的主redis实例,这个主实例的IP地址为本机地址127.0.0.1,端口号为6380,而将这个主实例判断为失效至少需要2个 Sentinel进程的同意,只要同意Sentinel的数量不达标,自动failover就不会执行
sentinel monitor mymaster 127.0.0.1 6380 2

#指定了Sentinel认为Redis实例已经失效所需的毫秒数。当实例超过该时间没有返回PING,或者直接返回错误,那么Sentinel将这个实例标记为主观下线。只有一个Sentinel进程将实例标记为主观下线并不一定会引起实例的自动故障迁移:只有在足够数量的Sentinel都将一个实例标记为主观下线之后,实例才会被标记为客观下线,这时自动故障迁移才会执行
sentinel down-after-milliseconds mymaster 5000

#指定了在执行故障转移时,最多可以有多少个从Redis实例在同步新的主实例,在从Redis实例较多的情况下这个数字越小,同步的时间越长,完成故障转移所需的时间就越长  
sentinel parallel-syncs mymaster 1

#如果在该时间(ms)内未能完成failover操作,则认为该failover失败
sentinel failover-timeout mymaster 15000
#slave
port 7381

#Sentinel去监视一个名为mymaster的主redis实例,这个主实例的IP地址为本机地址127.0.0.1,端口号为6380,而将这个主实例判断为失效至少需要2个 Sentinel进程的同意,只要同意Sentinel的数量不达标,自动failover就不会执行
sentinel monitor mymaster 127.0.0.1 6380 2

#指定了Sentinel认为Redis实例已经失效所需的毫秒数。当实例超过该时间没有返回PING,或者直接返回错误,那么Sentinel将这个实例标记为主观下线。只有一个Sentinel进程将实例标记为主观下线并不一定会引起实例的自动故障迁移:只有在足够数量的Sentinel都将一个实例标记为主观下线之后,实例才会被标记为客观下线,这时自动故障迁移才会执行
sentinel down-after-milliseconds mymaster 5000

#指定了在执行故障转移时,最多可以有多少个从Redis实例在同步新的主实例,在从Redis实例较多的情况下这个数字越小,同步的时间越长,完成故障转移所需的时间就越长  
sentinel parallel-syncs mymaster 1

#如果在该时间(ms)内未能完成failover操作,则认为该failover失败
sentinel failover-timeout mymaster 15000
#slave
port 7382

#Sentinel去监视一个名为mymaster的主redis实例,这个主实例的IP地址为本机地址127.0.0.1,端口号为6380,而将这个主实例判断为失效至少需要2个 Sentinel进程的同意,只要同意Sentinel的数量不达标,自动failover就不会执行
sentinel monitor mymaster 127.0.0.1 6380 2

#指定了Sentinel认为Redis实例已经失效所需的毫秒数。当实例超过该时间没有返回PING,或者直接返回错误,那么Sentinel将这个实例标记为主观下线。只有一个Sentinel进程将实例标记为主观下线并不一定会引起实例的自动故障迁移:只有在足够数量的Sentinel都将一个实例标记为主观下线之后,实例才会被标记为客观下线,这时自动故障迁移才会执行
sentinel down-after-milliseconds mymaster 5000

#指定了在执行故障转移时,最多可以有多少个从Redis实例在同步新的主实例,在从Redis实例较多的情况下这个数字越小,同步的时间越长,完成故障转移所需的时间就越长  
sentinel parallel-syncs mymaster 1

#如果在该时间(ms)内未能完成failover操作,则认为该failover失败
sentinel failover-timeout mymaster 15000

一主二从三哨兵。三个Redis服务器依次启动:

redis-server.exe redis.windows.conf
redis-server.exe sentinel.conf --sentinel

 关闭当前master。其中会有一个slave提升为master。

Sentinel中可以看到已将6381提升为master。

 slave

安全设置

设置密码

        Redis默认没有密码,任何用户都可以访问。但可以通过redis.conf中的requirepass修改密码;出于安全考虑,项目使用过程中要定期修改密码,因为Redis速度很快,一台较好的服务器下,一个用户可以在一秒钟进行150K次密码尝试。

        1、开启密码:用vim命令修改redis.conf文件,找到 requirepass 就可以设置密码
        2、访问有密码的Redis

#连接客户端后,使用命令 auth 密码
./redis-cli -h IP -p port
auth password
#连接客户端时使用-a密码
./redis-cli -h IP -p port -a password

修改默认端口号

        在redis.conf中进行修改。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值