Redis及Spring-Data-Redis入门学习

Spring-Data-Redis入门学习 Spring-Data-Redis入门学习 Redis,Spring提供了Spring Data Redis用来实现通过配置文件的方式访问redis服务。 Jedis Jedis是Redis官方推出的一款面向Java的客户端,提供了很多借口供Java语言调用。 Spring Data Redis针对Jedis提供了如下功能: 连接池自动管理,提供了一个高度封住的RedisTemplate类。... 阅读详情

继上一篇Solr和Spring Data Solr学习,我们思考一个问题,使用Solr的目的是什么?肯定是为了加快服务器的相应速度。因为即使不适用Solr,通过请求数据库我们一样能完成搜索功能,但是这样会给服务器造成很大的压力。

而Solr仅仅是在搜索功能中用到了,但是大量请求的数据不仅仅出现在搜索中,比如用户的登录信息,虽然数据量很小,但是整个项目每刷新一次页面都要请求一次用户登录的Token信息,也会拖慢服务器的响应速度。我们通常有两中解决方式:1.数据缓存;2.网页静态化。

其实我们在Shiro实现用户-角色-权限管理系统中已经用到了缓存技术,今天我们了解一下Redis缓存技术。

项目开源地址:SSM整合Solr实现电商项目中的搜索功能

安装Redis

Redis是一款开源的Key-Value数据库。首先我们要去 官网 下载Redis,由于笔者使用的是MacOS系统,和Windows系统有所不同。

安装过程不再叙述,这里提供两个教程:


启动Redis

redis-server 
redis-server &

建议使用第二个命令,用第二个命令启动了redis server后能继续输入命令,使用第一个命令则不行。

如果终端中显示如下logo表示redis启动成功:

image


操纵Redis

上面仅仅是启动了Redis Server,但Redis是一种Key-Value型数据库,也包含了一些查询数据库的命令,操作redis命令的入口就是: redis/bin/redis-cli

./bin/redis-cli

redis-cli

image

  1. 查看当前(db0)数据库中所有的key值: keys *
  2. 清空当前数据库中所有的数据: flushall

更多的Redis命令可以参看:redis中文文档


Spring Data Redis

之前学习Solr的时候用到了Spring Data Solr,现在学习Redis,Spring提供了Spring Data Redis用来实现通过配置文件的方式访问redis服务。Spring Data Redis对Redis底层开发包(Jedis, JRedis, and RJC)进行了高度封装,RedisTemplate提供了redis各种操作、异常处理及序列化。

Jedis

Jedis是Redis官方推出的一款面向Java的客户端,提供了很多借口供Java语言调用。

Spring Data Redis针对Jedis提供了如下功能:

  • 1.连接池自动管理,提供了一个高度封住的RedisTemplate类。
  • 2.针对jedis客户端中大量api进行归类封装,将同一类型操作封装为operation接口:
    ValueOperations: 简单的K-V操作
    SetOperations: set类型数据操作
    ZSetOperations: zset类型数据操作
    HashOperations: 针对Map类型的数据操作
    ListOperations: 针对List类型的数据操作

准备

导入依赖

<dependency> 
		  <groupId>redis.clients</groupId> 
		  <artifactId>jedis</artifactId> 
		  <version>2.8.1</version> 
</dependency> 
<dependency> 
		  <groupId>org.springframework.data</groupId> 
		  <artifactId>spring-data-redis</artifactId> 
		  <version>1.7.2.RELEASE</version> 
</dependency>	

创建redis-config.properties

redis.host=127.0.0.1 
redis.port=6379 
redis.pass= 
redis.database=0 
redis.maxIdle=300 
redis.maxWait=3000 
redis.testOnBorrow=true

解释

  1. redis.host是安装redis server的客户端IP地址,如果安装在本机上就是127.0.0.1,如果安装在服务器上请修改为服务器的IP地址。
  2. redis.port是redis server的默认端口,你安装了redis,就默认使用这个端口号。
  3. redis.pass是访问redis server的密码,一般我们不设置。
  4. redis.database=0代表使用的是redis默认提供的db0这个数据库。
  5. redis-maxIdle是redis server的最大空闲数。
  6. redis-maxWait是连接redis时的最大等待毫秒数。
  7. redis-testOnBorrow在提取一个redis实例时,是否提前进行验证操作;如果为true,则得到的jedis实例均是可用的。

创建spring-redis.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
		http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context
		http://www.springframework.org/schema/context/spring-context.xsd">

    <context:property-placeholder location="classpath:other/*.properties"/>
    <!-- redis 相关配置 -->
    <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <!-- 最大空闲数 -->
        <property name="maxIdle" value="${redis.maxIdle}"/>
        <!-- 连接时最大的等待时间(毫秒) -->
        <property name="maxWaitMillis" value="${redis.maxWait}"/>
        <!-- 在提取一个jedis实例时,是否提前进行验证操作;如果为true,则得到的jedis实例均是可用的 -->
        <property name="testOnBorrow" value="${redis.testOnBorrow}"/>
    </bean>
    <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
        <property name="hostName" value="${redis.host}"/>
        <property name="port" value="${redis.port}"/>
        <property name="password" value="${redis.pass}"/>
        <property name="poolConfig" ref="poolConfig"/>
    </bean>

    <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
        <property name="connectionFactory" ref="jedisConnectionFactory"/>
    </bean>
</bean>

实例

本实例源码:Github

首先加载配置文件spring-redis.xml,注入RedisTemplate模板类:

@Autowired
private RedisTemplate redisTemplate;

值类型

RedisTemplate提供的很多操作redis数据库的方法都是boundxxOps这种。

添加
@Test
public void setValue(){
    redisTemplate.boundValueOps("name").set("tycoding");
}

如果配置都正常的情况下,运行此方法就能向db0数据库中添加一条key为name的记录;那么我们在redis命令行中查看所有的key:

image

奇怪,我添加的key明明是name,为什么查出来的确实一堆乱码值呢?我们再使用redis命令行单独添加一条记录:

set testK testV

image

此时我们又发现,使用redis原生命令添加的数据是不会乱码的;那么就肯定是Spring Data Redis的原因了。经查询是因为redisTemplate模板类在操作redis序列化的原因,我们要手动配置序列化方式为:StringRedisSerializer

修改之前创建的spring-redis.xml配置文件:

<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
    <property name="connectionFactory" ref="jedisConnectionFactory"/>

    <!-- 序列化策略 推荐使用StringRedisSerializer -->
    <property name="keySerializer">
        <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
    </property>
    <property name="valueSerializer">
        <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
    </property>
    <property name="hashKeySerializer">
        <bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/>
    </property>
    <property name="hashValueSerializer">
        <bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/>
    </property>
</bean>

再次添加数据

image

查询
@Test
public void getValue(){
    Object name = redisTemplate.boundValueOps("name").get();
    System.out.println(name);
}
删除
@Test
public void deleteValue(){
    redisTemplate.delete("name");
}

Set类型

添加
@Test
public void setValueBySet(){
    redisTemplate.boundSetOps("nameset").add("tycoding");
}
查询
@Test
public void getValueBySet(){
    Set nameset = redisTemplate.boundSetOps("nameset").members();
    System.out.println(nameset);
}
删除Set中某一个值
@Test
public void deleteValueBySet(){
    redisTemplate.boundSetOps("nameset").remove("涂陌");
}
删除整个Set
@Test
public void deleteAllValueByset(){
    redisTemplate.delete("nameset");
}

List类型

右压栈

右压栈,后添加的对象排在后边

@Test
public void setRightValueByList(){
  redisTemplate.boundListOps("namelist").rightPush("tycoding");
  redisTemplate.boundListOps("namelist").rightPush("涂陌");
}

显示右压栈集合

@Test
public void getRightValueByListI(){
    List namelist = redisTemplate.boundListOps("namelist").range(0, 10);
    System.out.println(namelist);
}
左压栈

左压栈,后添加的对象排在前面

    @Test
    public void setLeftValueByList(){
        redisTemplate.boundListOps("namelist2").leftPush("tycoding");
        redisTemplate.boundListOps("namelist2").leftPush("涂陌");
    }

显示左压栈的集合:

    @Test
    public void getLeftValueByList(){
        List name2 = redisTemplate.boundListOps("namelist2").range(0, 10);
        System.out.println(name2);
    }

根据索引查询集合中的元素

    @Test
    public void searchByIndex(){
        Object namelist = redisTemplate.boundListOps("namelist").index(1);
        System.out.println(namelist);
    }

Hash类型

添加
    @Test
    public void setValueByHash(){
        redisTemplate.boundHashOps("namehash").put("a","tycoding");
    }
提取所有的KEY
    @Test
    public void getKeysByHash(){
        Set namehash = redisTemplate.boundHashOps("namehash").keys();
        System.out.println(namehash);
    }
提取所有的VALUE
    @Test
    public void getValuesByHash(){
        List namehash = redisTemplate.boundHashOps("namehash").values();
        System.out.println(namehash);
    }
根据KEY取值
    @Test
    public void getValueByHash(){
        Object o = redisTemplate.boundHashOps("namehash").get("a");
        System.out.println(o);
    }
根据KEY移除值
    @Test
    public void deleteValueByHash(){
        redisTemplate.boundHashOps("namehash").delete("a");
    }

测试

上面说了一大堆,没有实际的测试,着实不清楚Redis究竟效果如何,是不是真的提高了访问速度?

下面我们以查询数据库所有值的功能来看一下使用Redis缓存和未使用缓存直接查询数据库所用时间。

本例源码地址:Github

未使用Redis缓存,直接请求数据库

public List<Goods> findAll() {
        return goodsMapper.findAll();
}

使用了Redis缓存

首先通过boundHashOps获取Redis数据库中是否存在KEY为all的数据,有的话就返回;没有的话就查询数据库并将查询到的数据添加到Redis数据库中,且KEY为all

public List<Goods> findAll() {
    List<Goods> contentList = (List<Goods>) redisTemplate.boundHashOps("goods").get("all");
    if (contentList == null) {
        //说明缓存中没有数据
        System.out.println("从数据库中读取数据放入redis...");
        contentList = goodsMapper.findAll();
        redisTemplate.boundHashOps("goods").put("all", contentList); //存入redis中
    } else {
        System.out.println("从缓存中读取数据...");
    }

//        return goodsMapper.findAll();
    return contentList;
}

TestTime.java

@Test
public void run1() {
    Long startTime = System.currentTimeMillis(); //开始时间
    goodsMapper.findAll();
    Long endTime = System.currentTimeMillis(); //结束时间
    System.out.println("查询数据库--共耗时:" + (endTime - startTime) + "毫秒"); //1007毫秒
}

@Test
public void run2() {
    Long startTime = System.currentTimeMillis(); //开始时间
    goodsService.findAll();
    Long endTime = System.currentTimeMillis(); //结束时间
    System.out.println("从redis中读取所有数据,共耗时:" + (endTime - startTime) + "毫秒");
}

在测试类中调用Service层的这两个方法,得到的结果如下:

查询数据库--共耗时:1047毫秒

从redis中读取所有数据,共耗时:197毫秒

交流

如果大家有兴趣,欢迎大家加入我的Java交流群:671017003 ,一起交流学习Java技术。博主目前一直在自学JAVA中,技术有限,如果可以,会尽力给大家提供一些帮助,或是一些学习方法,当然群里的大佬都会积极给新手答疑的。所以,别犹豫,快来加入我们吧!


联系

If you have some questions after you see this article, you can contact me or you can find some info by clicking these links.

Spring Data Redis 实践 关于Spring Data Redis的简单应用以及1.7新特性Redis Repositories简介~ 阅读详情

相关推荐

Spring Data Redis 实战指南

通过@RedisHash注解定义Redis存储结构,该注解需指定哈希前缀值作为领域模型的命名空间标识。实体类需使用@Id标注主键字段,存储时将自动组合为[前缀]:[ID值]@Data@Id// 其他字段...Spring Data Redis 提供了完整的 Redis 集成解决方案,通过注解驱动开发模式显著提升了开发效率。与 Spring Boot 的深度集成简化了配置流程,开发者可以快速实现多种数据结构的灵活存储。开发效率@RedisHash等注解自动处理对象-存储映射,接口免除样板代码。

静水深流 1374

Spring Data Redis

Spring Data Redis的使用,什么时候用redis

m0_71560190的博客 6364

Spring Data【Spring Data Redis、Spring Data ElasticSearch】(二)-全面详解(学习总结---从入门到深化)

Spring Data【Spring Data Redis、Spring Data ElasticSearch】(二)-全面详解(学习总结---从入门到深化)

1513

SpringDataRedis

SpringData是Spring中数据操作的模块,包含对各种数据库的集成,其中对Redis的集成模块就叫做SpringDataRedis,官网地址提供了对不同Redis客户端的整合(Lettuce和Jedis)提供了RedisTemplate统一API来操作Redis支持Redis的发布订阅模型支持Redis哨兵和Redis集群支持基于Lettuce的响应式编程支持基于JDK、JSON、字符串、Spring对象的数据序列化及反序列化。

weixin_43811057的博客 4487

从零搭建Simulink-Adams联合仿真平台:实现电机转速的精准闭环控制

