这个项目有哪些参考的资料啊?
本帖最后由 TekkenSteve 于 2023-3-5 12:46 编辑项目介绍(场景描述):
小爪最近非常的恼火,因为他发现他写的程序在关闭之后,输入进去的数据全都不见了,所以小爪想,要是我有个服务来存储这些数据就好了。首先小爪去学了io流,将数据全部写进文件里,虽然存是存下来了,但是这些数据是无序的,无法得知某一个数据究竟是干什么的,这让小爪更恼火了,白干。正好,小爪最近在学习数据结构这门课程。有一天,小爪在学习到哈希表的时候突然悟了,这种k-v结构好神奇,他应该可以帮助我解决无法标识数据存储问题。所以小爪给数据配了一个key,标识这个数据。但是仅仅标识一个数据还不够,有些数据是同一类型的,小爪又想了个法子,既然单独一个数据可以用一个key来标识,那一组相同类型的数据,也可以用一个key来标识。小爪很兴奋,又想了想,一个一个数据,就好像一个一个人一样,那也应该可以左进右进,左出右出,那我再封装一下,不就成队列(先进先出)和栈(后进先出)了吗?好家伙,意外之喜。但是小爪又蒙了,之前学过的集合框架全忘了,去哪找可以左进右进,左出右出的数据结构呢?你能帮帮小爪吗?
总结:本次考核要求,为小爪设计一个key-value数据库,并且利用java集合框架,完成以下要求。
涉及技术关键字:
1. I/O流
2. 集合框架
3. Java异常处理
4. 多线程
5. Socket编程
6. 字符串处理
功能要求:
(一) 基本内容及功能:
一、使用socket编程,手写一个服务端和一个客户端,开启一个服务端后再开启一个客户端,该服务端能对该客户端进行相应的内容响应
二、使用多线程,使得服务器可以同时对多个客户端进行响应
三、字符串类型(HashMap)
1. set 存储key - value型数据
例如:set name zs 存储key为 name value为zs的数据,返回1
https://thumbnail0.baidupcs.com/thumbnail/1c6222f58lcca8fc38a81d741d384302?fid=1103646782550-250528-802935115201838&time=1677988800&rt=sh&sign=FDTAER-DCb740ccc5511e5e8fedcff06b081203-wwN7wl8UMqa8g4XBzTZIkHqjkDY%3D&expires=8h&chkv=0&chkbd=0&chkpc=&dp-logid=320369497413217877&dp-callid=0&file_type=0&size=c1536_u864&quality=90&vuk=-&ft=video&autopolicy=1
2. get 获取 key 对应的value
例如:get name 获取key为name 的value,返回value
https://thumbnail0.baidupcs.com/thumbnail/6878dc301kb5185ce3ff907b2cddb1fa?fid=1103646782550-250528-886714714672023&time=1677988800&rt=sh&sign=FDTAER-DCb740ccc5511e5e8fedcff06b081203-srBg6gyLp66C%2B8dO0H2MPh70zP4%3D&expires=8h&chkv=0&chkbd=0&chkpc=&dp-logid=320369497413217877&dp-callid=0&file_type=0&size=c1536_u864&quality=90&vuk=-&ft=video&autopolicy=1
3. del 删除 key 对应的value
例如:del name 删除key 与 key对应的value,返回1表示删除成功
https://thumbnail0.baidupcs.com/thumbnail/08ab080dcl271022035ea074df673382?fid=1103646782550-250528-300890477222294&time=1677988800&rt=sh&sign=FDTAER-DCb740ccc5511e5e8fedcff06b081203-%2FwW3RuIbLXW8oeyTHx3HMKi01GE%3D&expires=8h&chkv=0&chkbd=0&chkpc=&dp-logid=320369497413217877&dp-callid=0&file_type=0&size=c1536_u864&quality=90&vuk=-&ft=video&autopolicy=1
四、双向链表类型 (HashMap<String,LinkedList<String>>)
一个key对应一个双向链表,即可左右遍历,可以当栈,也可以当队列使用的数据结构
1. lpush 可直接放一个数据在左端
例如:lpush score 90,返回1表示插入成功
https://thumbnail0.baidupcs.com/thumbnail/1b40a3551rcc80244f8e770960ea9888?fid=1103646782550-250528-556266908142883&time=1677988800&rt=sh&sign=FDTAER-DCb740ccc5511e5e8fedcff06b081203-VgzFbaJZPIrN0nqRzlJuY8r143U%3D&expires=8h&chkv=0&chkbd=0&chkpc=&dp-logid=320369497413217877&dp-callid=0&file_type=0&size=c1536_u864&quality=90&vuk=-&ft=video&autopolicy=1
2. rpush 可直接放一个数据在右端
例如:rpush score 100,返回1表示插入成功
https://thumbnail0.baidupcs.com/thumbnail/338b3523cideafa89768deff54c3a4f7?fid=1103646782550-250528-73109587619412&time=1677988800&rt=sh&sign=FDTAER-DCb740ccc5511e5e8fedcff06b081203-6%2FVoe0KKWeU%2B6OnU1n9AR%2Fu0ExA%3D&expires=8h&chkv=0&chkbd=0&chkpc=&dp-logid=320369497413217877&dp-callid=0&file_type=0&size=c1536_u864&quality=90&vuk=-&ft=video&autopolicy=1
3. range 从左到右开始,将key 对应 start - end 位置的数据全部返回
https://thumbnail0.baidupcs.com/thumbnail/3a7c5691ek1daa8918f2600db7f34193?fid=1103646782550-250528-692445822003542&time=1677988800&rt=sh&sign=FDTAER-DCb740ccc5511e5e8fedcff06b081203-elAKwQxCibkHhypaqa%2BpfJLO3H8%3D&expires=8h&chkv=0&chkbd=0&chkpc=&dp-logid=320369497413217877&dp-callid=0&file_type=0&size=c1536_u864&quality=90&vuk=-&ft=video&autopolicy=1
例如:range score 0 1 返回0 与 1 位置上的数据(这里区间你们可以自己决定开闭,但是要注意,后续还有这种要区间的,要统一)
注意:这里的第一个位置的数是从右往左第一个数!!!
4. len 获取 key 存储数据的个数
例如:len score 返回 数字,表示key中数据的个数
https://thumbnail0.baidupcs.com/thumbnail/deb95a18fo8d54b06d8ad8c179a129c3?fid=1103646782550-250528-608361828419334&time=1677988800&rt=sh&sign=FDTAER-DCb740ccc5511e5e8fedcff06b081203-dp3WguZLnU707tA255CJa1wXWR4%3D&expires=8h&chkv=0&chkbd=0&chkpc=&dp-logid=320369497413217877&dp-callid=0&file_type=0&size=c1536_u864&quality=90&vuk=-&ft=video&autopolicy=1
5. lpop 获取key最左端的数据并删除
例如:lpop score 返回 1 表示删除成功 0 失败
https://thumbnail0.baidupcs.com/thumbnail/c1298cb2fq6c26ba69f00fadae17f0ff?fid=1103646782550-250528-878782016119022&time=1677988800&rt=sh&sign=FDTAER-DCb740ccc5511e5e8fedcff06b081203-gsL5MYqD1%2BOW4QL1LfLOFVlkI5g%3D&expires=8h&chkv=0&chkbd=0&chkpc=&dp-logid=320369497413217877&dp-callid=0&file_type=0&size=c1536_u864&quality=90&vuk=-&ft=video&autopolicy=1
6. rpop 获取key最右端的数据并删除
例如:rpop score 同上
https://thumbnail0.baidupcs.com/thumbnail/0c93bcceeq08a14e44999401e7a97a28?fid=1103646782550-250528-226193323210682&time=1677988800&rt=sh&sign=FDTAER-DCb740ccc5511e5e8fedcff06b081203-SUsfeg7aKNPZpJQB7sxj3%2FWNZJY%3D&expires=8h&chkv=0&chkbd=0&chkpc=&dp-logid=320369497413217877&dp-callid=0&file_type=0&size=c1536_u864&quality=90&vuk=-&ft=video&autopolicy=1
7. ldel 删除key 所有的数据
例如:ldel score 同上
https://thumbnail0.baidupcs.com/thumbnail/14b8a7e27n6cce6bee41e9653b74ace4?fid=1103646782550-250528-920725298683471&time=1677988800&rt=sh&sign=FDTAER-DCb740ccc5511e5e8fedcff06b081203-OhNO7Xxm5sH2bskRiZS6SF1Klgg%3D&expires=8h&chkv=0&chkbd=0&chkpc=&dp-logid=320369497413217877&dp-callid=0&file_type=0&size=c1536_u864&quality=90&vuk=-&ft=video&autopolicy=1
五、其它指令
1. 心跳指令:ping 响应 pong
例如:ping 返回 pong
https://thumbnail0.baidupcs.com/thumbnail/2f6574a79rbdfa1b32cb3a0d4b1a7e29?fid=1103646782550-250528-13021447673874&time=1677988800&rt=sh&sign=FDTAER-DCb740ccc5511e5e8fedcff06b081203-BeoQZAMQtoPREvpFz%2BcU5sFhJJ0%3D&expires=8h&chkv=0&chkbd=0&chkpc=&dp-logid=320369497413217877&dp-callid=0&file_type=0&size=c1536_u864&quality=90&vuk=-&ft=video&autopolicy=1
2. 实现单独一个help 获取所有command指令使用方式,以及help 获取单个command指令使用方式
例如:help set
返回 set
https://thumbnail0.baidupcs.com/thumbnail/837cc9395na6e312d835582bfa6852ed?fid=1103646782550-250528-478469826423190&time=1677988800&rt=sh&sign=FDTAER-DCb740ccc5511e5e8fedcff06b081203-BuCaME4u6uC%2FUKFSFmYwIMPnW5Q%3D&expires=8h&chkv=0&chkbd=0&chkpc=&dp-logid=320369497413217877&dp-callid=0&file_type=0&size=c1536_u864&quality=90&vuk=-&ft=video&autopolicy=1
例如:help
返回所有指令
https://thumbnail0.baidupcs.com/thumbnail/48c362306n266f6b6d7f2c554f94f221?fid=1103646782550-250528-906520184985985&time=1677988800&rt=sh&sign=FDTAER-DCb740ccc5511e5e8fedcff06b081203-VDc8QNBjgOLLAWq6%2FjnjA7AYqho%3D&expires=8h&chkv=0&chkbd=0&chkpc=&dp-logid=320369497413217877&dp-callid=0&file_type=0&size=c1536_u864&quality=90&vuk=-&ft=video&autopolicy=1
本帖最后由 TekkenSteve 于 2023-3-5 12:47 编辑
六、实现文件配置监听端口号
(二) 高级功能:
一、实现数据持久化,可以将产生的set指令与del指令写入文件。开启程序时读取。
二、实现日志文件,记录连接程序的ip以及程序运行时异常。
三、实现文件配置日志、数据持久化文件存储地址等等
四、哈希类型(HashMap<String,ArrayList<HashMap<String,String>>)
一个key 对应多个 key - value型数据,例如User1 username zs age 20
1. hset
例如:hset user1 name zs 存储key为 user1 中 field 为 name value 为zs 的数据
2. hget
例如:hget user1 name 获取 user1 中 name 字段的value
3. hdel key
例如:hdel user1 name 删除user1中name与其value值
例入:hdel user1 删除key 为 user1 中 所有的数据
考核建议
1. 请好好利用Java集合框架,里面的一些方法要熟练使用,如果不太了解,请先学习完集合框架再动手。
2. 请先思考好整体架构,不要盲目开始敲代码。
3. 文件存储可自定义格式存储,配置文件可用.property文件或者自定义文件格式存储,对于指令描述这种无需变更的数据,可直接存放在文件当中,启动服务器时读取文件即可。
4. 尽量不要在控制台爆红导致服务停止。
5. 每个指令都要有相应的响应值,比如说查无指令、不存在key时返回空、修改成功返回1等等,可自定义但必须要见值知意且在说明文档写出。
6. 各种数据结构请尽量不要嵌套使用,比如双向链表里嵌套双向链表等。
7. 在服务端的控制台可以打印相应的日志数据以便debug等。
8. 可以利用反射,类加载机制来优化项目,提高代码扩展性与简洁性。
其他要求
1. 客户端界面
不用很美观,有个输入>就好了
例如https://thumbnail0.baidupcs.com/thumbnail/6cd977bdam5ba9bf934576d5e048aaa9?fid=1103646782550-250528-838097639055291&time=1677988800&rt=sh&sign=FDTAER-DCb740ccc5511e5e8fedcff06b081203-zrax14X1ArZ7VsRbKhSRdMq3BdU%3D&expires=8h&chkv=0&chkbd=0&chkpc=&dp-logid=320369497413217877&dp-callid=0&file_type=0&size=c1536_u864&quality=90&vuk=-&ft=video&autopolicy=1 本帖最后由 TekkenSteve 于 2023-3-5 12:47 编辑
以上就是求助,不求大佬帮忙做,就希望能推荐一些视频,或者资料能比较好的解决这些问题。我自己回去学。。谢谢。最好能指条比较清晰的学习路线。万分感谢。 新鱼油发不了图片/gfi哈,可以放在百度网盘里给我们
页:
[1]