【redis、Jedis】
redis
redis:是一款高性能的NOSQL系列的非关系型数据库。
NoSQL,泛指非关系型数据库,主要分为四大类:
**1.key-value存储数据库。**该类数据库使用哈希表,在哈希表中包含特定的key和与其对应的指向特定数据的指针。常用的有Redis。
**2.列存储数据库。**该类数据库主要用来应对分布式存储的海量数据,一个键指向了多个列。常用的有HBase。
**3.文档型数据库。**该类数据库将结构化、半结构化的文档以特定格式存储,如json格式。一个文档相当于关系型数据库中的一条记录,也是处理信息的基本单位。常用的有MongoDB。
**4.图形数据库。**该类数据库使用图形理论来存储实体之间的关系信息,最主要的组成部分是:结点集、连接节点的关系。常用的有Neo4j。
下载安装(windows版)
- 官网:https://redis.io/
- 中文网:https://www.redis.net.cn/
- 解压可以直接使用:
redis.windows.conf
:配置文件redis-cli.exe
:redis的客户端redis-server.exe
:redis的服务器端
命令操作
redis的数据结构【重要】
- redis存储的是key-value格式的数据:
- key是字符串
- value有五种数据结构:
- 字符串类型 string
- 哈希类型 hash
- 列表类型 list
- 集合类型 set
- 有序集合类型 sortedset
各个数据结构的键值对的命令
-
字符串类型 string
- 存储:
set key value
- 获取:
get key
- 删除:
del key
- 存储:
-
哈希类型 hash
- 存储:
hset key field value
- 获取:
- 获取指定field对应的值:
hget key field
- 获取所有field和value:
hgetall key
- 获取指定field对应的值:
- 删除:hdel key field
- 存储:
-
列表类型 list:可以添加一个元素到列表的头部(左边)或者尾部(右边)
-
存储:
lpush key value
:将元素添加到列表的左边rpush key value
:将元素添加到列表的右边
-
获取列表的元素:
-
lrange key start end
:范围获取获取全部为:
lrange key 0 -1
-
-
删除:
lpop key
:删除列表最左边的元素并将元素返回rpop key
:删除列表最右边的元素并将元素返回
-
-
集合类型 set:不允许重复元素
- 存储:
sadd key value
- 获取:
smembers key
:获取set集合中所有元素 - 删除:
srem key value
:删除set集合中的某个元素
- 存储:
-
有序集合类型 sortedset:不允许重复元素,且元素有顺序
- 存储:
zadd key score value
:score为排序的分数,从小到大排序 - 获取:
zrange key start end
- 删除:
zrem key value
- 存储:
通用命令
- 查询所有的键:
keys *
- 获取键对应的值的数据类型:
type key
- 删除指定的key value:
del key
持久化
- redis是一个内存数据库,当redis服务器重启或者电脑重启,数据会丢失。我们可以将redis内存中的数据持久化保存到硬盘的文件中。
- redis的持久化机制:
- RDB:默认方式,不需要进行配置,默认就是使用这种机制
- 在一定的间隔时间中,检测key的变化情况,然后持久化数据
- AOF:日志记录的方式,可以记录每一条命令的操作。可以每一次操作后,持久化数据
- RDB:默认方式,不需要进行配置,默认就是使用这种机制
RDB方式持久化
-
编辑
redis.windows.conf
文件:save 900 1:after 900 sec (15 min) if at least 1 key changed
save 300 10:after 300 sec (5 min) if at least 10 keys changed
save 60 10000:after 60 sec if at least 10000 keys changed
-
dos命令行重新启动redis服务器并指定配置文件:
C:\Users\hp\Desktop\javaLearning\安装包\redis安装包\Redis-x64-3.2.100>redis-server.exe redis.windows.conf
Jedis
Jedis是一款Java操作redis数据库的工具,类似于之前操作MySql的JDBC。
使用步骤:
- 下载Jedis的jar包;
- 使用
/**
* 测试Jedis的使用
*/
@org.junit.Test
public void test01(){
//1.导入Jedis的jar包
//2.创建Jedis对象
Jedis jedis = new Jedis("localhost",6379);
//3.操作
//3.1.添加string键值对
jedis.set("username","张三");
//3.2.获取
String username = jedis.get("username");
System.out.println(username);
//3.3删除
jedis.del("username");
//4.关闭连接
jedis.close();
}
Jedis操作各种redis中的数据结构
字符串类型 string
/**
* Jedis操作字符串类型
*/
@org.junit.Test
public void test02(){
//1.导入Jedis的jar包
//2.创建Jedis对象
Jedis jedis = new Jedis("localhost",6379);
//3.操作
//3.1.1.添加string键值对
jedis.set("username","张三");
//3.1.2.可以使用setex()方法存储可以指定过期时间的key value
jedis.setex("password",20,"123456");
//3.2.获取string的value
String username = jedis.get("username");
System.out.println(username);
//3.3删除
jedis.del("username");
//4.关闭连接
jedis.close();
}
哈希类型 hash
/**
* Jedis操作hash类型
*/
@org.junit.Test
public void test03(){
//1.导入Jedis的jar包
//2.创建Jedis对象
Jedis jedis = new Jedis("localhost",6379);
//3.操作
//3.1.添加string键hash值对
jedis.hset("user","name","张三");
jedis.hset("user","age","23");
jedis.hset("user","gender","male");
//3.2.1获取指定键的指定field的value
String username = jedis.hget("user", "name");
System.out.println(username);
//3.2.2获取所有的键的所有值的map集合
Map<String, String> user = jedis.hgetAll("user");
//遍历map集合
Set<String> keySet = user.keySet();
for (String key : keySet) {
System.out.println(key+":"+user.get(key));
}
//3.3删除键的指定field
jedis.hdel("user", "name");
//4.关闭连接
jedis.close();
}
列表类型 list
/**
* Jedis操作list类型
*/
@org.junit.Test
public void test04(){
//1.导入Jedis的jar包
//2.创建Jedis对象
Jedis jedis = new Jedis();//如果使用空参构造,默认值:host:"localhost",port:6379
//3.操作
//3.1.添加string键list值对
jedis.lpush("mylist","a","b","c");//从左边存
jedis.lpush("mylist","a","b","c");//从右边存
//3.2.范围获取
List<String> mylist = jedis.lrange("mylist", 0, -1);
System.out.println(mylist);
//3.3删除(弹出)
String lpop = jedis.lpop("mylist");
String rpop = jedis.rpop("mylist");
//4.关闭连接
jedis.close();
}
集合类型 set
/**
* Jedis操作set类型
*/
@org.junit.Test
public void test05(){
//1.导入Jedis的jar包
//2.创建Jedis对象
Jedis jedis = new Jedis();//如果使用空参构造,默认值:host:"localhost",port:6379
//3.操作
//3.1.添加string键set值对
jedis.sadd("myset","a","b");
//3.2.获取
Set<String> myset = jedis.smembers("myset");
System.out.println(myset);
//3.3删除集合中的某个元素
jedis.srem("myset","a");
//4.关闭连接
jedis.close();
}
有序集合类型 sortedset
/**
* Jedis操作sortedset类型
*/
@org.junit.Test
public void test06(){
//1.导入Jedis的jar包
//2.创建Jedis对象
Jedis jedis = new Jedis();//如果使用空参构造,默认值:host:"localhost",port:6379
//3.操作
//3.1.添加string键sortedset值对
jedis.zadd("gender",7,"老王");
jedis.zadd("gender",6,"老李");
jedis.zadd("gender",6,"老刘");
//3.2.获取
Set<String> gender = jedis.zrange("gender", 0, -1);
System.out.println(gender);
//3.3删除有序集合中的某个元素
jedis.zrem("gender","老王");
//4.关闭连接
jedis.close();
}
Jedis连接池:JedisPool
使用:
- 创建JedisPool连接池对象;
- 调用方法 getResource()获取Jedis连接对象。
/**
* Jedis连接池的使用
*/
@org.junit.Test
public void test07(){
//0.导入JedisPool的jar包
//1.创建连接池配置对象
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(50);
config.setMaxIdle(10);
//2.创建JedisPool对象
JedisPool jedisPool = new JedisPool(config,"localhost",6379);
//3.获取Jedis连接对象
Jedis jedis = jedisPool.getResource();
//4.操作
//4.1.添加string键值对
jedis.set("username","张三");
//4.2.获取
String username = jedis.get("username");
System.out.println(username);
//4.3删除
jedis.del("username");
//5.关闭连接
jedis.close();
}
JedisPool详细配置
#最大活动对象数
redis.pool.maxTotal=1000
#最大能够保持idel状态的对象数
redis.pool.maxIdle=100
#最小能够保持idel状态的对象数
redis.pool.minIdle=50
#当池内没有返回对象时,最大等待时间
redis.pool.maxWaitMillis=10000
#当调用borrow Object方法时,是否进行有效性检查
redis.pool.testOnBorrow=true
#当调用return Object方法时,是否进行有效性检查
redis.pool.testOnReturn=true
#“空闲链接”检测线程,检测的周期,毫秒数。如果为负值,表示不运行“检测线程”。默认为-1.
redis.pool.timeBetweenEvictionRunsMillis=30000
#向调用者输出“链接”对象时,是否检测它的空闲超时;
redis.pool.testWhileIdle=true
#对于“空闲链接”检测线程而言,每次检测的链接资源的个数。默认为3.
redis.pool.numTestsPerEvictionRun=50
#redis服务器的IP
redis.ip=xxxxxx
#redis服务器的Port
redis1.port=6379
JeidsPoolUtil工具类
/**
* JedisPool的工具类,在配置文件中定义配置信息,降低耦合
*/
public class JedisPoolUtil {
//设置成员变量jedisPool,供类中的方法统一使用
private static JedisPool jedisPool;
/**
* 静态代码块,类加载是初始化jedisPool成员变量
*/
static {
//获取配置文件的输入流
InputStream inputStream = JedisPoolUtil.class.getClassLoader().getResourceAsStream("jedis.properties");
//创建属性集对象,并加载输入流
Properties properties = new Properties();
try {
properties.load(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
//创建连接池配置对象,获取相关配置内容
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxIdle(Integer.parseInt(properties.getProperty("maxIdle")));
config.setMaxTotal(Integer.parseInt(properties.getProperty("maxTotal")));
jedisPool = new JedisPool(config,properties.getProperty("host"),Integer.parseInt(properties.getProperty("port")));
}
/**
* 获取jedis连接对象
*/
public Jedis getJedis(){
return jedisPool.getResource();
}
}