本文详细介绍了从零搭建Simulink-Adams联合仿真平台的完整流程,旨在实现电机转速的精准闭环控制。通过将Simulink的控制算法与Adams的物理模型相结合,构建了一个包含真实机械效应的数字孪生系统。文章涵盖了Adams物理模型构建、接口定义、Simulink控制闭环搭建、PID参数调试以及常见避坑指南,为机电系统仿真提供了实用的工程实践指导。

weixin_29189373的博客 152

Part03 数据结构

本文介绍了CSP-S初赛中常见的高级数据结构及其实现,包括: 线性结构:双端栈、双端队列、单调队列、优先队列和ST表,重点分析了它们的特点、时间复杂度及典型应用场景。 集合与森林:并查集(带路径压缩和按秩合并)和树的孩子兄弟表示法,展示了多叉树转化为二叉树存储的方法。 特殊树结构:包括二叉堆、树状数组、线段树和字典树,详细说明了它们的构建、查询和更新操作,特别强调了线段树的递归实现和字典树的前缀匹配特性。 每种数据结构都配有核心C++代码实现,涉及数组模拟、动态规划和树形结构等编程技巧,适合算法竞赛选手快速

weixin_43863957的博客 1179

Redis之RedisTemplate配置方式(序列和反序列化)

这篇文章主要介绍了Redis之RedisTemplate配置方式(序列和反序列化),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教 目录 RedisTemplate配置序列和反序列化 简介一下 实践 RedisTemplate序列化问题 序列化与反序列化规则不一致,导致报错 解决办法 总结 RedisTemplate配置序列和反序列化 对于redis操作,springboot进行了很好的封装,那就是spring data redis。提供

u013733643的博客 1万+

将机器人urdf模型转换为Mujoco环境下的mjcf模型

在使用gym环境进行人形模型站立训练的过程中,我想要将之前ros环境下的机器人urdf模型导入到mujoco环境下,这时候就需要将urdf模型转换为mujoco专用的mjcf模型。-AzureLoong.urdf是机器人模型(我这里使用青龙的模型);--custom_robot.xml是转换完成之后的机器人模型的名字和格式;包要求 Python 版本必须是 3.11 或更高),保证自己的其他训练环境和依赖不被干扰。首先将meshes文件迁移到需要输出的目录下,然后再运行转换命令。最后就可以成功输出了。

weixin_44334573的博客 3754

Redis之RedisTemplate的序列化方式深入解读

采用序列化方式对于String、对象、对象数组、JSONObject、JSONArray的序列化反序列化操作都正常,对象强转是没有任何问题,但是采用序列化方式在对象强制时,也就是使用 User userGet = (User) redisTemplate.opsForValue().get(复制代码该方式支持将任意类型的Object对象转换为相应的实体对象。

lt_xiaodou的博客 6186

Linux内核4.14版本——drm框架分析(1)——drm简介

drm框架分析

yangguoyu8023的博客 1万+

基于STM32设计的老人摔倒检测报警系统(OneNet+MQTT)(235)

基于STM32设计的老人摔倒检测报警系统,不仅能够实时监测老人的位置信息,方便在紧急情况下快速定位,还能通过陀螺仪模块精确检测老人的身体姿态,一旦判断为摔倒状态,系统将立即触发蜂鸣器报警,并通过4G网络向指定联系人发送短信警示,确保老人能够迅速得到援助。此外,系统还支持老人主动按下设备上的按键发送求助短信,增强了系统的灵活性和实用性。

4690

Spring-Data-Redis 入门学习

Spring-Data-Redis 入门学习 参考文章: https://www.jianshu.com/p/4a9c2fec1079 导入 redis 相关依赖 <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId&...

diaopitian0181的博客 214

万字长文告诉新手如何学习Python图像处理(上篇完结 四十四) | 「Python」有奖征文

这篇文章是图像处理的最后一篇文章,后面我们将进入新的章节。图像处理文章主要讲解的图像处理方法包括图像几何运算、图像量化采样、图像点运算、图像形态学处理、图像增强、图像平滑、图像锐化、图像特效、图像分割、傅里叶变换与霍夫变换、图像分类等。个人感觉如果你是编程初学者、Python初学者或图像处理爱好者,这个系列真心适合你学习,并且这篇文章算是Python图像处理的学习路线,希望您喜欢。

杨秀璋的专栏 2万+

Spring Data Redis 框架入门学习及小Demo练习

1、简介          Spring-data-redis是spring大家族的一部分,提供了在spring应用中通过简单的配置访问redis服务,对reids底层开发包(Jedis,  JRedis, and RJC)进行了高度封装,RedisTemplate提供了redis各种操作、异常处理及序列化,支持发布订阅,并对spring 3.1 cache进行了实现。 2、功能      ...

py_tamir的博客 261

18、动态系统响应分析

本文系统地介绍了动态系统响应的分析方法,涵盖传递函数建模、特殊输入下的响应特性(如脉冲和阶跃响应)、终值与初值定理的应用、系统直流增益的计算,并深入探讨了一阶和二阶系统的时域特性。通过实例分析与MATLAB仿真,展示了不同参数对系统行为的影响。文章还总结了系统响应在控制设计与故障诊断中的实际应用,并展望了多变量、非线性及实时响应分析的未来研究方向。配合流程图,提供了清晰的系统分析与设计路径。

kite3的博客 140

杰理SDK入门教程(一):SDK的四种编译方式的使用

杰理SDK提供了四种主要编译方式:1) JL Studio官方IDE,适合初学者;2) VS Code轻量级编辑器,需在SDK根目录打开;3) 命令行/脚本编译,灵活支持自动化;4) Code::Blocks开源IDE。每种方式都有详细操作指南,开发者可根据需求选择,初学者推荐从JL Studio开始熟悉编译流程。环境配置注意事项和编译成功标识均有明确说明,确保开发效率。

