Redis是一个高性能的NoSql数据库(not only sql)
Redis是一个非关系型数据库,而mysql、oracle这些数据都是关系型数据库
作用是将常用的数据存到缓存中,这个Redis数据相当于缓存的作用,提供保存常用的数据
Redis中的数据大部分时间都是存储在内存中的
Redis访问效率极高,但不适合存储数据量大的数据
Redis支持持久化,可以将数据存到本地硬盘中
Redis安装管网:Redis
下载好之后放到Linux系统内
解压命令:tar -zxvf redis-6.2.6.tar.gz -C /opt
下一步安装GCC编译器(c/c++的编译器)命令:yum -y install gcc
执行gcc:yum -y install gcc automake autoconf libtool make
查询gcc版本:gcc -v
下一步进入redis目录下:cd redis-6.2.6/
清空上次编译:make distclean
执行命令:make
创建命令快捷方式:make install
启动Redis(前台):redis-server
启动Redis(后台):redis-server &
查看redis服务:ps -ef|grep redis
启动Redis服务后台:redis-server &
Redis默认端口号:6379
启动Redis服务时,指定配置文件:redis-server redis.conf &
配置文件在redis目录下的redis.conf
关闭Redis服务
关闭服务命令:redis-cli shutdown
进入Redis客户端
redis默认ip为:127.0.0.1
redis默认端口为:6379
默认连接127.0.0.1:6379
连接客户端命令:redis-cli
指定端口号连接:redis-cli -p 端口号
指定ip地址和端口号连接:redis-cli -h ip地址 -p 端口号
退出Redis客户端
退出客户端命令:exit或者quit
命令(测试redis服务的性能):redis-benchmark
命令(测试redis的连接稳定,如果没问题会显示PONG):ping
命令(查看redis服务器的统计信息):info
查看指定统计信息:info 信息
Redis的16个数据库实例
Redis中的数据库只能有redis服务来创建和维护,开发人员不能修改和自行创建数据库
Redis在启动的时候默认自动刚创建了16个数据库实例
16个数据库没有名字只有编号,从0开始到15,在进入redis客户端默认进入0号数据库
可以通过redis,conf配置文件指定创建数据库个数
切换数据库
如果想从0号数据库切换到其他数据库,命令:select [index]
比如要进入1号数据库:select 1
查看当前数据库的key数
命令(可以查看当前数据的所有数据条数):dbsize
0号数据库默认创建四个实例数据
查看当前数据库中的所有key
命令(redis数据库中基本都是以键值对的形式存储数据key——value):keys *
清空数据库
命令:flushdb
清空所有数据库的数据
命令:flushall
查看redis中的配置信息
命令(查看所有配置):config get *
查看指定配置信息:config get 配置信息
Redis的五种数据类型:
1:string字符串
特点:单个key对应单个value,比如key1 value1
2:list列表
特点:单个key对应多个value(有序value),key1 -value1 -value2 -value3
3:set集合
特点:单个key对应多个value(无序value),key1 -value -value -value
4:pojo
特点:存储对象类型:key1 student(stuId:1,stuName:zs)
5:zset
特点:单个key对应多个value(根据指定的值排序)
比如根据age排序key1 [-value1 age 12] [-value2 age 13] [-value3 age 18]
命令(查询数据库的所有的key):keys *
通配符*号表示匹配0个或多个字符
keys k*(表示查询数据库中以k开头的key)
keys h*o(查询数据库中以h开头以o结尾的数据)
通配符?表示匹配一个字符
keys h?o(表示查询以h开头o结尾并且中间只有一个字母的,全部只有三个字母的数据)
通配符[],用来匹配[]内的一个字符
keys h[abce]llo(表示查询数据库中以h开头llo结尾,并且h后边只能取[abce]内的其中一个字符)
判断key在数据库中是否存在
命令:exists key
判断多个key是否存在:exists key1 key2 key3
如果key存在返回1,不存在返回0
移动指定key到指定的数据库实例
把key移动到一号数据库的命令:move key名 数据库编号
查看指定key的剩余生存时间
默认key没有设置生存时间会返回-1
没有查询到key返回-2
命令(以秒为单位):ttl key
设置key的最大生存时间命令:expire key 秒
查看指定key的数据类型
命令:type key
修改key的名称
rename key 新名字
删除key(删除一条数据)
返回实际删除成功的数量
命令:del key
删除多个key:del k1 k2 k3 k4
添加string数据
添加命令:set key键 value值
注:如果新添加的key和数据中的key重名,会覆盖掉之前的key
根据key获取value
命令:get key键
追加字符串
命令:append key value
返回追加之后的字符串长度
如果key不存在,自动创建新的key,并且value设置
获取字符串的长度
命令:strlen key
数值的字符串加1运算
命令:incr key
如果key不存在,会创建一个key,值初始化为0然后进行加1运算
注:value必须是数值,不能是字符
数值的字符串减1运算
命令:decr key
将数值字符串添加指定数值
命令:incrby key 数值
将数值字符串减指定的数值
命令:decrby key 数值
获取字符串的子串
命令(闭区间):getrange key 开始下标 结束下标
获取的下标可以为负数(负数从右到左取)
覆盖字符串
命令:setrange key 开始下标 value
设置key的同时,指定最大生命周期
命令:setex key 秒 value
设置key与value,当key不存在时设置成功,当key存在时,设置失败
命令:setnx key value
批量设置key与value
命令:mset key键1 value值 key键2 value值 key键3 value值
批量根据key获取value
命令:mget 键1 键2 键3
批量设置当key不存在时设置成功,当key存在时设置失败
命令:msetnx 键1 值 键2 值 键3 值
注:只要有一个key设置失败,则全部放弃设置
单个key对应多个value,最左侧是表头,最右侧是表尾,每个元素都有下表,表头下标为0依次递增,表尾的下标为-1
将一个或者多个值依次按照顺序插入到列表的表头
命令:lpush key value value value
获取指定列表的下表区间的元素
命令:lrange key 开始下标 结束下标
将一个或者多个值依次按照顺序插入到列表的表尾
命令:rpush key value …
删除一个列表中的表头数据
删除并且返回表头元素
命令:lpop key
删除一个列表中的表尾数据
命令:rpop key
获取列表中指定下标的元素
命令:lindex key 下标
获取指定列表的长度
命令:llen key
移除指定列表中指定条件的数据
命令:lrem key 数量 条件
数量的开始下标如果是-1则从右边开始向左删,如果是大于0从左边开始
如果lrem key 0 条件(这个表示删除所有符合条件的元素)
lrem list 1 3表示从左边开始删除value是3的一个元素
一个key对应多个value,而且value无序,不可重复,直接通过value操作数据
将一个数据或多个数据添加到集合
命令:sadd key value value value
获取集合中所有元素
命令:smembers key
判断指定元素在集合中是否存在
命令:sismember key value
获取集合的长度
命令:scard key
删除集合中一个或多个元素
命令:srem key value value value
随机获取集合中的一个元素
命令:srandmember key
获取多个随机元素:srandmember key 数量
随机获取多个元素的元素不会重复
从集合中随机移除一个或多个元素
命令:spop key 个数
将指定集合中的指定元素移动到另一个集合
命令:smove key key 元素
返回一个集合中有,其它集合中没有的元素(求差集)
命令:sdiff key key key
获取所有指定集合中都有的元素组成新的集合(求交集)
命令:sinter key key key
获取所有指定集合中所有元素的大集合(求并集)
命令:sunion key key key
添加一个或多个键值对哈希数据
命令:hset 哈希表的key 属性的key1 属性的值value 属性的key2 属性的值value
如果属性key重复会覆盖之前的属性key
获取哈希表中的指定的属性值
命令:hget 哈希表key 属性key
可以批量将多个属性key和value设置到哈希表中
命令:hmset 哈希表的key 属性的key1 属性的值value 属性的key2 属性的值value
功能和hset相同
批量获取多个哈希表中的属性值
命令:hmget key 属性key 属性key
获取哈希表中所有的属性和值
命令:hgetall key
删除哈希表中一个或多个的属性和值
命令:hdel key 属性key 属性key
获取哈希表中的所有的属性个数
命令:hlen key
判断哈希表中是否存在指定的属性
命令:hexists key 属性key
获取哈希表中属性或者值
命令:hkeys key
获取值:hvals key
如果是属性的值是数值型执行运算
整数加法命令:hincrby key 属性key 数值
浮点型加法运算:hincrbyfloat key 属性key 数值
如果属性key存在则放弃设置,如果没有属性key,则设置属性key
命令:hsetnx key 属性key 值 属性key 值
zset和set一样也是string类型元素的集合,但是不允许元素重复,按照自己业务的数值进行排序
添加一个或多个有序集合数据
命令:zadd key 排序数值 value 排序数值 value
如果元素已经存在,添加重复会覆盖掉排序数值
获取指定区间的元素
命令:zrange key 开始下标 结束下标
获取元素及排序数值:zrange key 开始下标 结束下标 [withscores]
根据排序数值获取数据(闭区间)
命令:zrangebyscore key 排序数值最小 排序数值最大 [withscores]
删除指定的一个或多个数据
命令:zrem key 元素 元素
获取集合的长度
命令:zcard key
获取指定集合中排序数值在指定区间内的元素个数:zcount key min max
根据元素获取排序数值:zscore key 元素
获取集合中指定的元素的排名
命令:zrank key 元素
获取集合中某个元素的排序(反向):zrevrank key 元素
如果不使用配置文件redis会按照默认参数运行
如果修改过配置文件使用配置文件,启动redis服务时需要指定配置文件
redis中关于网络的配置
port(端口号):默认6379
bind(ip地址):默认127.0.0.1
如果配置了端口和ip启动服务时必须指定端口号和ip
连接客户端:redis-cli -h ip地址 -p 端口号
如果关闭服务也要指定:redis-cli -h 地址 - 端口号 shutdown
tcp-keepalive(TCP保活策略):服务器每隔一段时间会向客户端发起一个虚拟请求,来查看客户端是否存活
Redis是一种内存数据,大多数数据是存在内存的,Redis也可以将数据存到本体硬盘中,延长数据的生命周期
在指定时间间隔内,redis服务执行指定次数的写操作,会自动触发一次持久化操作
redis的默认时间间隔和次数(以秒为单位)900 1 = 900秒内修改一次会执行写操作
指定持久化数据保存的文件(配置):dbfilename
指定目录:./
采用操作日志来记录进行每一次写操作
每次redis服务启动时,都会执行一次日志内的操作
缺点:效率较低
配置(表示是否开启AOF,yes表示开启):appendonly
日志文件名
大多数数据库的事务把一组数据库的操作放在一起执行,保证操作的原子性(要么同时成功,要么同时失败)
Redis的事务把一组命令放在一起执行,把命令进行序列化执行,但不能保证原子性
事务命令
标记事务的开始
命令:multi
执行事务队列中所有的命令
命令:exec
如果一组命令中,又在压入队列过程中发生错误的命令,则本事务中所有的命令都不执行,保证事务的原子性
如果一组命令中,在压入队列过程中正常,在执行事务的时候发生错误,则其他命令正常执行,不能保证事务的原子性
放弃已经压入队列的命令
命令(清除所有已经压入队列的命令,并且结束整个事务):discard
监控某一个键key,当事务在执行过程中,此键key的值发生变化,则本事务放弃执行
命令:watch key
放弃监控:unwatch key
redis客户端订阅频道,消息的发布者往频道上发布消息,所有订阅此频道的客户端都可以收到这个消息
订阅一个或多消息
命令:subscribe 频道名
支持通配符的订阅命令:psubscribe 频道名
将消息发布到指定频道
命令:publish 频道名 消息
主机数据更新后根据配置和策略,自动同步到从机的master/slave机制,master以写为主,slave以读为主
主写从读,读写分离
集群搭建
搭建三台redis服务
正常多台redis服务都是一个linux系统使用一个redis服务,从而搭建多台linux系统
这里直接在一台linux系统上搭建三台服务
复制redis.conf配置文件多份
修改每个配置文件的参数:
bind 127.0.0.1
port 端口号
pidfile
logfile
dbfilename
使用三个配置文件启动redis服务
redis-server redis端口号.conf &
查看三台redis服务在集群中的主从角色
命令:info Replication
默认情况下所有的reids服务都是主机
设置主从关系
在6380和6381上设置从机
命令:slaveof 127.0.0.1 6379
此时主机从机的数据都同步了
全量复制:一旦主从关系确定,会自动把主机上已有的数据同步复制到从库
增量复制:主机写数据会自动同步到从库
注:在从机上不能增添数据,从机可以读数据
如果主机宕机,从机原地待命
如果从机宕机,主机少一个从机,其他从机不变,如果从机恢复需要重新设置从机的主从关系
从机上位:如果主机宕机无法修复,上位的从机断开主从关系(命令:slaveof no one)
然后重新设置其他从机的主从关系
如果之前宕机的主机修复好了,可以将宕机的机器加入到集群,变成从机主机都可以
注:一个从机还可以有它的从机,一个主机还可以有它的主机
作用:查看主机宕机时间,设置从主关系,及时补损
部署哨兵
提供哨兵的配置文件(默认是)sentinel.conf
建议自己创建文件:redis-sentinel.conf
文件内容:sentinel monitor dc-redis 127.0.0.1 6379 1
启动哨兵服务
命令:redis-sentinel redis-sentinel.conf &
如果主机宕机后:
哨兵会进行投票,让其他某一个从机成为主机
如果主机恢复,哨兵会让他成为从机
Jedis是在java应用中操作Redis
在redis中的指令和jedis中的方法同名,创建Jedis对象调用即可
而事务也是一个事务对象,调用事务对象的方法即可开启事务等操作
创建maven项目
加入依赖
<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>4.0.0</version> </dependency>
关闭linux防火墙
systemctl stop firewalld
修改配置文件bind
package com.redis; import org.junit.Test; import redis.clients.jedis.Jedis; public class TestApp { @Test public void test(){ //连接redis, 参数:ip 端口号 Jedis jedis = new Jedis("192.168.73.132",6379); //使用jedis对象操作redis的ping指令 System.out.println(jedis.ping()); } }
结果: