jedis jedispool Redistemplate

jedis jedispool Redistemplate

整理了之前学习 redis 的笔记,强烈建议看最后总结。

在大型系统数据读请求中,基本上90%都可以通过分布式缓存集群来抗下来,而 Redis 又是分布式缓存集群的主要践行者,因此了解 Redis 是必不可少的技能。

在 javaWeb 中实现对 Redis 的操作,主要有两种方式:Jedis、RedisTemplate。

1、什么是 Jedis?什么是 RedisTemplate?

Jedis 是 Redis 官方推荐的面向 Java 的操作Redis 的客户端,通过jedis我们可以实现连接Redis,以及操作 Redis 。

RedisTemplate 是 SpringDataRedis 中对JedisAp i的高度封装。SpringDataRedis 相对于 Jedis 来说可以方便地更换 Redis 的 Java客户端,比 Jedis 多了自动管理连接池的特性,方便与其他 Spring 框架进行搭配使用如:SpringCache

2、Jedis 的使用(了解)

就像在学习 springmvc 框架之前学习 servlet 一样,了解 jedis 的使用,看一下单机中 Jedis 的使用,首先要导入相关架包,
jedis.jar

import redis.clients.jedis.Jedis;

public class RedisJava {
    public static void main(String[] args{
        //连接本地的 Redis 服务
        Jedis jedis = new Jedis("localhost");
        System.out.println("连接成功");
        //查看服务是否运行
        System.out.println("服务正在运行: "+jedis.ping());
    }
}

编译以上 Java 程序,确保驱动包的路径是正确的,打印如下:

连接成功
服务正在运行: PONG

redis 中最主要的就是读写数据。Redis 操作5大基本类型:String、List、Hash、Set、SortedSe。t
菜鸟教程中关于 Redis 操作 String 、List 等:http://www.runoob.com/redis/redis-java.html

3、连接池 JedisPool,为什么要用 JedisPool

首先我们如果每次使用缓存都生成一个 Jedis 对象的话,这样意味着会建立很多 socket 连接,造成系统资源被不可控调用,甚至会导致奇怪错误的发生。

如果使用单例模式,在线程安全模式下适应不了高并发的需求,非线程安全模式又可能会出现与时间相关的错误。

因此,为了避免这些问题,引入了池的概念 JedisPool。JedissPool 是一个线程安全的网络连接池,我们可以通过 JedisPool 创建和管理 Jedis 实例,这样可以有效的解决以上问题以实现系统的高性能。

我们可以理解成项目中的数据库连接池,例如:阿里巴巴的 druid~

直连和使用连接池的对比
 优点缺点
直连简单方便适用于少量长期连接的场景存在每次新建/关闭TCP开销,资源无法控制,存在连接泄露的可能,Jedis对象线程不安全
连接池Jedis预先生成,降低开销,连接池的形式保护和控制资源的使用相对于直连,使用相对麻烦,尤其在资源管理上需要很多参数来保证,一旦规划不合理也会出现问题。

4、如何创建 JedisPool 实例和 Jedis 实例对象

private static JedisPool pool = null;

if( pool == null ){
    JedisPoolConfig config = new JedisPoolConfig();
    控制一个pool可分配多少个jedis实例,通过pool.getResource()来获取;
    如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。
    config.setMaxTotal(50); 
    控制一个pool最多有多少个状态为idle(空闲的)的jedis实例。
    config.setMaxIdle(5);
    表示当borrow(引入)一个jedis实例时,最大的等待时间,如果超过等待时间,则直接抛出JedisConnectionException;单位毫秒
    小于零:阻塞不确定的时间,  默认-1
    config.setMaxWaitMillis(1000*100);
    在borrow(引入)一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;
    config.setTestOnBorrow(true);
    return 一个jedis实例给pool时,是否检查连接可用性(ping())
    config.setTestOnReturn(true);
    connectionTimeout 连接超时(默认2000ms)
    soTimeout 响应超时(默认2000ms)
}

获取实例
public static Jedis getJedis() {
    return pool.getResource();
}

释放 redis
public static void returnResource(Jedis jedis
{
    if(jedis != null) {
        jedis.close();
    }
}

5、JedisPool 属性配置(JedisPoolConfig)

JedisPool的配置参数大部分是由JedisPoolConfig的对应项来赋值的。

6、再回头看 RedisTemplate

6.1、关于 RedisTemplate

通过最开始的简单概述,我们了解到 SpringDataRedis(RedisTemplate) 相对于 Jedis 来说可以方便地更换 Redis 的 Java 客户端,比 Jedis 多了自动管理连接池的特性,方便与其他 Spring 框架进行搭配使用如:SpringCache;

或者可以理解成,redisTemplate 是对 Jedis 的对 redis 操作的扩展,有更多的操作, 封装使操作更便捷。

6.2、如何使用 RedisTemplate

首先说一下,序列化,因为 redis 存储的数据必须要经过序列化处理。

那么你要知道 SDK 默认采用的序列化策略有两种,一种是 String 的序列化策略,一种是 JDK 的序列化策略。

在说如何使用之前再引申出来个 StringRedisTemplate….

6.3、StringRedisTemplate 和 RedisTemplate 区别

通过上边我们清楚了 RedisTemplate ,但是这个 StringRedisTemplate 又是个啥呢?

其实作用是一样的? what???

其实他们两者之间的区别主要在于他们使用的序列化类。

RedisTemplate 使用的是 JdkSerializationRedisSerializer (JDK 序列化)
StringRedisTemplate 使用的是 StringRedisSerializer(String 序列化)

6.4、Redis 序列化:(String 序列化,JDK 序列化)

RedisTemplate :

RedisTemplate 使用的序列类在在操作数据的时候,比如说存入数据会将数据先序列化成字节数组,然后在存入 Redis 数据库,这个时候打开 Redis 查看的时候,你会看到你的数据不是以可读的形式展现的,而是以字节数组显示,类似下面:


当然从Redis获取数据的时候也会默认将数据当做字节数组转化,这样就会导致一个问题,当需要获取的数据不是以字节数组存在 redis 当中而是正常的可读的字符串的时候,比如说下面这种形式的数据:

RedisTemplate就无法获取导数据,这个时候获取到的值就是NULL。这个时候StringRedisTempate就派上了用场。

 

StringRedisTemplate
当Redis当中的数据值是以可读的形式显示出来的时候,只能使用StringRedisTemplate才能获取到里面的数据。
所以当你使用RedisTemplate获取不到数据的时候请检查一下是不是Redis里面的数据是可读形式而非字节数组。

序列化总结
当你的 redis 数据库里面本来存的是字符串数据或者你要存取的数据就是字符串类型数据的时候,那么你就使用 StringRedisTemplate 即可,但是如果你的数据是复杂的对象类型,而取出的时候又不想做任何的数据转换,直接从 Redis 里面取出一个对象,那么使用RedisTemplate 是更好的选择。

7、本文总结

不太喜欢写长篇文章,总感觉太长的篇幅自己都不喜欢看下去,所以就此总结一下,实战就放下一篇吧。

Jedis 是 Redis 官方推荐的面向 Java 操作 Redis 的客户端,但在项目中使用 Jedis jedis = new Jedis("xxx"); 的操作有失大雅,就好比还在用 servlet…,同时用 JedisPool 来获得连接进行 get、set、del 等操作也相对简单,但是需要注意的是,存入 Redis 是需要序列化的,至于选择哪种序列化需要自己抉择;

再说到 RedisTemplate,Spring 针对 Redis 的使用,封装了一个比较强大的 Template ,在没有这个 Template 之前,是使用 Jedis 直连进行相应的交互操作,值得一提的是,做这个封装的是 SpringData,简单了解一下 SpringData:

Spring Data: Spring 的一个子项目。用于简化数据库访问,支持NoSQL和关系数据库存储。其主要目标是使数据库的访问变得方便快捷。

Spring Data 项目所支持 NoSQL 存储:

  - - MongoDB(文档数据库)
  - - Neo4j (图形数据库)
  - - Redis(键/值存储)
  - - Hbase(列族数据库)

Spring Data 项目所支持的关系数据存储技术:

   - - JDBC
   - - JPA

从之前了解的 SpringDataJpa,我们不难想象,RedisTemplate 的使用也一定是非常简单的,下一篇看一下项目中的应用。

最后:来都来了,左上角不关注一下吗。

如果文章有错的地方欢迎指正,大家互相留言交流。习惯在微信看技术文章,想要获取更多的Java资源的同学,可以关注微信公众号:niceyoo

posted @ 2019-05-07 16:45 niceyoo 阅读(...) 评论(...) 编辑 收藏

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

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

相关文章

支付宝支付提示 4006 ISV权限不足,建议在开发者中心检查签约是否已经生效

解决方法非常简单: 1、首先登录支付宝商家中心:https://b.alipay.com/index.htm 查看产品中心,对应功能有木有开通,或者签约开通 2、登录支付宝开放平台:https://open.alipay.com/platform/home.htm 查看应用功能列…

android 自定义相机,Camera,相机遮罩层

实现效果: 实现方法:一个自定义view实现demo 一、自定义相机Camera,无API版本限制 (1)。实现接口 implements SurfaceHolder.Callback private SurfaceView mView;private Camera mCamera; private int cameraId 0;/…

RedisTemplate在项目中的应用

RedisTemplate在项目中的应用 如下主要通去年无聊做的 "涂涂影院后台管理系统" 一个 demo,看 RedisTemplate 的使用。 主要用到地方:视频首页轮播图的获取,以及搜索检索界面,如下图所示: 由于是非maven非sp…

Android 蓝牙开发,搜索蓝牙列表,蓝牙连接,蓝牙通讯

申请打开蓝牙 <!-- 蓝牙权限 --> <uses-permission android:name"android.permission.BLUETOOTH" /> <uses-permission android:name"android.permission.BLUETOOTH_ADMIN" />private final int BLUE_REQUEST_CODE 551; public void s…

jeecg uedit 自定义图片上传路径

jeecg uedit 图片上传配置自定义物理路径&#xff0c;简单描述&#xff1a;我们知道 jeecg 中使用的 uedit 默认图片上传路径为 “当前项目\plug-in\ueditor\jsp\uploadx\日期\图片.png”&#xff0c;但是把图片放在项目中显然是很不友好的&#xff0c;所以我们自定义上传路径。…

了解一下Elasticsearch的基本概念

了解一下Elasticsearch的基本概念 一、前文介绍 Elasticsearch&#xff08;简称ES&#xff09;是一个基于Apache Lucene(TM)的开源搜索引擎&#xff0c;无论在开源还是专有领域&#xff0c;Lucene 可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。注意&#x…

简单的对象定位与登录实例的简单操作

①元素对应的定位方法&#xff1a; ②登录实例&#xff08;暂不考虑验证环节&#xff09; 注意&#xff1a;在实践过程中出现过&#xff0c;密码输入之后又被清空的情况&#xff0c;应该是被处理过&#xff0c;换个别的简单的登录界面试下看看如果没有出现前面所说的情况&#…

百度OCR文字识别API使用心得 com.baidu.ocr.sdk.exception.SDKError[283604]

百度OCR文字识别API使用心得 com.baidu.ocr.sdk.exception.SDKError[283604] 本文转载自好基友upuptop&#xff1a;https://blog.csdn.net/pyfysf/article/details/77455330 效果图&#xff1a; 如下为文章正文&#xff1a; 最近有个小项目使用到了OCR技术&#xff0c;顺便到网…

Android studio ERROR: Software caused connection abort: recv failed 解决方法

使用Android studio打开kotlin项目时报错&#xff1a;ERROR: Software caused connection abort: recv failed 解决方法&#xff1a;修改三个文件即可 1、修改gradle-wrapper.properties 修改为当前Android studio的gradle版本 2、修改项目build.gradle 修改为当前Android st…

Android获取手机联系人或通讯录的基本信息(如姓名、电话)

1、添加权限 <uses-permission android:name"android.permission.READ_CONTACTS"/> <uses-permission android:name"android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name"android.permission.READ_EXTERNAL…

百度OCR文字识别-Android安全校验

百度OCR文字识别-Android安全校验 本文转载自好基友upuptop&#xff1a;https://blog.csdn.net/pyfysf/article/details/86438769 效果图&#xff1a; 如下为文章正文&#xff1a; 百度OCR接口使用总结&#xff1a;之前总结一下关于百度OCR文字识别接口的使用步骤&#xff08;…

Android vector矢量图应用实例

在drawable文件夹下创建vector.xml文件 <?xml version"1.0" encoding"utf-8"?> <vector xmlns:android"http://schemas.android.com/apk/res/android"android:height"64dp"android:width"64dp"android:viewpo…

Lint found fatal errors while assembling a release target

在打包APK时报错&#xff1a;Lint found fatal errors while assembling a release target Android在debug模式下应用没有问题&#xff0c;但是在打包release版本时出现一下问题&#xff1a; 解决方法&#xff1a; 1、打开app下build文件夹下reports文件夹下的lint-results-rel…

自定义注解-aop实现日志记录

关于注解&#xff0c;平时接触的可不少&#xff0c;像是 Controller、Service、Autowried 等等&#xff0c;不知道你是否有过这种疑惑&#xff0c;使用 Service 注解的类成为我们的业务类&#xff0c;使用 Controller 注解的类就成了请求的控制器&#xff0c;使用 Autowried 注…

JPA EnableJpaAuditing 审计功能

关于自动填充或更新实体中的 CreateDate、CreatedBy 等在之前有一篇 jeecg 默认为空的字段值是如何被填充的? 有提到通过拦截器的方式实现&#xff0c;但是今天带大家了解一下如果使用 JPA 的审计功能是如何简单实现该操作的。 JPA Audit 说明 在 Spring JPA 中&#xff0c;支…

前端学习(2789):改进导航栏并跳转

第一步:动态数据 第二步 页面渲染