玩具kv数据库

介绍

用java写一个简陋的kv数据库(俩小时的货),用来复习一下java流知识、线程、socket等知识。

客户端:很简单的写了一下功能:就是发送用户的命令,还有接收数据显示出来
服务端:redis类:读写和操作数据库(就是封装了一堆map)socket类:接收命令,发送数据打开这两个,然后在客户端打命令即可。使用规范:
***************************************
create tableName//创建表(最多一百个,可以改)
例:create stu//创建名为stu的表
***************************************
use tableName//操作表
例:use stu//操作名字为stu的表
***************************************
showall//打印所有表名
***************************************
增:add key value
删:delete key
改:change key
查:get key
是否存在:contains key
***************************************
end//结束

redis.java:

大概思路:

属性:

    private Map<String, String>[] r // 存储所有表
    private String[] tableName//存储所有表名
    private int num = 0;// 表数量
    private int target;// 当前操作的表

方法:

    增删改查

    更换操作的表

    打印

    写入硬盘

    从硬盘读出数据

    接受命令并执行,给反馈

package redisDemo01;import java.io.*;
import java.util.*;public class redis {Scanner in = new Scanner(System.in);private Map<String, String>[] r = new Map[100];// 最多创建100个表private String[] tableName = new String[100];private int num = 0;// 表数量private int target;// 当前操作的表// 创建表public void create(String name) {r[num] = new HashMap<String, String>();tableName[num] = name;target = num;num++;}// 操作表public void use(int target) {this.target = target;}public void use(String name) {for (int i = 0; i < num; i++) {if (tableName[i].equals(name)) {target = i;break;}}}// 判断是否存在public boolean contains(String key) {return r[target].containsKey(key);}// 增public void add(String key, String value) {r[target].put(key, value);}// 删public void delete(String key) {r[target].remove(key);}// 改public void change(String key, String value) {r[target].put(key, value);}// 查public String get(String key) {return r[target].get(key);}// 打印表public String show() {String ans = "";for (String key : r[target].keySet()) {ans = ans + key + " " + r[target].get(key) + " ";}return ans;}public String showAllTableName() {String anString="";for(int i=0;i<num;i++)anString=anString+i+":"+tableName[i];return anString;}//写入硬盘public void write() {try {Writer writer = new FileWriter(new File("member.txt"));int i=0;//表的下标while (i<num) {writer.write("table " + tableName[i] + "\r\n");//表名for (String key : r[i].keySet()) {writer.write(key + " " + r[i].get(key) + "\r\n");//数据}i++;}writer.close();} catch (IOException e) {e.printStackTrace();}}//读数据public void read() {try {FileReader fileReader = new FileReader("member.txt");BufferedReader bufferedReader = new BufferedReader(fileReader);String str;while ((str = bufferedReader.readLine()) != null) {String[] a = str.split(" ");if (a[0].equals("table")) {create(a[1]);//新表} else {add(a[0], a[1]);//表里的数据}}bufferedReader.close();fileReader.close();} catch (IOException e) {e.printStackTrace();}}// 接收命令public String command(String aString) {String ans = "success";String[] cmd = aString.split(" ");for (int i = 0; i < cmd.length; i++) {cmd[i] = cmd[i].replaceAll(" ", "");}String command = cmd[0];if (command.equals("create")) {create(cmd[1]);} else if (command.equals("use")) {use(cmd[1]);} else if (command.equals("add")) {add(cmd[1], cmd[2]);} else if (command.equals("contains")) {if (contains(cmd[1]))ans = "This key exists";elseans = "This key does not exists";} else if (command.equals("get")) {ans = "key:" + cmd[1] + "  value:" + get(cmd[1]);} else if (command.equals("delete")) {delete(cmd[1]);} else if (command.equals("show")) {ans = show();} else if (command.equals("showall")) {ans = showAllTableName();} else if (command.equals("end")) {write();return "end";}else {return "false,tryAgain";}return ans;}
}

socket.java

属性:

    String cmd;// 命令
    redis r0 // 数据库
    String returnText // 给客户看的信息

方法:

    主要任务是和客户端通信,接受命令,发出客户看到的界面数据。

package redisDemo01;import java.io.*;
import java.net.*;public class socket implements Runnable {String cmd;// 命令redis r0 = new redis();// 数据库String returnText = "success";// 给客户看的信息public void run() {try {r0.read();ServerSocket serverSocket = new ServerSocket(12016);do {Socket socket = serverSocket.accept();InputStream is = socket.getInputStream();OutputStream os = socket.getOutputStream();byte[] cache = new byte[1024];is.read(cache);cmd = new String(cache);cmd = cmd.trim();// 去掉多余空格,这个bug调了半天System.out.println("redis  >  " + cmd);returnText = r0.command(cmd);//操作数据库os.write(returnText.getBytes());// 给客户打印的数据os.flush();is.close();os.close();} while (!returnText.equals("end"));// serverSocket.close();} catch (Exception e) {e.printStackTrace();}}
}

