1、 Redis支持消息的订阅与发布

Redis的消息订阅支持:先订阅后发布

订阅:subscribe c1 c2

发布:publish c2 hello-redis

支持通配符的订阅:psubscribe new*

实际开发中没用,RabbitMQ

2、Redis对于事务支持

Redis对于事务也是支持,但是支持的不太好。

multi:开启事务

exec:提交事务

discard:回滚事务

3、Redis的Java客户端Jedis

3.1先导入依赖包

<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>

3.2,测试代码

 public static void main( String[] args ){
//1.创建Jedis客户端,并指定Redis服务器的ip和端口号
Jedis jedis = new Jedis("192.168.58.10",6379);
//2.通过Jedis客户端操作Redis服务器
jedis.set("key1","value1");
String value1 = jedis.get("key1");
System.out.println(value1);
//3.关闭Jedis客户端
jedis.close();
}
这种还需要一个个创建!!不太好

3.3,创建jedisPool

这种每用一次都需要创建一个连接池  消耗内存  

public static void main( String[] args ){
//1.创建JedisPool对象,从JedisPool对象中获取Jedis连接
JedisPool jedisPool = new JedisPool("192.168.58.10",6379);
Jedis jedis = jedisPool.getResource();
//2.通过Jedis客户端操作Redis服务器
String value1 = jedis.get("key1");
System.out.println(value1);
//3.关闭Jedis客户端
jedis.close();
}

四、Jedis和Spring的整合

4.1导入spring 和jedis的包

4.2 :配置配置文件  :这种就不用每次用 就不用创建jedis池了 只创建一次 就行。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<!-- 最大空闲连接数 -->
<property name="maxIdle" value="1" />
<!-- 最大连接数 -->
<property name="maxTotal" value="5" />
<!-- 连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true -->
<property name="blockWhenExhausted" value="true" />
<!-- 获取连接时的最大等待毫秒数(如果设置为阻塞时BlockWhenExhausted),如果超时就抛异常, 小于零:阻塞不确定的时间, 默认-1 -->
<property name="maxWaitMillis" value="30000" />
<!-- 在获取连接的时候检查有效性 -->
<property name="testOnBorrow" value="true" />
</bean> <bean class="redis.clients.jedis.JedisPool" destroy-method="close">
<constructor-arg name="host" value="192.168.248.99"/>
<constructor-arg name="port" value="6379"/>
<constructor-arg name="poolConfig" ref="jedisPoolConfig"/>
</bean> </beans>

五、Jedis和SSM整合

5.1:导包

5.2:配置ssm和jedis配置文件的整合

5.2:然后redis缓存只能应用在服务层。

第一种

这种是利用自定义的工具类 是使用字符串转化成数组 ,数组幻化成字符串的方式进行缓存。

先创建自定义序列化,反序列化工具类

