SSM中操作Redis—Jedis

1、Jedis

  • jedis是基于java的redis客户端,集成了redis的命令操作,提供了连接池管理
  • jedis的方法就是redis的命令

2、导入依赖


    redis.clients
    jedis
    2.9.0

    junit
    junit
    4.12

    org.projectlombok
    lombok
    1.18.12
    provided

3、简单使用

@Test
public void quickTest() throws Exception {
    // 参数一:redis服务器ip
    // 参数二:redis服务器的端口号
    Jedis jedis = new Jedis("192.168.27.132", 6379);
    String name = jedis.set("name", "zhangsan");
    System.out.println("name = " + name);
    String value = jedis.get("name");
    System.out.println("value = " + value);
}

4、连接池使用

@Test
public void JedisPoolTestDemo() {
    GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
    String host = "192.168.27.132";
    int port = 6379;
    int timeout = 5000;
    //产生连接池对象
    JedisPool jedisPool = new JedisPool(poolConfig, host, port, timeout);
    Jedis jedis = jedisPool.getResource();
    jedis.set("name","张三");
    jedis.set("name1","张三1");
    jedis.set("name2","张三2");
    jedis.hset("person","name","李四");
    jedis.hset("person","name1","李四1");
    jedis.hset("person","name2","李四2");

    System.out.println(jedis.get("name"));
    System.out.println(jedis.get("name1"));
    System.out.println(jedis.get("name2"));
    Map person = jedis.hgetAll("person");
    System.out.println("person = " + person);
    //关闭后归还到连接池
    jedis.close();
}

5、工具类封装连接池

public class JedisPoolUtils {
    private  static JedisPool jedisPool = null;

    private static final String HOST = "192.168.27.132";
    private static final int PORT = 6379;
    private static final int TIMEOUT = 3000;
    static {
        GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
        jedisPool = new JedisPool(poolConfig,HOST,PORT,TIMEOUT);
    }

    public static Jedis getResource() {
        return jedisPool.getResource();
    }
}

6、连接池工具类使用

Jedis jedis = JedisPoolUtils.getResource(); //在连接池中获取jedis连接对象
String name = jedis.get("name");
System.out.println("name = " + name);
jedis.close();//关闭并归还连接

7、Jedis保存一个对象

  • 可以通过json保存
  • 也可以通过字节存储

思路:将创建好的对象转成json格式字符串,存储到redis中

//创建对象
Device device = new Device();
device.setId(1);
device.setDeviceName("挖掘机");
device.setPrice(30000D);

//json转换
ObjectMapper objectMapper = new ObjectMapper();
String json = objectMapper.writeValueAsString(device);

//获取jedis对象
Jedis jedis = JedisPoolUtils.getResource();
//存储对象
jedis.set("device:" + device.getId(), json);

String deviceString = jedis.get("device:" + device.getId());
System.out.println("deviceString = " + deviceString);
//归还连接到连接池
jedis.close();

思路:

  • 将创建好的对象序列化为字节数组,存储到redis中
  • 从redis中获取字节数组,并将字节数组反序列化为对象
//创建对象
Device device = new Device();
device.setId(1);
device.setDeviceName("挖掘机");
device.setPrice(30000D);
//获取jedis对象
Jedis jedis = JedisPoolUtils.getResource();
//对象转换为字节数组,使用SerializationUtils的serialize()方法
byte[] key = ("device:" + device.getId()).getBytes();
byte[] value = SerializationUtils.serialize(device);

//存储字节
jedis.set(key, value);

//获取key对应的value
byte[] bytes = jedis.get(key);

//SerializationUtils的deserialize()方法 将字节转为对象
Device device1 = (Device) SerializationUtils.deserialize(bytes);
System.out.println(device1);

//归还连接到连接池
jedis.close();

8、Jedis管道操作

当我们有10000条数据要存储到redis中,使用原始方式存:

@Test
public void tenThousandTest(){
    Jedis jedis = JedisPoolUtils.getResource();
    long start = System.currentTimeMillis();
    for (int i = 0; i < 10000; i++) {
        jedis.set("i:"+i,"v:"+i);
    }
    System.out.println(System.currentTimeMillis()-start);//大概4秒
    jedis.close();
}

当执行完之后得到时间差,发现用时大概4秒。

使用过查看redis性能命令的小伙伴会发现读写的性能能达到100000次/s
据官方的bench-mark数据:读的速度是110000次/s,写的速度是81000次/s

#redis写的性能
redis-benchmark set

#redis读的性能
redis-benchmark get

其实不然,我们仔细想一下,我们的jedis程序和redis服务器是在不同服务器上,
那Jedis的数据要保存到redis中就要通过网络传输
对于上面代码而言,每写一个就要传一个到redis中,一共要发送10000次,这之间消耗的时间是比较久的,也就对代码执行完之后计算得出的时间产生了影响。

  • 其实redis的读写性能是ok的,其瓶颈在于传输性能上。

有,Jedis提供了一个pipelined(),也就是管道操作,我们来看升级后的代码

@Test
public void test(){
    Jedis jedis = JedisPoolUtils.getResource();
    Long start = System.currentTimeMillis();
    Pipeline pipelined = jedis.pipelined();
    for (int i = 0; i < 10000; i++) {
        pipelined.set("k:"+i,"v:"+i);
    }
    System.out.println(System.currentTimeMillis()-start);//55毫秒
    jedis.close();
}