qq_42014563的博客 1146

Redis快速学习+java操作Redis

本文介绍了Redis的基本概念、数据结构及常用操作命令。Redis是一种基于键值对的内存数据库,支持多种数据结构,包括字符串、哈希、列表、集合和有序集合。文章详细说明了如何启动Redis服务端、修改密码以及通过客户端连接Redis。此外,还列举了各类数据结构的常用命令,如字符串的SET、GET,哈希的HSET、HGET,列表的LPUSH、LRANGE等。最后,文章简要介绍了如何使用Java操作Redis,展示了通过Jedis客户端进行字符串操作的示例代码。

梓梓心的博客 1388

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

突破100%音量上限:Ultrahand Overlay 系统控制玩法与150%音量调节技巧

**Ultrahand Overlay** 是一款专为 Nintendo Switch 打造的全功能脚本化悬浮菜单,可通过热键在任意游戏中秒开,支持文件管理、配置修改与系统控制。本文带你快速掌握它的核心玩法,尤其是突破系统 100% 音量上限、调节至 **150% 音量**的实用技巧。 [![Ultrahand Overlay 系统悬浮菜单](https://raw.gitcode.com/gh

gitblog_01046的博客 634

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

[数据库] Redis学习笔记(二):Redis Java客户端(Jedis/SpringDataRedis)

redis的Java客户端

東木的博客 1012

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Redis小白入门学习笔记(全)

一、Redis简介 1. 关于NoSQL ​ NoSQL的全称是Not only SQL,在过去的几年中,NoSQL数据库一度成为高并发、海量数据存储解决方案的代名词,与之相应的产品也呈现出雨后春笋般的生机。然而在众多产品中能够脱颖而出的却屈指可数,如Redis、MongoDB、BerkeleyDB和memcached等内存数据库。由于每种产品所拥有的特征不同,因此它们的应用场景也存在着一定的差异...

msyqmsyq的博客 751

redis学习笔记(二)

springboot集成redis的使用

wenbinglin66的博客 463

Redis系列之Spring Data Redis

概述、自动配置、入门使用、RedisTemplate、方法分类、execute类、原生Redis指令、排序、事务、Redis Server、Operations有两类、CAS操作、发布订阅、Lua脚本、序列化、StringRedisSerializer、RedisSerializer、属性配置、RedisCallback、SessionCallback

lonelymanontheway的博客 2982

Spring Data Redis 详解

Redis 其实非常简单,但是使用了 Spring Data Redis,会发现更简单,其实相当于加了个中间层在里面,并不需要再去关注多种 Redis 的工具库了。

RedRay0的博客 1995

Spring-data-redis介绍

spring data是用于简化数据库访问的开源框架,其主要目标是使得对数据的访问变得方便快捷,主要包括:jdbc、redis、jsp、elasticsearch只要是Java的开发,基本上都应用大型的开发环境(毕竟生态很成熟,别说所谓的其他语言好与坏),既然要开发啊Java项目,必然要有Spring开发框架,那么既然有了Spring开发框架,就需要"万物整合",自然也就包含了Redis的整合,

weixin_42486553的博客 1688
上一篇: Solr及Spring-Data-Solr入门学习
下一篇: JQuery-zTree.js使用范例
TyCoding
博客等级 码龄9年 316粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值