package com.ujy.maven.utils;
import java.io.*;
public class SerizlizableUtil { //完成序列化
public static byte[] serializable(Object object){
/*
* 接收一个对象,传到writeObject里面,通过对象输出流写入到字节输出流
* ,然后从字节数组输出流的toByteArray获取这个数组,然后返回给调用者
* */
try {
//1.字节数组输出流
ByteArrayOutputStream baos = new ByteArrayOutputStream(); //3
//2.对象输出流
ObjectOutputStream oos = new ObjectOutputStream(baos);//
oos.writeObject(object); //
byte[] bytes = baos.toByteArray();//
return bytes;//
}catch (Exception e){
e.printStackTrace();
}
return null;
}
//完成反序列化
public static Object unSerializable(byte [] bytes){
//先判断是否非空 非空直接返回
if (bytes==null){
return null;
}
try {
//1.字节数组输入流
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
//2.对象输入流
ObjectInputStream ois = new ObjectInputStream(bais);
Object o = ois.readObject();
return o;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}

然后在服务层应用:

 @Autowired
private PersonDao personDao;
@Autowired
private JedisPool jedisPool; public List<Person> findAll() {
Jedis jedis = jedisPool.getResource();
List<Person> list=null; long startTime = System.currentTimeMillis();
System.out.println(startTime);
//1.先去缓存中去查数据 ,
byte[] lists = jedis.get(SerizlizableUtil.serializable("personList"));
//2. 如果没有就从数据库查 然后存入缓存 下次可以从缓存取。
if (lists==null){
list = personDao.findAll();
long endTime1 = System.currentTimeMillis();
System.out.println("去数据库中查询数据用的时间为:"+(endTime1-startTime));
jedis.set(SerizlizableUtil.serializable("personList") ,SerizlizableUtil.serializable(list));
}else {
//3.如果缓存中有数据,直接反序列化,返回给控制层
list=(List<Person>) SerizlizableUtil.unSerializable(lists);
System.out.println(list);
long endTime2 = System.currentTimeMillis();
System.out.println("去缓存中查询数据用的时间为:"+(endTime2-startTime));
}
jedis.close();
return list;
}

第二种:

这种是利用FastJson这种定义好的工具类 ,是转换成字符串,然后字符串转换成对象或者集合或者map。

先来两个测试代码:这种是任意类型转换成String类型。

  @Test
public void test1(){
//对象--->字符串
Person person = new Person(6,"王子",1,22);
String s = JSON.toJSONString(person);
System.out.println(s); //对象列表(集合)--->字符串
List<Person> list = new ArrayList<Person>();
list.add(new Person(7,"格格",0,20));
list.add(new Person(8 ,"公主",0,21));
list.add(new Person(9,"逍遥",1,23));
String s1 = JSON.toJSONString(list);
System.out.println(s1); //Map--->字符串
Map<String,Object> map = new HashMap<String, Object>();
map.put("小李飞刀","刀无虚发");
map.put("飞檐走壁","乃真人也");
String s = JSON.toJSONString(map);
System.out.println(s); }

这种是String转换成 对象,List ,数组,Map

无论任意数据类型转换成字符串就通过:JSON.toJSONString()
字符串转换成其他数据类型:
String --->对象类型JSON.parseObj()
String--->数组类型JSON.parseArray()
String --->Map类型JSON.parseObj() @Test
public void test2(){
// String --->对象类型JSON.parseObj()
Person person = new Person(6,"王子",1,22);
String s = JSON.toJSONString(person); Person person1 = JSON.parseObject(s, Person.class);
System.out.println(person1); //String--->数组类型JSON.parseArray()
List<Person> list = new ArrayList<Person>();
list.add(new Person(7,"格格",0,20));
list.add(new Person(8 ,"公主",0,21));
list.add(new Person(9,"逍遥",1,23));
String s1 = JSON.toJSONString(list); List<Person> people = JSON.parseArray(s1, Person.class);
System.out.println(people); //String --->Map类型JSON.parseObj()
Map<String,Object> map = new HashMap<String, Object>();
map.put("小李飞刀","刀无虚发");
map.put("飞檐走壁","乃真人也");
String s = JSON.toJSONString(map); Map map1 = JSON.parseObject(s, Map.class);
System.out.println(map1);
}

然后应用到服务层

  @Autowired
private PersonDao personDao;
@Autowired
private JedisPool jedisPool; public List<Person> findAll() {
Jedis jedis = jedisPool.getResource();
List<Person> list=null; long startTime = System.currentTimeMillis();
System.out.println(startTime);
//1.先去缓存中去查数据 ,
String sss =jedis.get("personList");
//2. 如果没有就从数据库查 然后存入缓存 下次可以从缓存取。
if (sss==null){
list = personDao.findAll();
long endTime1 = System.currentTimeMillis();
System.out.println("去数据库中查询数据用的时间为:"+(endTime1-startTime));
jedis.set(JSON.toJSONString("personList") , JSON.toJSONString(list));
}else {
//3.如果缓存中有数据,直接反序列化,返回给控制层
list=JSON.parseArray(sss,Person.class);
System.out.println(list);
long endTime2 = System.currentTimeMillis();
System.out.println("去缓存中查询数据用的时间为:"+(endTime2-startTime));
}
jedis.close();
return list;
}

Redis的客户端Jedis的更多相关文章

  1. Redis JAVA客户端 Jedis常用方法

    Jedis 是 Redis 官方首选的 Java 客户端开发包 (redis的java版本的客户端实现) #MAVEN配置 <dependency> <groupId>redi ...

  2. Redis的Java客户端Jedis的八种调用方式(事务、管道、分布式)介绍

    jedis是一个著名的key-value存储系统,而作为其官方推荐的java版客户端jedis也非常强大和稳定,支持事务.管道及有jedis自身实现的分布式. 在这里对jedis关于事务.管道和分布式 ...

  3. 使用Redis的Java客户端Jedis

    转载自:http://aofengblog.blog.163.com/blog/static/631702120147298317919/ 前一篇文章<Redis命令指南>讲解了通过命令行 ...

  4. [转载] 使用Redis的Java客户端Jedis

    转载自http://aofengblog.blog.163.com/blog/static/631702120147298317919/ 在实际的项目开发中,各种语言是使用Redis的客户端库来与Re ...

  5. Redis客户端——Jedis的使用

    本文介绍基于Java语言的Redis客户端——Jedis的使用,包括Jedis简介.获取Jedis.Jedis直连.Jedis连接池以及二者的对比的选择. Jedis简介 Jedis 是 Redis  ...

  6. 【转载】Redis的Java客户端Jedis的八种调用方式(事务、管道、分布式…)介绍

    转载地址:http://blog.csdn.net/truong/article/details/46711045 关键字:Redis的Java客户端Jedis的八种调用方式(事务.管道.分布式…)介 ...

  7. Redis(九):Redis的Java客户端Jedis

    Redis的Java客户端Jedis导航目录: 安装JDK 安装Eclipse Jedis所需要的Jar包 Jedis常用操作 JedisPool 安装JDK tar -zxvf jdk-7u67-l ...

  8. 9.Redis的Java客户端Jedis

    Redis的Java客户端Jedis Jedis所需jar包   commons-pool-1.6.jar jedis-2.1.0.jar 1.Jedis常用操作(jedis中的api 和 我们在 l ...

  9. redis 学习(8)-- redis 客户端 -- Jedis

    redis 客户端 -- Jedis 1. Jedis 直连 本质是 TCP 连接. 执行流程 创建Jedis对象 通过Jedis执行命令 返回Jedis执行结果 关闭Jedis连接 demo 要使用 ...

随机推荐

  1. 10分钟学会React Context API

    Create-react-app来学习这个功能: 注意下面代码红色的即可,非常简单. 在小项目里Context API完全可以替换掉react-redux. 修改app.js import React ...

  2. 【bzoj1176】[Balkan2007]Mokia

    题目描述: 维护一个W*W的矩阵,初始值均为S.每次操作可以增加某格子的权值,或询问某子矩阵的总权值.修改操作数M<=160000,询问数Q<=10000,W<=2000000. 输 ...

  3. [CSP-S模拟测试]:d(贪心+树状数组)

    题目传送门(内部题65) 输入格式 第一行,一个自然数$T$,代表数据组数.对于每组数据:第一行,一个正整数$n$,一个自然数$m$.接下来$n$行,每行两个正整数,$a_i,b_i$. 输出格式 对 ...

  4. ORACLE Physical Standby DG 之fail over

    SQL> select thread#, low_sequence#, high_sequence# from v$archive_gap;确认下是否存在日志间隙,发现gap现象,说明failo ...

  5. linux中也有闹钟alarm, timer, stopwatch, world clock 等等

    stopwatch和timer的区别? timer叫计时器, 是先给出一个时间, 然后从现在开始, 倒数, 减少, 直到时间为0 stopwatch 叫跑錶, 则是从现在开始, 往后 增加时间, 事先 ...

  6. 【HTML】<!DOCTYPE html>作用

    1.定义: DOCTYPE标签是一种标准通用标记语言的文档类型声明,它的目的是要告诉标准通用标记语言解析器,它应该使用什么样的文档类型定义(DTD)来解析文档. <!DOCTYPE> 声明 ...

  7. (转)grep命令

    1.作用Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来.grep全称是Global Regular Expression Print,表示全局 ...

  8. day48—JavaScript键盘事件

    转行学开发,代码100天——2018-05-03 今天继续学习JavaScript事件基础之键盘事件. 键盘代号获取 keyCode 键盘事件:onkeydown onkeyup 如通过键盘上下左右按 ...

  9. Numpy的补充(重要!!)

    轴的概念 英文解释  https://www.sharpsightlabs.com/blog/numpy-axes-explained/ 汉化解释 https://www.jianshu.com/p/ ...

  10. 测开之路九十九:js函数、事件、window窗体对象

    函数:function 函数名(参数列表) 事件 单击:onclick()表单提交:onsubmit()鼠标经过:onmouseover()值改表时:onchange() window窗体对象转跳:w ...