最后测试发现执行几乎瞬间完成,用时55毫秒,比4秒提升了70多倍。

它将所有操作都打包,一次性发给redis服务器,由原先一万次的传输变为一次传输,大大提高了传输性能,节省了时间。
而redis接收到之后做一万次写入,一万次写入对于redis来说小菜一碟。

Original: https://www.cnblogs.com/lzy-blogs/p/16406948.html
Author: lzy96158
Title: SSM中操作Redis—Jedis

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/588536/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 三,手写SpringMVC框架,第三次改进

    1 . 解决跳转问题:添加一个 login 方法,跳转返回一个字符串。 中央控制器DispacherServlet 调用EmpController ,所以字符串返回给中央控制器。如…

    Java 2023年6月16日
    075
  • BAT经典面试题之redis的热KEY问题怎么解决

    讲了几天的数据库系列的文章,大家一定看烦了,其实还没讲完。。。(以下省略一万字)。今天我们换换口味,来写redis方面的内容,谈谈热key问题如何解决。其实热key问题说来也很简单…

    Java 2023年6月15日
    080
  • 我的第一篇博客-Markdown基本语法

    博客园 :当前访问的博文已被密码保护 请输入阅读密码: Original: https://www.cnblogs.com/lihui-qianying/p/lihui.htmlA…

    Java 2023年6月14日
    095
  • C++基础-异常处理

    C++异常处理(较浅) 基本概念 异常处理,是编程语言或计算机硬件里的一种机制,用于处理软件或信息系统中出现异常的情况,保证程序运行的稳定性和健壮性,防止程序崩溃。但是过渡使用会影…

    Java 2023年6月5日
    073
  • docker+nginx+redis部署前后端分离项目!!!

    介绍本文用的经典的前后端分离开源项目、项目的拉取这些在另一篇博客!!! 其中所需要的前后端打包本篇就不做操作了!!不明白的去看另一篇博客!!! 地址:http://www.cnbl…

    Java 2023年6月9日
    0103
  • 拒绝蛮力,高效查看Linux日志文件!

    原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处。 简介 日常分析问题时,会频繁地查看分析日志,但如果蛮力去查看日志,耗时费力还不一定有效果,因此我总结…

    Java 2023年6月7日
    0109
  • 博客园文件下载并转成Markdown格式

    博客园的随笔分类来建立文件夹并下载相应的随笔原稿件,文章格式为md格式,同时支持离线文章中引用的图片。 如果文件是HTML格式的,可以自动将HTML文章自动解析为Markdown(…

    Java 2023年5月30日
    0121
  • flowable整合springboot

    地址:http://www.blackzs.com/archives/1523 此博客只是为了记忆相关知识点,大部分为网络上的文章,在此向各个文章的作者表示感谢! Original…

    Java 2023年5月29日
    062
  • 线程

    1、并发和并行 (1)并发:一个时间段有多个程序处于已启动运行到运行完毕之间,同一处理机上进行,会发生抢占,按一定的策略轮流进行。 (2)并行:有多个CPU,一个CPU执行一个进程…

    Java 2023年6月5日
    093
  • SpringBoot 整合Swagger2 踩坑记录

    SpringBoot 整合Swagger2 踩坑记录 Failed to start bean ‘documentationPluginsBootstrapper&#8…

    Java 2023年6月5日
    096
  • 如何用阿里云ECS搭建网站

    欢迎访问我的押韵精灵,是一个在线查询押韵的诗、词、歌、字的工具网站,包含双押多押等。 本文记录下如何在阿里云上搭建该网站。 选型 现在利用云计算的能力,个人或者小型企业都能快速的搭…

    Java 2023年6月5日
    080
  • 自己动手实现一个阻塞队列

    阻塞队列介绍 顾名思义,阻塞队列是一个具备先进先出特性的队列结构,从队列末尾插入数据,从队列头部取出数据。而阻塞队列与普通队列的最大不同在于阻塞队列提供了阻塞式的同步插入、取出数据…

    Java 2023年6月8日
    074
  • redis数据结构介绍和redis命令操作_string&hash

    redis存储的是:key,value格式的数据,其中key都是字符串,value有物种不同的数据结构 value的数据结构: 字符串类型 string 哈希类型 hash :ma…

    Java 2023年6月6日
    075
  • 加深对AQS原理的理解示例一:实现一个独占锁

    基于AQS语法自己定义的独占锁 只是一个简单的版本,非常粗糙,只为了加深对AQS原理理解。但还有一些列问题有待解决,比如锁的重入,锁不允许被其他线程中断等! /** *@Desc …

    Java 2023年6月15日
    081
  • ExceptionHandler配合RestControllerAdvice全局处理异常

    Java全局处理异常 引言 对于controller中的代码,为了保证其稳定性,我们总会对每一个controller中的代码进行try-catch,但是由于接口太多,try-cat…

    Java 2023年6月8日
    084
  • ssm中获取request

    ServletRequestAttributes 和 RequestContextHolder 使用ssm自带类进行获取request ServletRequestAttribut…

    Java 2023年6月9日
    089
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球