目录
一、redis客户端的常用指令
1、jedis客户端的端口号是6379
2、启动redis服务 :
[root@master redis-4.0.14]# ./src/redis-server redis.conf
3、进入客户端命令行格式: ./src//redis-cli -h ip地址 -p 6379
[root@master redis-4.0.14]# ./src/redis-cli -h qianfeng01 -p 6379
4、停止redis:
./src/redis-server shutdown
或者查看redis进程再杀死
ps -ef | grep redis
kill -9 进程号
5、redis客户端密码配置:
redis.conf配置文件中的第500行设置密码
requirepass 123456
总结:
# 开启客户端
# -h : 指定bind的host,默认的127.0.0.1,如果没有修改过redis.conf文件,这里可以省略不写
# -p : 指定redis的登录的端口
# -a : 指定密码登录,也可以不在这里设置,登录进去之后,通过 auth 1234 也可以获取到授权
# --raw : 设置可以显示中文
./redis-cli -h host01 -p 6379 -a 1234 --raw# 注: 如果需要设置密码,则修改redis.conf文件,修改requirepass=1234
二、命令行操作
#设置键值对 set a 123 #根据键获取值 get a #重新设置a的值 reload a adc # 切换数据库 select index数据库编号 # 查询所有的Key qianfeng01:6379[1]> keys * # 删除一个key qianfeng01:6379[1]> del a # 设置key的期限 毫秒和秒 qianfeng01:6379[1]> PEXPIRE b 10000 qianfeng01:6379[1]> EXPIRE a 100 # 查看剩余期限时间 毫秒和秒 qianfeng01:6379[1]> ttl a (integer) 70 qianfeng01:6379[1]> pttl a # 清除期限时间 qianfeng01:6379[1]> PERSIST a # 判断一个key是否存在 1 存在 0不存在 qianfeng01:6379[1]> EXISTS a (integer) 1 qianfeng01:6379[1]> EXISTS b (integer) 0 # 更名 qianfeng01:6379[1]> rename a aa # 查看类型 注意在命令行操作的数据都是属于string类型 qianfeng01:6379[1]> type aa
三、redis客户端API操作
1、添加依赖
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
注:若redis数据库有密码,那么就需要进行密码验证
授权使用命令auth 123456
(先进redis里面使用该命令)或者 ./src//redis-cli -h ip地址 -p 6379 -a 123456 --raw
2、单机连接
package com.redis.api;
import redis.clients.jedis.Jedis;
public class JedisApiTest {
public static void main(String[] args) {
Jedis jedis = new Jedis("qianfeng01",6379);
//测试连接
// System.out.println(jedis.ping());
//验证密码
String auth = jedis.auth("123");
System.out.println(jedis.ping());
}
}
3、连接池连接
package com.redis.api;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
public class JedisPoolTest {
public static void main(String[] args) {
//配置参数
GenericObjectPoolConfig genericObjectPoolConfig = new GenericObjectPoolConfig();
genericObjectPoolConfig.setMaxTotal(10);
genericObjectPoolConfig.setMaxIdle(5);
genericObjectPoolConfig.setMinIdle(1);
JedisPool jedisPool = new JedisPool(genericObjectPoolConfig, "master", 6379, 5000, "123");
Jedis jedis = jedisPool.getResource();
//测试
System.out.println(jedis.ping());
}
}
四、redis数据类型
1、五种数据类型
package com.redis.api;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.ScanParams;
import redis.clients.jedis.ScanResult;
import java.util.List;
public class TEst {
public static void main(String[] args) {
Jedis jedis = new Jedis("192.168.1.101", 6379);
jedis.auth("123");
//清空当前数据库的命令
jedis.flushDB();
System.out.println(jedis.ping());
/**
* String类型
*/
jedis.set("bigdata", "test");
System.out.println(jedis.get("bigdata"));
jedis.append("bigdata", "append");
System.out.println(jedis.get("bigdata"));
//自增 自增key若不存在,则会创建一个新的key,累计加1
jedis.incr("increment");
System.out.println(jedis.get("increment"));
jedis.incrBy("increment", 10);
System.out.println(jedis.get("increment"));
jedis.incrByFloat("float", 0.5);
System.out.println(jedis.get("float"));
//自减
jedis.decr("decrement");
System.out.println(jedis.get("decrement"));
jedis.decrBy("decrement", 10);
System.out.println(jedis.get("decrement"));
//替换
jedis.setrange("bigdata", 0, "bj");
System.out.println(jedis.get("bigdata"));
//获取字符串长度
System.out.println(jedis.strlen("bigdata"));
//一次性设置多个key的值
jedis.mset("java","100","hadoop","111");
//获取多个key的值
List<String> mget = jedis.mget("java", "hadoop");
System.out.println(mget);
//获取key值,并赋新的值 -- 大白话是 先获取key的值 再赋新的值
jedis.getSet("java", "200");
System.out.println(jedis.get("java"));
System.out.println("---------------------------------------------");
/**
* List类型 api操作
*/
//添加元素
jedis.lpush("users", "a","b","c","d");
jedis.rpush("users", "e","f");
//获取数据
List<String> users = jedis.lrange("users", 0, -1);
System.out.println("添加数据后的集合:"+users);
//获取集合的长度
System.out.println("users的长度为"+jedis.llen("users"));
//删除元素 -- 可以删除集合中任意位置的元素,前提自己指定
jedis.lrem("users", 1, "a");
List<String> users1 = jedis.lrange("users", 0, -1);
System.out.println("删除数据后的集合:"+users1);
System.out.println("删除后的长度:"+ jedis.llen("users"));
//删除最左边的元素
jedis.lpop("users");
List<String> users2 = jedis.lrange("users", 0, -1);
System.out.println("删除数据后的集合:"+users2);
System.out.println("删除后的长度:"+ jedis.llen("users"));
//删除最右边的元素
jedis.rpop("users");
List<String> users3 = jedis.lrange("users", 0, -1);
System.out.println("删除数据后的集合:"+users3);
System.out.println("删除后的长度:"+ jedis.llen("users"));
//插入元素,插入到集合的头部 类似于数据结构中队列插入
jedis.lpushx("users", "aaa");
List<String> users4 = jedis.lrange("users", 0, -1);
System.out.println("插入数据后的集合:"+users4);
//获取元素索引数据
System.out.println(jedis.lindex("users", 0));
System.out.println("-----------------------------------------");
/**
* Hash类型的api操作
*/
//添加元素
jedis.hset("student", "name", "lisi");
jedis.hset("student","age","18");
//获取元素
System.out.println(jedis.hget("student", "name"));
//获取key的所有域和值
System.out.println(jedis.hgetAll("student"));
//获取key的所有的value值
System.out.println(jedis.hvals("student"));
//判断key是否存在
System.out.println(jedis.hexists("student", "name"));
//累加 - 也可以浮点型增加
jedis.hincrBy("student", "age", 10);
System.out.println(jedis.hget("student", "age"));
//获取key的长度
System.out.println(jedis.hlen("student"));
//删除元素
jedis.hdel("student", "name","age");
System.out.println(jedis.hgetAll("student"));
System.out.println("--------------------------------");
/**
* set类型的api操作
* 无序且不可重复
*/
//添加数据
jedis.sadd("its", "java","h5","hadoop","ceshi","ui");
//查询元素个数
System.out.println(jedis.scard("its"));
//查询集合的所有元素
System.out.println(jedis.smembers("its"));
//随机抽取
System.out.println(jedis.srandmember("its"));
//删除 -- 随机删除
System.out.println(jedis.spop("its"));
//精确删除
System.out.println(jedis.srem("its", "java"));
//模糊匹配
ScanParams scanParams = new ScanParams();
scanParams.match("*i*");
ScanResult<String> scanResult = jedis.sscan("its", 0, scanParams);
System.out.println(scanResult.getResult());
System.out.println("-----------------------------------------------------");
/**
* zset类型的api操作
* 元素有序,不可重复
*
* 另外 score值越大 排名越靠后
*/
//添加元素
jedis.zadd("price", 1, "10");
jedis.zadd("price", 5, "50");
jedis.zadd("price", 66, "660");
jedis.zadd("price", 55, "550");
jedis.zadd("price", 10, "100");
//获取元素
System.out.println(jedis.zrange("price", 0, -1));
//自增 -- 根据元素增加分支,返回新的分值
jedis.zincrby("price", 100, "10");
System.out.println(jedis.zrange("price", 0, -1));
//返回有序集key中成员member的排名,下标从0开始
System.out.println(jedis.zrank("price", "660"));
//获取元素的score分值
System.out.println(jedis.zscore("price", "66"));
//获取范围性元素,从后往前获取
System.out.println(jedis.zrevrange("price", 0, 3));
System.out.println(jedis.zcount("price", 9, 60));
}
}
2、其他操作
// 模糊匹配
val scanner: ScanParams = new ScanParams()
val params: ScanParams = scanner.`match`("*a*") // 查找所有的包含a的key
val value: ScanResult[String] = jedis.scan("0", params)
println(value.getResult)
五、持久化操作
这两种方式都会在redis/bin目录下会分别产生dump.rdb
和appendonly.aof
文件
1、RDB方式
save 900 1
save 300 10
save 60 10000
RDB方式的持久化是通过快照(snapshotting)完成的,当符合一定条件时Redis会自动将内存中的数据进行快照并持久化到硬盘。
save开头的一行就是持久化配置,可以配置多个条件(每行配置一个条件),每个条件之间是“或”的关系,“save 900 1”表示15分钟(900秒钟)内至少1个键被更改则进行快照,“save 300 10”表示5分钟(300秒)内至少10个键被更改则进行快照。
Redis启动后会读取RDB快照文件,将数据从硬盘载入到内存。根据数据量大小与结构和服务器性能不同,这个时间也不同。通常将记录一千万个字符串类型键、大小为1GB的快照文件载入到内存中需要花费20~30秒钟。
问题总结:
通过RDB方式实现持久化,一旦Redis异常退出,就会丢失最后一次快照以后更改的所有数据。这就需要开发者根据具体的应用场合,通过组合设置自动快照条件的方式来将可能发生的数据损失控制在能够接受的范围。如果数据很重要以至于无法承受任何损失,则可以考虑使用AOF方式进行持久化。
2、AOF方式
aof是默认不开启的,需要⼿动设置,可以在redis.conf
中设置
如果rdb⽅式和aof⽅式同时使⽤的话,那么默认从aof⽂件中加载数据。使用这种方式之前存在RDB中的数据全都会没了。
六、redis集群搭建
搭建Redis集群至少需要六个节点(三主三从)
1、 集群通信是通过“ping-pong”机制进⾏通信;
2、 客户端不需要将所有的节点都连接上,只需要连接其中⼀个节点即可。
3、 集群中存储数据是存储到⼀个个的槽中,集群中槽的个数是固定的:16384,槽的编号是【0-16383】。
在集群中存储数据时,会根据key进⾏计算,计算出⼀个结果,然后将这个结果和16384取余,
余数就是这个key将要存储的槽的编号。
注意:槽的编号之间不能断开。
槽的计算会将数据保存的很平均,不会产⽣⼀个槽满⼀个槽空的情况。
redis伪分布式集群搭建
这里只配置了三个主节点
准备工作:
需要将三个主节点都搭建在 master上,使用的端口,分别是 7001, 7002, 7003
版本准备:
Redis-3.0.6.tar.gz # 因为从4版本开始,搭建集群,需要将ruby升到2.2.2+版本
路径规划:
1. 创建文件夹
/usr/local/server/redis/cluster/bin
/usr/local/server/redis/cluster/7001
/usr/local/server/redis/cluster/7002
/usr/local/server/redis/cluster/7003
#1、下载redis-3.0.6
wget http://download.redis.io/releases/redis-3.0.6.tar.gz
#2、解压、安装
[root@master soft]# tar -zxvf /usr/local/redis-3.0.6.tar.gz -C /opt/soft/
#3、安装gcc库与编译redis
[root@master redis-3.0.6]# yum install readline-devel pcre-devel openssl-devel perl gcc
[root@master redis-3.0.6]# make && make install
#4、创建存放多个实例的目录
[root@master redis-3.0.6]# mkdir -p /opt/app/redis/cluster
[root@master redis-3.0.6]# cd /opt/app/redis/cluster
#创建三个主节点
[root@master cluster]# mkdir 7001 7002 7003
#5、修改配置文件
[root@master cluster]# cp /opt/soft/redis-3.0.6/redis.conf 7001/
修改配置文件中下面选项
port 7001
daemonize yes
cluster-enabled yes
cluster-config-file nodes.conf -- 我写的添加了7001
cluster-node-timeout 5000
appendonly yes
bind 192.168.1.101
文件中的 cluster-enabled 选项用于开实例的集群模式, 而 cluster-conf-file 选项则设定了保存节点配置文件的路径, 默认值为nodes.conf 。其他参数相信童鞋们都知道。节点配置文件无须人为修改, 它由 Redis 集群在启动时创建, 并在有需要时自动进行更新。
修改完成后,把修改完成的redis.conf复制到7001-7003目录下,并且端口修改成和文件夹对应。
[root@master 7001]# cp redis.conf ../7002/
[root@master 7001]# cp redis.conf ../7003/
修改port与cluster-config-file
#6、启动三个redis
[root@master cluster]# /opt/soft/redis-3.0.6/src/redis-server 7001/redis.conf
[root@master cluster]# /opt/soft/redis-3.0.6/src/redis-server 7002/redis.conf
[root@master cluster]# /opt/soft/redis-3.0.6/src/redis-server 7003/redis.conf
查看进程是否存在
[root@master cluster]# ps -ef | grep redis
root 13021 1 0 15:00 ? 00:00:21 ./src/redis-server 192.168.1.101:6379
root 92076 1 0 18:31 ? 00:00:00 /opt/soft/redis-3.0.6/src/redis-server 192.168.1.101:7001 [cluster]
root 92164 1 0 18:31 ? 00:00:00 /opt/soft/redis-3.0.6/src/redis-server 192.168.1.101:7002 [cluster]
root 92210 1 0 18:31 ? 00:00:00 /opt/soft/redis-3.0.6/src/redis-server 192.168.1.101:7003 [cluster]
root 92351 76316 0 18:32 pts/0 00:00:00 grep --color=auto redis
#7、执行命令创建集群,首先安装依赖,否则创建集群失败
[root@master cluster]# yum install ruby rubygems -y
复制集群管理程序到/usr/local/bin
[root@master cluster]# cp /opt/soft/redis-3.0.6/src/redis-trib.rb /usr/local/bin/redis-trib
创建集群:
[root@master cluster]# redis-trib create --replicas 0 192.168.1.101:7003 192.168.1.101:7001 192.168.1.101:7002