然后你run一下socket,服务端这边就完事了。

ClientThread.java

接受客户命令然后发给服务端

接受服务端处理完的数据

用自己的方式呈现给客户(惭愧惭愧)

package Demo;import java.io.*;
import java.net.*;
import java.util.*;public class ClientThread implements Runnable {@Overridepublic void run() {try {while (true) {Scanner s = new Scanner(System.in);String temp = s.nextLine();Socket socket = new Socket("127.0.0.1", 12016);// 获取输入输出流InputStream is = socket.getInputStream();OutputStream os = socket.getOutputStream();// 发送os.write(temp.getBytes());os.flush();// 接收byte[] cache = new byte[1024];is.read(cache);String a = new String(cache);if (temp.equals("show")) {//打印所有k——va = a.trim();//去空格String[] c = a.split(" ");for (int i = 0; i < c.length; i++) {c[i] = c[i].replaceAll(" ", "");}for (int i = 0; i < c.length - 1; i += 2)//依次打印k——vSystem.out.printf("key:%10s  value:%10s\n", c[i], c[i + 1]);} elseSystem.out.println(a);os.close();socket.close();if (temp.equals("end"))break;}} catch (Exception e) {e.printStackTrace();}}
}

界面贼丑但是就是随便练个手啦。。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/445341.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络原理知识点总结

第一章&#xff1a; 计算机网络系统由资源子网和通信子网组成。 计算机网络系统主要由网络通信系统、操作系统和应用系统构成 互联网基础结构发展的三个阶段&#xff1a; 第一阶段&#xff1a;从单个网络 ARPANET 向互联网发展的过程。 第二阶段&#xff1a;建成了三级结构…

推荐算法--时效性(05)

时效性 推荐系统应该考虑时间效应&#xff0c;因为用户的兴趣是有时间变化的。用户一年前喜欢的东西现在不一定感兴趣&#xff0c;相比于推荐过去喜欢的物品&#xff0c;推荐用户近期喜欢的物品更有参考价值。而在新闻更是如此&#xff0c;推荐过去跟用户兴趣一致的新闻已经失去…

初识博弈论(1)

博弈论与主流经济学的新发展1.经济学的研究内容2.博弈论的研究内容3.博弈论的发展简史4.经济学发展的趋势本系列博文主要记录了学习张维迎老师的《博弈论与信息经济学》一书相关内容&#xff0c;如果有误之处恳请指出&#xff1b;或对照张老师的书籍进行学习。1.经济学的研究内…

c语言实现排序和查找所有算法

c语言版排序查找完成&#xff0c;带详细解释&#xff0c;一下看到爽&#xff0c;能直接运行看效果。 /* Note:Your choice is C IDE */ #include "stdio.h" #include"stdlib.h" #define MAX 10 void SequenceSearch(int *fp,int Length); void Search(int …

推荐算法--推荐系统架构(06)

外围架构一般来说&#xff0c;每个网站都有一个 UI 系统&#xff0c;UI 系统负责给用户展示网页并和用户交互。网站会通过日志系统将用户在 UI 上的各种各样的行为记录到用户行为日志中。 从上面的结构可以看到&#xff0c;除了推荐系统本身&#xff0c;主要还依赖两个条件--界…

树状数组维护区间和的模型及其拓广的简单总结

by wyl8899 树状数组的基本知识已经被讲到烂了&#xff0c;我就不多说了&#xff0c;下面直接给出基本操作的代码。 假定原数组为a[1..n]&#xff0c;树状数组b[1..n]&#xff0c;考虑灵活性的需要&#xff0c;代码使用int *a传数组。 #define lowbit(x) ((x)&(-(x))…

Python(6)-算数运算符

算数运算符1.算数运算符2.优先级1.算数运算符 加 减- 乘* 除/ 取商// 取余数% 幂**(能算n次方&#xff1a; 2**38&#xff0c;一直以为只能算平方) 扩展&#xff1a; 乘法用于字符串&#xff1a;字符串重复指定的次数&#xff0c;要拼接的次数很长时&#xff0c;用乘号很方便…

推荐算法--其他信息(07)

文章目录目录1.利用上下文信息1.1时间上下文1.2地点上下文2.利用网络社交数据2.1 获取网络社交数据途径2.2 社交网络数据2.3 基于社交网络的推荐2.4 推荐算法2.5 给用户推荐好友目录 1.利用上下文信息 1.1时间上下文 用户的兴趣是随着时间变化的&#xff0c;三天打鱼两天晒网…

动态规划的深入探讨

一、引言 动态规划是一种重要的程序设计思想&#xff0c;具有广泛的应用价值。使用动态规划思想来设计算法&#xff0c;对于不少问题往往具有高时效&#xff0c;因而&#xff0c;对于能够使用动态规划思想来解决的问题&#xff0c;使用动态规划是比较明智的选择。 能够用动态规…

Python(7)-程序执行的原理

程序执行的原理1.计算机中的三个核心部件2.程序执行的原理3.程序的作用1.计算机中的三个核心部件 CPU&#xff1a;中央处理区&#xff0c;超大规模的集成电路&#xff0c;负责处理数据、计算 内存&#xff1a;临时存储数据&#xff0c;断电数据消失&#xff0c;读取数据快 硬盘…

推荐系统读书笔记(推荐系统实战)

随着信息技术和互联网的发展&#xff0c;人们逐渐从信息匮乏的时代走入了信息过载的时代。在这个时代&#xff0c;无论是信息消费者还是信息生产者都遇到很大的挑战&#xff1b;对于消费者&#xff0c;从大量信息中找到自己感兴趣的信息是一件非常困难的事情&#xff1b;对于信…

橙白oj 2017级《算法分析与设计》-练习02

注&#xff1a;A题我以为给新生出的&#xff0c;应该贼简单&#xff0c;是按顺序消灭&#xff0c;卡了十几分钟&#xff0c;成了最后一个ac的题&#xff0c;真是菜的真实。 Problem A: Description 白细胞是人体与疾病斗争的“卫士”。当病菌侵入人体体内时&#xff0c;白细胞…

python(9)-变量、input函数

变量、input函数1.变量的定义(不可变对象)2.变量的类型3.变量的命名规范4. 不同类型的数据计算5.类型转换函数6.input()7.Tips程序是用来处理数据的&#xff0c;而变量是用来存储数据的。 关于函数&#xff0c;是一个提前准备好的代码&#xff1b;可以直接使用&#xff0c;不用…

推荐算法--总结(08)

一、推荐系统结构二、推荐引擎算法&#xff08;Algorithm&#xff09;1、协同过滤推荐算法1.1 关系矩阵与矩阵计算1.1.1 用户与用户&#xff08;U-U矩阵&#xff09;1.1.2 物品与物品&#xff08;V-V矩阵&#xff09;1.1.3 用户与物品&#xff08;U-V矩阵&#xff09;1.1.4 奇异…

算法总结-1算法入门

1.0 前言 算法&#xff08;Algorithm&#xff09;是指解题方案的准确而完整的描述&#xff0c;是一系列解决问题的清晰指令&#xff0c;算法代表着用系统的方法描述解决问题的策略机制。也就是说&#xff0c;能够对一定规范的输入&#xff0c;在有限时间内获得所要求的输出。 …

Python(10)- 格式化输出%

格式化输出1. 格式化输出浮点数2. 格式化输出整数3. 格式化输出浮点数4. 格式化输出百分号%变量的格式化输出&#xff1a;input函数将信息输出到控制台&#xff0c;实现变量和文字一起输出。 %格式化操作符&#xff0c;和不同的字符连用&#xff0c;%s 字符串&#xff0c;%d 十…

FM系列算法解读(FM+FFM+DeepFM)

在计算广告中&#xff0c;CTR是非常重要的一环。对于特征组合来说&#xff0c;业界通用的做法主要有两大类&#xff1a;FM系列和Tree系列。这里我们来介绍一下FM系列。   在传统的线性模型中&#xff0c;每个特征都是独立的&#xff0c;如果需要考虑特征与特征之间的相互作用…

二叉树层序遍历

层序遍历序列为&#xff1a;ABCDEFG 思路&#xff1a;栈是先进后出的数据结构&#xff0c;而队列是先进先出的数据结构。 我们层序遍历&#xff0c;很明显&#xff0c;先遇到的节点先打印&#xff0c;不同于前中后序遍历&#xff0c;我们采用队列结构。 具体执行过程如下&…

深度学习(01)-- 基础学习

文章目录目录1. 深度学习基础1.1 深度学习总览1.2 深度网络训练过程1.2.1 传统神经网络的训练方法为什么不能用在深度神经网络1.2.2 deep learning训练过程1.3 数学知识&#xff1a;2. 九种深度学习模型2.1 受限玻尔兹曼机RBM2.2 自编码器AE&#xff08;降维&#xff09;2.3 深…