zoukankan      html  css  js  c++  java
  • 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"+"
    ")
                    .append("$3"+"
    ").append("SET"+"
    ")
                    .append("$"+key.getBytes().length+"
    ").append(key+"
    ")
                    .append("$"+value.getBytes().length+"
    ").append(value+"
    ");
            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"+"
    ")
                    .append("$3"+"
    ").append("get"+"
    ")
                    .append("$"+key.getBytes().length+"
    ").append(key+"
    ");
            //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"+"
    ")
                    .append("$3"+"
    ").append("del"+"
    ")
                    .append("$"+key.getBytes().length+"
    ").append(key+"
    ");
            //1. 将命令传递到redis
            OutputStream outputStream = socket.getOutputStream();
            outputStream.write(stringBuffer.toString().getBytes());
            outputStream.flush();
        }
    
    }
    
     

    三.运行结果

     

  • 相关阅读:
    linux卸载mysql,apache,php
    iOS 秒数转换成时间,时,分,秒
    iOS 正则表达式判断邮箱、身份证..是否正确
    ios 删除系统从相册压缩的视频
    iOS 视频选择压缩
    iOS 从相册中拿到 图片名 ,截取后缀,图片名
    ios 根据颜色生成图片,十六进制颜色。
    ios 友盟第三方登录遇到的各种坑。
    项目适配iOS9遇到的一些问题及解决办法 ,以及URL 白名单配置方法
    ios 设置head请求头,自定义head, read response header
  • 原文地址:https://www.cnblogs.com/aihuadung/p/11604938.html
Copyright © 2011-2022 走看看