安装
下载
1.wget https://download.redis.io/releases/redis-6.2.6.tar.gz
2.tar xzf redis-6.2.6.tar.gz
3.cd redis-6.2.6
4.make
安装
make命令报错,
错误1:gcc命令找不到,是由于没有安装gcc导致
执行命令:yum -y install gcc
错误2:jemalloc/jemalloc.h错误
执行命令:make MALLOC=libc
启动
使用命令:./redis-server & 可后台运行
带着配置文件启动./redis-server …/redis.conf &
使用
在src目录下使用命令:./redis-cli
./redis-cli -h ip地址(127.0.0.1) -p 端口号(6379)
关闭
切换到redis/src/目录下 执行./redis-cli shutdown
基本命令
1.ping
返回pong说明正常
2.select index
select 5 表示使用同名编号
3.flushdb
删除当前库的数据
4.exit退出当前redis链接
5.keys pattern
*:表示0-n个字符 例:keys * 查询所有的key
?:表示单个字符 例: wo?d ,匹配word wood
wo??d 匹配world
6.expire key seconds
作用设置key的生存时间,超出时间key自动删除,单位秒
设置成功返回1其他情况0
7.ttl key
以秒为单位,返回key的剩余生存时间(time to live)
返回值:
-1:没有设置key的生存时间,key永不过期
-2:key不存在
>=0:key的剩余时间,单位秒
8.type key
作用:查看key所存储值的数据类型
返回值:字符串表示的数据类型
none(key不存在)
zset(有序集)
hash(哈希表)
9.del key[key…]
删除key,不存在的key忽略
返回值:数字,删除的key的数量
10.mset
mset key1 value1 key2 value2…
11.mget
mget key1 key2…
数据类型
hash
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-exd9cEiP-1661827012570)(C:\Users\OMEN\AppData\Roaming\Typora\typora-user-images\image-20220311173616005.png)]
list
redis列表是简单的字符串列表,按照插入顺序排序
set
是string类型的无序集合,集合成员是唯一的,即集合中不能出现重复的数据
zset
有序集合,且不允许重复的成员
数据类型命令
1.String
set
key value 覆盖以前的旧值
get
get key 获取key的值 nil表示null
incr
incr key 只能对数字类型使用,同i++作用一样,对value+1
string默认0
decr
i–
append
append key value
如果key存在,则把value追加到key原来旧值的末尾
不存在,则将key设置值为value
返回值,追加之后的总长度
strlen key
key的长度
getrange
getrange key start end
作用:获取key中字符串值从start开始到end结束的子字符串,包括start和end,负数
表示从字符串的末尾开始,-1表示最后一个字符,第一个为0
返回值:截取的子字符串
setrange
setrange key offset value
用value替换key的存储的值从offset开始,不存在的key做空白字符串
返回值:修改后的字符串的长度
2.hash
hset
语法:hset hash表的key field value
作用:将哈希表key中的域field的值设为value,如果key不存在,则新建hash表
行复制,如果有field,则覆盖值
返回值:
①如果field是hash表中新field,且设置值成功,返回1
②如果field已经存在,旧值覆盖新值,返回0
hget
hget key field
不存在返回控
hmset
hmset key filed1 value1 filed2 value2…
创建多个field value
hmget
hmget key filed…
没有的filed返回nil
hgetall
hgetall key
查看key里面所有的filed 和 value
hdel
hdel key filed
删除key里面的filed
hkeys
hkeys key
查看key里面所有的filed
hvals
hvals key
查看key里面所有的value
hexists
hexists key field
查询fild是否存在于key中
返回:1存在
0不存在
3.list
lpush
lpush key value[value…]
从左侧操作表头
rpush
rpush key value[value…]
从左侧操作表头
lrange
lrange key start end
查询列表的起始区间value
lindex
lindex key index
去下标为index的值
llen
llen key
key的长度
lrem
lrem key count value
count>0从头部删除count个和value值相等的元素,
count<0从尾部删除count个和value值相等的元素,
count=0删除所有和value值相等的元素
lset
lset key index value
把下标为index的值用value替换
成功返回ok,超出范围或key不存在返回error
linsert
linsert key befor|after pivot value
把value值插入到pivot之前或之后
执行成功返回新列表长度,没找到返回-1,key不存在返回0,有 重复值在第一个值插入
4.set
sadd
sadd key member[member…]
把一个或多个member加入到key中,已存在集合中的元素将被忽略
返回值:加入到集合的新元素的个数
smembers
smembers key
显示集合的成员
sismember
sismember key value
检查value是否存在key中
返回:1存在
0不存在
scard
scard key
返回set的长度
srem
srem key member[member…]
删除key中的member
srandmember
srandmember key[count]
count正数,表示在集合中随机抽取俩个元素
count负数,可以重复多次
spop
spop key[count]
默认删除一个,并显示,count删除个数
zset
zadd
zadd key score member[score member…]
把一个或多个member元素及其score值加入到有序集合key中,若member存在集合中,则更新值,score可以是整数或浮点数,添加member的score相同按字典序排序
返回值:数字,新添加的元素个数
zrange
zrange key start stop[withscores]
查询有序集合,指定区间内的元素,按score值从小到大排序,withscores选项让score和value一同返回
返回值:自定义区间的成员集合
zrevrange
从大到小排序
zrem
zrem key member[member…]
删除key中的member
返回删除的个数
zrangebyscore
zrangebyscore key min max [withscores] [limit offset count]
获取score值位于min<=score<=max之间的成员,从小到大排序
使用(表示不包过 -inf表示最小,+inf表示最大
limit 用来限制返回结果的数量和区间
withscores 显示score和value
zrangebyscore
从大到小排序显示
zcount
zcount key min max
返回一个score在min和max区间的score个数
redis事务
事务操作的命令
1.multi
开启事务
返回ok
2.exec
执行事务块
事务被打断返回nil
3.discard
放弃事务
返回ok
4.watch
watch key[]
作用监视key
5.unwatch
取消监视
事务的实现
redis没有事务的回滚
持久化
RDB
redis database(RDB):指定的时间间隔内将内存中的数据集快照写入磁盘,数据恢复时将快照文件直接再读到内存
rdb把数据集存储在二进制文件中,只有一个文件,默认是dump.rdb。适合做备份,保存数据是在单独的进程中写文件,不影响redis的正常使用,rdb恢复数据时比其他的AOF速度快
save 表示在seconds秒内数据集至少有changes个key改动
可以有多条save 满足任意一条就满足
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JHATmqIM-1661827012591)(C:\Users\OMEN\AppData\Roaming\Typora\typora-user-images\image-20220313161432483.png)]
缺点:会有一定数据的丢失
AOF
Append-only File(AOF) ,redis每次接收到一条改变数据的命令时,它将把该命令写到一个AOF文件中(只记录写操作,读操作不记录),当redis重启时,它通过执行AOF文件中所有命令来恢复数据
appendonly:默认时no ,yes打开aof持久化
appendfilename:指定aof文件名,默认appendonly.aof
dir:指定rdb和aof文件存放目录,默认./
appendfsync:配置向aof文件写命令数据的策略:
no:不主动进行同步操作。而是完全交由操作系统(30s一次),比较快但不很安全
always:每次执行写入都会执行同步,慢一些但是比较安全
everysec:每秒执行一次同步操作,比较平衡,默认
auto-aof-rewrite-min-size:允许重写最小的aof文件大小,默认64m,当aof文件大于64m,开始整理aof文件,去掉无用的操作命令,缩小aop文件
主从复制
主服务器用来修改数据(master)
从服务器用来读数据(slave)
端口号0-1024被操作系统占用
可以从1025-65535中选
配置主服务器6380.conf
include /home/wjh/redis-6.2.6/redis.conf
daemonize yes
port 6380
pidfile /var/run/redis_6380.pid
logfile 6380.log
dbfilename dump6380.rdb
从服务器6382.conf
include /home/wjh/redis-6.2.6/redis.conf
daemonize yes
port 6382
pidfile /var/run/redis_6382.pid
logfile 6382.log
dbfilename dump6382.rdb
slaveof ip 端口
slaveof 表示是谁的从服务器
从服务器
不能写入数据
容灾处理
把从服务器升级为主服务器
salveof no one
另外一个需要重新指定主服务器 salveof ip 端口
哨兵
高可用Sentinel哨兵
Sentinel哨兵redis官方提高的高可用方案,可以用来监控多个redis服务器实例的运行情况Redis Sentinel 是一个运行在特殊模式下的Redis服务器,Redis Sentinel是在多个Sentinel进程环境下互相协作工作的
Sentinel系统有三个主要任务:
1.监控:Sentinel不断的检查主从服务器是否按照预期正常工作
2.提醒:被监控的Redis出现问题时。Sentinel会通知管理员或其他应用程序
3.自动故障转移:监控的主Redis不能正常工作,Sentinel 会开始进行故障迁移操作
三份sentinel配置文件修改:
1.修改port 26380 26382 26384
2.修改sentinel monitor mymaster ip 端口 2
格式 sentinel monitor <Quorum投票数>
安全设置
- ./ redis-cli -a 密码
2. auth 密码
Jedis
依赖
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.7.1</version><!--版本号可根据实际情况填写-->
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.3.2</version>
</dependency>
String host = "192.168.121.134";
int port = 6379;
String password = "123456";
Jedis jedis = new Jedis(host,port);
jedis.auth(password);
示例
String host = "192.168.121.134";
int port = 6379;
String password = "123456";
JedisPool pool = RedisUtils.open(host,port,password);
Jedis jedis = pool.getResource();
Map map = new HashMap<String,String>();
map.put("css","5");
map.put("html","10");
map.put("js","50");
jedis.hmset("javaweb",map);
System.out.println(jedis.get("student"));
Set<String> list = jedis.hkeys("javaweb");
for(String s:list){
System.out.println(jedis.hget("javaweb", s));
}
System.out.println( "Hello World!" );
pool.close();
工具类
public class RedisUtils {
private static JedisPool pool;
public static JedisPool open(String ip,int port,String password){
if( pool == null){
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(20);//设置最大的线程数,一个线程就是一个jedis
config.setMaxIdle(2);//设置最大的空闲数量
config.setTestOnBorrow(true);//每一个对象都是检查可用的
/*
* poolConfig:配置器JedisPoolConfig
* ip:redis所在的linux的ip
* port:redis所在的端口
* timeout:链接redis的超时,毫秒值
* password: redis的密码
*
* */
pool = new JedisPool(config,ip,port,6000,password);
}
return pool;
}
public static void close(){
if(pool != null){
pool.close();
}
}
}
){
if( pool == null){
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(20);//设置最大的线程数,一个线程就是一个jedis
config.setMaxIdle(2);//设置最大的空闲数量
config.setTestOnBorrow(true);//每一个对象都是检查可用的
/*
* poolConfig:配置器JedisPoolConfig
* ip:redis所在的linux的ip
* port:redis所在的端口
* timeout:链接redis的超时,毫秒值
* password: redis的密码
*
* */
pool = new JedisPool(config,ip,port,6000,password);
}
return pool;
}
public static void close(){
if(pool != null){
pool.close();
}
}
}