整理了之前学习 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

jedis jedispool Redistemplate的更多相关文章

  1. Java 使用Jedis和RedisTemplate操作Redis缓存(SpringBoot)

    package com.example.redis.controller; import com.example.redis.entity.User; import com.example.redis ...

  2. Consider defining a bean of type 'redis.clients.jedis.JedisPool' in your configuration.

    报错信息 原因是没有Jedispool没有注入 import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml ...

  3. Jedis/JedisPool和Redis数据类型与特性

    1.介绍Jedis Jedis 是 Redis 的 java 版本客户端,使用Jedis可以连接 Redis的数据库,Jedis连接方式有三种Jedis/JedisPool 连接.ShardedJed ...

  4. JedisPool异常Jedis链接处理

    问题现象(jedis-2.1.0.jar) 基于JedisPool管理Jedis对象,通过get方法获取值,出现key对应的value值错误,例如: K V a a b b Jedis.get(“a” ...

  5. jedis、jedisPool、jedisCluster的使用方法

    jedis 连接redis(单机): 使用jedis如何操作redis,但是其实方法是跟redis的操作大部分是相对应的. 所有的redis命令都对应jedis的一个方法     1.在macen工程 ...

  6. Java与redis交互、Jedis连接池JedisPool

    Java与redis交互比较常用的是Jedis. 先导入jar包: commons-pool2-2.3.jar jedis-2.7.0.jar 基本使用: public class RedisTest ...

  7. 使用jedisPool管理jedis,使用jedis操作redis

    ps:jedis是redis在java中的客户端操作工具 package com.test; 2 3 import java.util.HashMap; 4 import java.util.Iter ...

  8. (二)Redis之Jedis概念和HelloWorld实现以及JedisPool的使用

    一.Jedis概念 实际开发中,我们需要用Redis的连接工具连接Redis然后操作Redis, 对于主流语言,Redis都提供了对应的客户端: 官网:https://redis.io/clients ...

  9. redis客户端jedis连接和spring结合

    摘自传智博客课程 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="htt ...

随机推荐

  1. Spark学习(3) SparkSQL

    什么事sparkSQL Spark SQL是Spark用来处理结构化数据的一个模块,它提供了一个编程抽象叫做DataFrame并且作为分布式SQL查询引擎的作用, 它是将Spark SQL转换成RDD ...

  2. KEPServerEX 6 配置连接 Allen-Bradley MicroLogix 1400

    =============================================== 2019/7/28_第1次修改                       ccb_warlock == ...

  3. 论DOM中文档和元素的位置大小属性及其区别

    element.offsetLeft/Top  获取元素相对于最近的有定位的父元素的坐标,如果没有有定位的父元素,则是文档坐标 element.scrollTop/Left 获取元素滚动卷去的距离 e ...

  4. JS把格林威治时间转换为北京标准时间

    function fermitTime(time){ var now = new Date(time); var year = now.getFullYear(); ; var date= now.g ...

  5. Function.prototype.apply.call 理解分析

    首先需要了解apply,call的基本用法,其目的是改变调用方法中的this指向,将其指向为传入的对象,改变this的指向,两种方法接收参数的方式不同. 代码:console.log var cons ...

  6. JavaScript原型链以及Object,Function之间的关系

    JavaScript里任何东西都是对象,任何一个对象内部都有另一个对象叫__proto__,即原型,它可以包含任何东西让对象继承.当然__proto__本身也是一个对象,它自己也有自己的__proto ...

  7. CSS-宽度自适应和浏览器兼容笔记

    自适应 宽度自适应:网页元素根据窗口或子元素自动调整宽度 适用百分比进行设置,例如:100% 铺满:50% 占据一般宽度 块元素如果不设置宽度,默认为100% 自适应中可以设置最大或者最小宽度和高度 ...

  8. Audio Queue Services Programming Guide(音频队列服务编程指南)

    Audio Queue Services 的苹果官方文档: https://developer.apple.com/library/ios/documentation/MusicAudio/Conce ...

  9. nrm 工具的使用

    一.什么是nrm? 这是官方的原话: 开发的npm registry 管理工具 nrm, 能够查看和切换当前使用的registry, 最近NPM经常 down 掉, 这个还是很有用的哈哈 顾名思义,就 ...

  10. SQL SERVER升级2017

    SQL SERVER升级2017 摘要 本文只介绍了SQL SERVER升级到2017(在简单环境下),分为开始升级前的检查事项,升级操作步骤,升级后对新实例的配置. 检查事项 1.检查当前版本是否可 ...