redis 模拟jedis 操作string类型数据
一.思路分析
redis数据传输遵循resp协议,只需要按照resp协议并通过socket传递数据到redis服务器即可
resp数据格式:

二.具体实现
package com.ahd.jedis; import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket; /***
* 模拟jedis对redis进行操作
*/
public class MyJedis {
private Socket socket; public MyJedis(String url,Integer port) throws IOException {
socket=new Socket(url,port);
} public static void main(String[] args) throws IOException {
MyJedis myJedis=new MyJedis("127.0.0.1",6379); //myJedis.set("sex","sdf");
//myJedis.get("sex");
myJedis.del("sex");
} /***
* 模拟set string类型
* @param key
* @param value
*/
public void set(String key,String value) throws IOException {
StringBuffer stringBuffer=new StringBuffer();
//getBytes 是因为key和value可能是中文,直接获取长度会出错
stringBuffer.append("*3"+"\r\n")
.append("$3"+"\r\n").append("SET"+"\r\n")
.append("$"+key.getBytes().length+"\r\n").append(key+"\r\n")
.append("$"+value.getBytes().length+"\r\n").append(value+"\r\n");
OutputStream outputStream = socket.getOutputStream(); System.out.println(stringBuffer);
outputStream.write(stringBuffer.toString().getBytes()); } /***
* 模拟get String
* @param key
* @return
*/
public String get(String key) throws IOException {
StringBuffer stringBuffer=new StringBuffer();
//getBytes 是因为key和value可能是中文,直接获取长度会出错
stringBuffer.append("*2"+"\r\n")
.append("$3"+"\r\n").append("get"+"\r\n")
.append("$"+key.getBytes().length+"\r\n").append(key+"\r\n");
//1. 将命令传递到redis
OutputStream outputStream = socket.getOutputStream();
outputStream.write(stringBuffer.toString().getBytes()); //2. 接收redis的响应结果
InputStream inputStream = socket.getInputStream();
byte[] b=new byte[2048];
inputStream.read(b); return new String(b);
} /***
* 指定key 删除
* @param key
* @return
* @throws IOException
*/
public void del(String key) throws IOException {
StringBuffer stringBuffer=new StringBuffer();
//getBytes 是因为key和value可能是中文,直接获取长度会出错
stringBuffer.append("*2"+"\r\n")
.append("$3"+"\r\n").append("del"+"\r\n")
.append("$"+key.getBytes().length+"\r\n").append(key+"\r\n");
//1. 将命令传递到redis
OutputStream outputStream = socket.getOutputStream();
outputStream.write(stringBuffer.toString().getBytes());
outputStream.flush();
} }
三.运行结果

redis 模拟jedis 操作string类型数据的更多相关文章
- [置顶] Redis String类型数据常用的16条命令总结
Redis String类型数据常用的16条命令总结 描述:String 类型是最简单的类型,一个Key对应一个Value,String类型是二进制安全的.Redis的String可以包含任何数据,比 ...
- ***Redis hash是一个string类型的field和value的映射表.它的添加、删除操作都是O(1)(平均)。hash特别适合用于存储对象
http://redis.readthedocs.org/en/latest/hash/hset.html HSET HSET key field value (存一个对象的时候key存) 将哈希 ...
- Redis hash 是一个 string 类型的 field 和 value 的映射表.它的添加、删除操作都是 O(1)(平均)。
2.3 hashes 类型及操作 Redis hash 是一个 string 类型的 field 和 value 的映射表.它的添加.删除操作都是 O(1)(平均).hash 特别适合用于存储对象.相 ...
- C#操作json类型数据
将对象序列化为 JavaScript 对象表示法 (JSON),并将 JSON 数据反序列化为对象. 此类不能继承. // msdn 例子: namespace SL_DataContractJson ...
- Java String类型数据的字节长度
问题描述: 向Oracle数据库中一varchar2(64)类型字段中插入一条String类型数据,程序使用String.length()来进行数据的长度校验,如果数据是纯英文,没有问题,但是如果数据 ...
- tablib.Dataset()操作exl类型数据之“类方法”研究
#tablib.Dataset()操作exl类型数据之“类方法”研究 import tablib #初始化 data=tablib.Dataset() #设置列标题 data.headers=('na ...
- [redis] redis 对string类型数据操作
package com.xwolf.java.redis; import org.junit.Before; import org.junit.Test; import redis.clients.j ...
- redis 的使用 (基础, key操作, string类型操作)
使用redis set 类型: 没有重复元素 list 链表类型 有重复累型 sort set 类型 没有重复元素 1.1 存储数据 读取数据 // 数据储存在 内存中 set name laowen ...
- 使用Jedis操作Redis-使用Java语言在客户端操作---String类型
前提:需要引入Jedis的jar包. /** * 我的redis在Linux虚拟机Centos7中,192.168.222.129是我虚拟机的ip地址. */ private static Jedis ...
随机推荐
- vue-cli构建一个工程
使用前,必须要先按照 node:安装node Vue CLI官方文档:https://cli.vuejs.org/zh/ 安装node地址:https://nodejs.org/zh-cn/downl ...
- jsp里面自定义标签常量详解
标签中静态常量: EVAL_BODY_INCLUDE:告诉服务器正文的内容,并把这些内容送入输出流 SKIP_BODY:告诉服务器不要处理正文内容 EVAL_PAGE:让服务器继续执行页面 SKIP_ ...
- JS箭头函数的this
箭头函数的this看定义他的时候,他的外层有没有函数 有:外层函数的this就是箭头函数的this 无:箭头函数的this就是window obj = {age:18, getAge: ()=> ...
- LeetCode 300. 最长上升子序列(Longest Increasing Subsequence)
题目描述 给出一个无序的整形数组,找到最长上升子序列的长度. 例如, 给出 [10, 9, 2, 5, 3, 7, 101, 18], 最长的上升子序列是 [2, 3, 7, 101],因此它的长度是 ...
- ruby_类的调用及require的使用
在文件arrayTest_1中,定义class Liuyang内容如下:(通过require File.expand_path('../arrayTest_2',__FILE__) 来包含其他文件的文 ...
- watir安装——windows环境
默认情况下,gem sources 都是https://rubygems.org/
- 过滤器修改response
过滤器通过doFilter方法的第二个参数ServletResponse将输出发送给客户,但servletResponse参数没有为过滤器提供servlet或jsp页面的访问:执行doFilter方法 ...
- [论文理解] Receptive Field Block Net for Accurate and Fast Object Detection
Receptive Field Block Net for Accurate and Fast Object Detection 简介 本文在SSD基础上提出了RFB Module,利用神经科学的先验 ...
- DB2日常管理
执行时间最长的10条SQL语句(按时间降序排列),可保存为脚本方便调用:db2 "SELECT rows_read / (num_executions + 1) as avg_rows_re ...
- T83310 【音乐会】二重变革
T83310 [音乐会]二重变革 题解 你看数据那么大,又是一道数学题 题面描述这么个代码肯定不能傻fufu的直接把代码提交上去 我批评我自己 观察代码当中有一行 也就是说明最后这个数列都将变成同一个 ...