NoSQL数据库原理与应用综合项目——Redis篇
文章目录
- NoSQL数据库原理与应用综合项目——Redis篇
- 0、 写在前面
- 1、本地数据或HDFS数据导入到Redis
- 2、Redis数据库表操作
- 2.1 Java API 连接Redis
- 2.2 查询数据
- 2.3 插入数据
- 2.4 修改数据
- 2.5 删除数据
- 3、Windows远程连接Redis(Linux)
- 4、数据及源代码
- 5、总结
0、 写在前面
- Windos版本:
Windows10
- Linux版本:
Ubuntu Kylin 16.04
- JDK版本:
Java8
- Hadoop版本:
Hadoop-2.7.1
- HBase版本:
HBase-1.1.5
- Zookeepr版本:使用HBase自带的ZK
- Redis版本:
Redis-3.2.7
- MongoDB版本:
MongoDB-3.2.7
- Neo4j版本:
Neo4j-3.5.12 Community
- IDE:
IDEA 2020.2.3
- IDE:
Pycharm 2021.1.3
1、本地数据或HDFS数据导入到Redis
- 代码:
使用哈希键值对的方式,每条数据的id字段作为key,所有属性字段作为value
- 运行成功图示:
顺利插入13518条数据
- 结果图:
查询key为13518的数据是否存在
2、Redis数据库表操作
2.1 Java API 连接Redis
pom.xml文件引入
redis.clients
组下的jedis
- 代码:
private static String HOST = "10.125.0.15";
private static int PORT = 6379;
private static String PWD = "redis_password";
private static Jedis jedis = null;
private static JedisPool jedisPool = null;
/**
* TODO 初始化Redis连接池
*/
public static void init() {
if (jedis == null) {
jedis = new Jedis(HOST, PORT);
jedis.auth(PWD);
}
if (jedis != null) {
System.out.println("Redis连接成功");
} else {
System.out.println("Redis连接失败");
}
}
2.2 查询数据
- 查询匹配的key
正则表达式匹配key,使用迭代器
Iterator
遍历输出查询到的匹配的key的数据
/**
* TODO 查询某个匹配key
* @param pattern
*/
public static void queryKey(String pattern) {
Set<String> keys = jedis.keys(pattern);
int cnt = 0;
boolean flag = true;
int size = keys.size();
Iterator<String> iterator = keys.iterator();
System.out.println("经查询匹配到的key有" + size + "个");
if (size <= 10) {
System.out.println("分别为:");
for (String key : keys) {
System.out.print(key + " ");
}
System.out.println();
} else {
System.out.println("前5个key分别为:");
while (iterator.hasNext() && flag) {
String key = iterator.next();
cnt++;
System.out.print(key + " ");
if (cnt > 5) {
flag = false;
}
}
System.out.println();
System.out.println("后5个key分别为:");
for (int i = 0; i < 5; i++) {
String key = (String) keys.toArray()[size - i - 1];
System.out.print(key + " ");
}
System.out.println();
}
}
- 查询指定key的值
使用Map
来存储查询key的结果,最后遍历map的entrySet
输出结果信息
/**
* TODO 查询指定key的值
* @param key
*/
public static void queryByKey(String key) {
Boolean vis = jedis.exists(key);
if (vis) {
Map<String, String> valueMap = jedis.hgetAll(key);
int size = valueMap.size();
System.out.println("键为" + key + "的查询大小为:" + size);
System.out.println("键为" + key + "的查询结果为:");
System.out.println("{");
for (Map.Entry<String, String> entry : valueMap.entrySet()) {
if (size == 1) {
System.out.println("\t[" + entry.getKey() + "," + entry.getValue() + "]");
} else {
System.out.println("\t[" + entry.getKey() + "," + entry.getValue() + "],");
}
size--;
}
System.out.println("}");
} else {
System.out.println("你所查询的key不存在!");
}
jedis.close();
}
- 查询指定key和属性的值
要查询的key,field作为参数传入query()
/**
* TODO 查询指定key和指定属性的值
* @param key
* @param field
*/
public static void query(String key, String field) {
Boolean vis = jedis.exists(key);
if (vis) {
String value = jedis.hget(key, field);
if ("".equals(value)) {
System.out.println("键为" + key + "不存在" + "属性" + field);
} else {
System.out.println("键为" + key + "的" + field + "属性值为:" + value);
}
} else {
System.out.println("你所查询的key不存在!");
}
jedis.close();
}
2.3 插入数据
- 插入一条数据
要插入的key,field,value作为参数传入putOne()
/**
* TODO 新增一条数据
*/
public static void putOne(String key, String field, String value) {
jedis.hset(key, field, value);
String values = jedis.hget(key, field);
System.out.println("新增了一条键为" + key + ",属性为" + field + "值为:" + values + "的数据");
jedis.close();
}
- 插入多条数据
要插入的key以数组的形式存储,其他属性值以
List<Map<String, String>>
的结构存储,并作为参数传入putMulti()
/**
* TODO 新增多条数据
* @param keysArr
* @param fieldValues
*/
public static void putMulti(String[] keysArr, List<Map<String, String>> fieldValues) {
int length = keysArr.length;
for (int i = 0; i < keysArr.length; i++) {
jedis.hmset(keysArr[i], fieldValues.get(i));
}
System.out.println("数据新增成功!");
jedis.close();
}
2.4 修改数据
- 修改name属性
要修改的条件key,field,value作为参数传入modifyData()
/**
* TODO 修改数据
* @param key
* @param value
* @return
*/
public static boolean modifyData(String key, String field, String value) {
if (jedis.exists(key)) {
jedis.hset(key, field, value);
if (value.equals(jedis.hget(key, field))) {
System.out.println("键为" + key + ",属性为" + field + "的数据" + "修改成功!");
jedis.close();
return true;
} else {
System.out.println("修改数据失败");
jedis.close();
return false;
}
} else {
System.out.println(key + "不存在");
jedis.close();
return false;
}
}
2.5 删除数据
- 根据key删除数据
要删除的条件key作为参数传入deleteOne()
/**
* TODO 根据key删除数据
* @param key
*/
public static boolean deleteOne(String key) {
if (jedis.exists(key)) {
if (jedis.del(key) == 1) {
System.out.println("成功删除1条数据!");
jedis.close();
return true;
} else {
System.out.println("删除数据失败");
jedis.close();
return false;
}
} else {
System.out.println("删除的key[" + key + "]不存在!");
jedis.close();
return false;
}
}
- 删除指定key和field的数据
要删除的条件key和field作为参数传入deleteField()
/**
* TODO 删除指定key和field的数据
* @param key
* @param field
*/
public static void deleteField(String key, String field) {
if (jedis.exists(key)) {
if (jedis.hdel(key, field) != 0) {
System.out.println("成功删除key为" + key + ",属性为" + field + "的这条数据!");
} else {
System.out.println("删除数据失败,不存在" + field + "这个属性!");
}
} else {
System.out.println("删除的key[" + key + "]不存在!");
}
jedis.close();
}
删除前数据:
删除操作:
删除后数据:
- 删除一组key的数据
要删除的key以数组的形式传入deleteMutli()
/**
* TODO 删除一组key的数据
* @param keys
* @return
*/
public static void deleteMutli(String[] keys) {
boolean[] deleted = new boolean[keys.length];
for (int i = 0; i < keys.length; i++) {
String key = keys[i];
if (jedis.exists(key)) {
jedis.del(key);
deleted[i] = true;
}
jedis.close();
}
int deleteSize = 0;
for (boolean b : deleted) {
if (b) {
deleteSize++;
}
}
if (deleteSize >= 1) {
System.out.print("成功删除了" + deleteSize + "条数据,删除的key分别是:");
int size = deleteSize;
for (int i = 0; i < keys.length; i++) {
if (deleted[i]) {
if (size == 1) {
System.out.println(keys[i]);
} else {
System.out.print(keys[i] + ", ");
}
size--;
}
}
} else {
System.out.println("这组要删除的key不存在!");
}
}
3、Windows远程连接Redis(Linux)
Redis的相关配置文件需要提前设置正确,最主要的就是ip地址、auth的设置,同时要注意防火墙是否关闭。
参考链接:
https://blog.csdn.net/m0_52735414/article/details/128188140
4、数据及源代码
-
Github
-
Gitee
5、总结
由于数据量只有1万多条,将数据导入Redis并不麻烦,直接使用Python读取数据表,设置好key和value,并用hset()
导入即可。
主要的方法如下:
- exists()
- del()
- hdel()
- hset()
- hmset()
- hget()
- hgetAll()
- close()
结束!