53.Redis的使用
(五十三)Redis的使用
1:Redis入门
概念
1:Redis运行过程,也就是读写过程都是基于内存实现的key/value存储。对比与memcached而言,会基于异步方式(快照)同步到文件系统,实现数据的持久性存储。单一进程响应用户的所有的请求,具有主从架构。 2:单台服务器可以响应的100万级别的QPS 3:监听于TCP的6379端口
Windows系统下安装Redis:https://github.com/MicrosoftArchive/redis/releases
Linux系统下安装
yum install -y redis
/etc/redis.conf配置文件简要介绍
1:指明Redis绑定的IP地址 bind 0.0.0.0 2:指明监听TCP的端口 port 6379 3:开启tcp-backlog,避免在高并发过程中,Redis响应速度慢 tcp-backlog 511 4:设置密码 requirepass 123456 5:开启Unixsocket功能,如果客户端和服务端都是本机,将在内存中直接实现C/S数据交换,不会经过TCP拆包和封包处理 unixsocket /tmp/redis.sock unixsocketperm 700 6:默认的快照速率 save 900 1 (表示:如果在900秒内有1条数据发生变化,那么执行快照操作) save 300 10 (表示:如果在300秒内有10条数据发生变化,那么执行快照操作) save 60 10000 (表示:如果在60秒内有10000条数据发生变化,那么执行快照操作) 7:指定redis可以使用的数据库有多少个,默认是16个 databases 16
启动Redis
systemctl start redis.service
连接redis
1:方式一 redis-cli -h 192.168.23.10 -p 6379 (无密码登入,会报错,(error) NOAUTH Authentication required. 可以在redis的shell接口中 auth 123456,完成授权) 2:方式二 redis-cli -h 192.168.23.10 -p 6379 -a 123456 (有密码读入,已经被授权)
选择数据库
由于在配置文件中默认定义使用16个database,因此每次登入Redis时,可以选择使用哪个数据库 select 0:表示使用0号数据库 select 1:表示使用1号数据库
清空数据库
# 注意:想清楚再执行
flushdb :清空当前数据库
flushall :清空所有的库
在Redis中的命令和命令组
1:命令组与命令的联系 一个命令组中包含多个命令,可以使用 help @命令组,查看某个命令组中有多少命令,已经这些命令如何使用 help @string help @server 2:也可以查看特定命令的用法 help LLEN help STRLEN
2:Redis常用命令介绍
Redis命令参考手册 https://redis.io/commands
各种语言的API接口:https://redis.io/clients
Redis常用命令
1:赋值与取值 (set key value [EX seconds] [PX milliseconds] [NX|XX]) set robby ops get robby EX:表示超时时长 NX:如果一个键不存在则创建,存在不创建 XX:如果一个键存在则创建,不存在不创建 2:判断一个键值是否存在, 如果存在返回整数类型1 ,否则返回0 exists robby 3:追加值 append robby " java" 4:删除键 del key [key.....] del robby 5:设置一个整数值,让数值增加 set number 1 incr number (加1) decr number (减1) 6:使用keys命令搜索已经设置的key keys 正则表达式 ? 匹配一个字符 * 匹配任意个(包括0个)字符 [] 匹配括号间的任一个字符,可以使用 "-" 符号表示一个范围,如 a[b-d] 可以匹配 "ab","ac","ad" \x 匹配字符x,用于转义符号,如果要匹配 "?" 就需要使用 \? 例如:keys * :查看有哪些key
Redis中的5种数据类型
Redis的数据类型指的是key-value中value的数据类型,还记得Redis作为ELK的消息中间件吗?使用的是Redis的list数据类型 Redis的数据类型有5中,也就是说,value的结构有五种 1:string 例如: set uplooking ops 2:list:value就是一个string数组,操作这组string时,可以像对待栈一样使用pop和push操作,但是这个栈两端都能进行操作;也可以像对待数组一样使用一个index参数来操作。list的操杂,主要分为两类:L开头的和R开头的,L代表LEFT或者LIST,进行一些从列表左端进行的操作,或者一些与端无关的操作;R代表RIGHT,进行一些从列表右端进行的操作 例如: 使用help @list可以查看帮助 lpush uplooking java (给uplooking键对应的列表添加一个值) lindex uplooking 0 (通过索引从uplooking中取值) lpush uplooking ops (从左边插入值) rpush uplooking c++ (从右边插入值) lpop uplooking (从左边pop一个值) rpop uplooking (从右边pop一个值) lset uplooking 0 Python (将索引为0对应的值改为Python) 3:set:用于存储一组不重复的值,也可以进行一些集合的操作,就像数学上的集合,它是无序的,且可以就交集、并集、补集运算 例如: sadd home laoge dage zhongge xiaoge xiaoxiaoge (创建一个home集合,集合中有五个元素) sismember home dage (查看home集合中是否有dage元素) sadd home1 dage xiaoge niubi haoniubi (再创建一个集合) sinter home home1 (求home和home1两个集合的交集) sunion home home1 (求home和home1两个集合的并集) smembers home (查看集合中所有的元素) spop home1 (在home1集合中随机删除一个元素) 4:sorted set:类似set,但是sorted set里每个元素都有一个score,这个score可用于排序和排名 例如: del home home1 (删除之前的两个set) help @sorted_set zadd home1 1 niubi 2 haoniubi (创建一个有序集合,给两个元素) 5:hash:hash结构,其实就是value本身就是一组key-value对,不过redis将这里的key称为field,也就是value是一组field-value对 例如: help @hash hset home2 class ops (设置值) hget home2 class (取值) hdel home2 class (删除值) hkeys home2 (查看home2中所有的field) hvals home2 (查看home2中所有的value)
3:Redis 事务
这里的事务与MySQL的事务类似:多个操作要么一次性执行完毕,要么都不执行
使用multi开启一个事务
multi (开启一个事务日志) set name yhy set age 25 set address changsha exec (提交,执行)
4:Redis 客户端相关命令介绍
客户端相关命令介绍
AUTH password summary: Authenticate to the server since: 1.0.0 ECHO message summary: Echo the given string since: 1.0.0 PING [message] summary: Ping the server since: 1.0.0 QUIT - summary: Close the connection since: 1.0.0 SELECT index summary: Change the selected database for the current connection since: 1.0.0
服务器端相关的命令介绍
help @server client setname yhy_client (设置客户端名为yhy_client) client getname (查看当前的客户端的名称) info (查看服务器端的各个参数) config get bind (拿到bind指令的值) config set bind dbsize (查看当前数据库的键值对数量)
5:Redis Redis持久化实现
概念
1: RDB持久化方式会在一个特定的间隔保存那个时间点的一个数据快照。 2: AOF持久化方式则会记录每一个服务器收到的写操作。 3: Redis的持久化是可以禁用的,就是说你可以让数据的生命周期只存在于服务器的运行时间里。 4: 两种方式的持久化是可以同时存在的,但是当Redis重启时,AOF文件会被优先用于重建数据。 5:
1:RDB 基于snapshot实现持久化存储,数据文件叫dump.rdb, 存在于Redis数据存储目录中,默认RDB持久化是开启的 save 900 1 save 300 10 save 60 10000 2:AOF 记录每一次的写操作于文件中,实现数据持久化,默认是不开启的, 可以修改配置文件: appendonly yes 开启AOF持久化 3:如果两种持久化策略都开启,那么还原缓存数据的时候,redis会优先载入AOF备份文件 在Redis数据目录中,两种策略的持久化文件为: appendonly.aof dump.rdb
6:Redis 主从复制
准备环境:主-192.168.23.10, 从-192.168.23.11, 从-192.168.23.12
主从复制概念
一主可以有多从,支持链式连级
一主多从
1:修改从服务器的配置文件/etc/redis.conf bind 0.0.0.0 port 6379 slaveof 192.168.23.10 6379 masterauth 123456 requirepass 123456 2:先连接至Redis服务端,通过命令设置主从,但是也需要想编辑/etc/redis.conf配置文件 bind 0.0.0.0 port 6379 masterauth 123456 requirepass 123456 同步的时候在命令行输入:slaveof 192.168.23.10 6379 3:登入主节点,使用info replication查看从节点信息 127.0.0.1:6379> info replication # Replication role:master connected_slaves:2 slave0:ip=192.168.23.11,port=6379,state=online,offset=7715,lag=0 slave1:ip=192.168.23.12,port=6379,state=online,offset=7715,lag=1 master_repl_offset:7715 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:2 repl_backlog_histlen:7714 4:登入从节点,执行keys * 命令,看看是否可以查看到主节点的keys keys *
7:Redis的sentinel机制(sentinel节点IP为:192.168.23.10)
概念
万一主节点打击,主从模型将会停止工作,为了解决这个问题,Redis提供了一个sentinel(哨兵),以此来实现主从切换的功能,一旦主节点宕机了,sentinel将会在从节点中挑一个作为主节点, 与zookeeper类似
编辑/etc/redis-sentinel.conf文件
1: mymaster指定主节点的主机名(可以随便取一个名),127.0.0.1 6379:指明主节点的IP和端口,2:表示一个节点要成为主节点必须拥有的票数,这里默认是2,因此最好启动2个以上centinel进程。这个指令可以写多个,表明sentinel可以监控多个Redis主从架构。这里改为1,启动centinel进程演示 sentinel monitor mymaster 192.168.23.10 6379 1 2:指明主节点多少秒联系不上,认定主服务器宕机,默认30000毫秒 sentinel down-after-milliseconds mymaster 3000 3:从新指定主服务器后,允许几台从服务器去主服务器同步数据 sentinel parallel-syncs mymaster 1 4:指定故障转移的超时时长,如果180000毫秒,无法在从服务器选择主服务器,则故障转移失败 sentinel failover-timeout mymaster 18000 5: 指定与master通信的密码 sentinel auth-pass mymaster 123456
启动systemctl
systemctl start redis-sentinel.service
登入Sentinel,查看主从状态
redis-cli -p 26379 127.0.0.1:26379> info Sentinel # Sentinel sentinel_masters:1 sentinel_tilt:0 sentinel_running_scripts:0 sentinel_scripts_queue_length:0 sentinel_simulate_failure_flags:0 master0:name=mymaster,status=ok,address=192.168.23.10:6379,slaves=2,sentinels=1
停止Redis的master节点,登入sentinel查看节点信息(此时的主节点已经是192.168.23.12了)
systemctl stop redis.service [root@7 ~]# redis-cli -p 26379 127.0.0.1:26379> info sentinel # Sentinel sentinel_masters:1 sentinel_tilt:0 sentinel_running_scripts:0 sentinel_scripts_queue_length:0 sentinel_simulate_failure_flags:0 master0:name=mymaster,status=ok,address=192.168.23.12:6379,slaves=2,sentinels=1 127.0.0.1:26379> sentinel masters
1.Redis的概念
-
Redis运行过程,也就是读写过程都是基于内存实现的key/value存储,对比与memcached而言,会基于异步方式(快照)同步到文件系统,实现数据 的持久性存储,单一进程响应用户的所有的请求,具有主从架构 ;
-
Redis支持存储的value类型有很多,包括string(字符串)、list(链表)、set(集合)、zset(有序集合)和hash(哈希类型);
-
默认端口是6379端口;
2.连接redis
-
方式一:
redis-cli -h 192.168.23.10 -p 6379
; -
方式二:
redis-cli -h 192.168.23.10 -p 6379 -a 123456
; -
Windows下的连接:
r = redis.Redis(host='127.0.0.1', port=6379)host
是redis主机,需要redis服务端和客户端都启动 redis默认端口是6379;
3.选择数据库
- 由于在配置文件中默认定义使用16个database,因此每次登入Redis时,可以选择使用哪个数据库,如select 0:表示使用0号数据库,select 1:表 示使用1号数据库等;
4.清空数据库
-
flushdb
:清空当前数据库; -
flushall
:清空所有的库;
5.Redis中的命令和命令组
-
命令组与命令的联系:一个命令组中包含多个命令,可以使用 help @命令组,查看某个命令组中有多少命令,以及这些命令如何使用,如help @string;
-
查看特定命令的用法:如help LLEN、help STRLEN;
6.Redis常用命令
-
set key value [EX seconds] [PX milliseconds] [NX|XX]
; -
set robby ops
:赋值; 、 -
get robby
:取值; -
EX
:表示超时时长; -
NX
:如果一个键不存在则创建,存在不创建; -
XX
:如果一个键存在则创建,不存在不创建; -
exists robby
:判断一个键值是否存在, 如果存在返回整数类型1 ,否则返回0; -
append robby
:追加值; -
del key
:删除键;
7.Redis中的5种数据类型
-
字符串string:字符串类型是Redis中最为基础的数据存储类型,是一个由字节组成的序列,他在Redis中是二进制安全的,这便意味着该类型可以接 受任何格式的数据,如JPEG图像数据货Json对象描述信息等,是标准的key-value,一般来存字符串,整数和浮点数;
-
列表list:Redis的列表允许用户从序列的两端推入或者弹出元素,列表由多个字符串值组成的有序可重复的序列,是链表结构,所以向列表两端添加 元素的时间复杂度为0(1),获取越接近两端的元素速度就越快;
-
集合set:Redis的集合是无序不可重复的,和列表一样,在执行插入和删除和判断是否存在某元素时,效率是很高的,集合最大的优势在于可以进行 交集并集差集操作;
-
有序集合sorted set:类似set,都是字符串的集合,都不允许重复的成员出现在一个set中,他们之间差别在于有序集合中每一个元素都会有一个 score与之关联,这个score可用于排序和排名;
-
散列hash:Redis中的散列可以看成具有String key和String value的map容器,可以将多个key-value存储到一个key中,每一个Hash可以存储 4294967295个键值对;
8.Redis 事务
-
Redis 事务可以一次执行多个命令,多个操作要么一次性执行完毕,要么都不执行;
-
一个事务从开始到执行会经历三个阶段:开始事务、命令入队、执行事务;
9.什么是Redis持久化
-
Redis支持RDB和AOF两种持久化机制,持久化功能有效地避免因进程退出造成的数据丢失问题,下次重启时利用之前持久化的文件即可实现数据恢 复;
-
RDB持久化方式会在一个特定的间隔保存那个时间点的一个数据快照;
-
AOF持久化方式则会记录每一个服务器收到的写操作;
-
Redis的持久化是可以禁用的,就是说你可以让数据的生命周期只存在于服务器的运行时间里;
-
两种方式的持久化是可以同时存在的,但是当Redis重启时,AOF文件会被优先用于重建数据;
10.Redis的sentinel机制
-
万一主节点打击,主从模型将会停止工作,为了解决这个问题,Redis提供了一个sentinel(哨兵),以此来实现主从切换的功能,一旦主节点宕机了 ,sentinel将会在从节点中挑一个作为主节点, 与zookeeper类似;
-
Redis-Sentinel是Redis官方推荐的高可用性(HA)解决方案;
它的主要功能有以下几点:
-
监控:Sentinel不断的检查master和slave是否正常的运行;
-
通知:如果发现某个redis节点运行出现问题,可以通过API通知系统管理员和其他的应用程序;
-
自动故障转移:能够进行自动切换,当一个master节点不可用时,能够选举出master的多个slave中的一个来作为新的master,其它的slave节点会 将它所追随的master的地址改为被提升为master的slave的新地址;
-
配置提供者:哨兵作为Redis客户端发现的权威来源:客户端连接到哨兵请求当前可靠的master的地址,如果发生故障,哨兵将报告新地址;