dubbo2.5-spring4-mybastis3.2-springmvc4-mongodb3.4-redis3.2整合(五)Spring中spring-data-redis的使用

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
云数据库 Tair(兼容Redis),内存型 2GB
简介: 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010046908/article/details/54170891

前面已经写了四篇关于dubbo2.5-spring4-mybastis3.2-springmvc4-mongodb3.4-redis3.2整合的文章:

  1. dubbo2.5-spring4-mybastis3.2-springmvc4-mongodb3.4-redis3.2整合(一)Dubbo的使用
  2. dubbo2.5-spring4-mybastis3.2-springmvc4-mongodb3.4-redis3.2整合(二)之 JDBC连接池、监控组件 Druid
  3. dubbo2.5-spring4-mybastis3.2-springmvc4-mongodb3.4-redis3.2整合(三)使用Spring AOP实现mysql的读写分离
  4. dubbo2.5-spring4-mybastis3.2-springmvc4-mongodb3.4-redis3.2整合(四)Spring AOP中使用log4j实现http请求日志入mongodb

今天继续写一篇关于Spring中spring-data-redis的使用。

Redis是一种特殊的类型的数据库,它被称为一种key-value存储。key-value存储保存的是键值对。实际上,key-value存储于哈希Map有很大的相似。
spring data是一种面向模板的数据访问,能够在使用Redis的时候,为我们提供了帮助。于是就有了spring-data-redis。

1. spring-data-redis的简介

spring-data-redis包含了多个模板实现,用来完成Redis数据库的存取功能。创建spring-data-redis模板之前,我们首先需要一个Redis连接工厂,spring-data-redis提供了四个连接工厂供我们选择。

2.spring-data-redis所需要依赖

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

3. spring-data-redis的使用

3.1 连接到Redis

Redis连接工厂会生成到Redis数据库服务器的连接。spring-data-redis为四种Redis客户端实现了连接工厂:

  • JedisConnectionFactory
  • JredisConnectionFactory
  • LettuceConnectionFactory
  • SrpConnectionFactory

    具体选择哪一种取决于自己。

(1)创建redis.properties:

maxTotal=8
#最大空闲时间
maxIdle=8
#最短空闲时间
minIdle=0
#最大的等待时间
maxWaitMillis=6000
#Redis的连接地址
hostR=127.0.0.1
#端口
portR=6379

(2)创建spring-redis.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:rabbit="http://www.springframework.org/schema/rabbit"
    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-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/rabbit
http://www.springframework.org/schema/rabbit/spring-rabbit-1.2.xsd">

    <!-- 引入redis.properties配置文件-->
    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
        <property name="location" value="classpath:redis.properties" /> </bean> 

    <!-- redis连接池的配置 -->
    <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <property name="maxTotal" value="${maxTotal}" />
        <property name="maxIdle" value="${maxIdle}" />
        <property name="minIdle" value="${minIdle}" />
        <property name="maxWaitMillis" value="10000" />
        <property name="minEvictableIdleTimeMillis" value="300000"></property> 
        <property name="numTestsPerEvictionRun" value="3"></property> 
        <property name="timeBetweenEvictionRunsMillis" value="60000"></property> 
   </bean>
    <!-- 工厂类配置 -->
    <bean id="jedisConnectionFactory"
        class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
        <property name="hostName" value="${hostR}" />
        <property name="port" value="${portR}" />
        <property name="poolConfig" ref="jedisPoolConfig" />
         <property name="timeout" value="15000"></property> 
        <property name="usePool" value="true"></property> 
    </bean>

    <!-- redisTemplate配置 -->
    <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
        <property name="connectionFactory" ref="jedisConnectionFactory" />
        <property name="keySerializer">
            <bean
                class="org.springframework.data.redis.serializer.StringRedisSerializer" />
        </property>
        <property name="valueSerializer">
            <bean
                class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer" />
        </property>
        <property name="enableTransactionSupport" value="true" />
    </bean>

</beans>

以上是我配置的jedisPoolConfig,jedisConnectionFactory,redisTemplate。

3.2 使用RedisTemplate

Redis连接工厂会生成到Redis key-value存储的连接(以RedisConnection的形式。)借助RedisConnection,可以存储和读取数据。

spring-redis-data以模板的形式提供了较好等级的数据访问方案。实际上,spring-data-redis提供了两个模板:

  • RedisTemplate
  • StringRedisTemplate

其中RedisTemplate使用两个类型进行了参数。第一个参数是key的类型,第二个参数是value的类型,而StringRedisTemplate是RedisTemplate的扩展,只关注String类型,也就是key和vlaue都是String类型。

3.2.1 RedisTemplate使用简单值

假设我们想通过RedisTemplate

  public class UserRedisDaoImp extends AbstractBaseRedisTemplete<User> 
              implements IUserRedisDao {

    @Override
    public User findById(String key) {
        return (User) redisTemplate.opsForValue().get(key);
    }

    @Override
    public void saveUser(String key,User user) {
         redisTemplate.opsForValue().set(key, user);
    }

}
3.2.2 RedisTemplate使用List值

使用List类型的value与之类似,只需要使用opForList()方法,

package com.lidong.core.user.dao;

import java.util.List;

import com.lidong.model.user.User;
import com.lidong.util.AbstractBaseRedisTemplete;

public class UserRedisDaoImp extends AbstractBaseRedisTemplete<User> 
              implements IUserRedisDao {

    @Override
    public List<User> getUserList(String key,long start,long end) {
         return  redisTemplate.opsForList().range(key, 0, end);
    }

    @Override
    public Long addUserToUserList(String key, User user) {
        return redisTemplate.opsForList().leftPush(key, user);

    }

}
3.2.3 RedisTemplate使用Set值

除了使用List类型和value类型,我们还可以使用opForSet()的方法操作Set,最为常用的的就是向Set中添加一个元素:

@Override
    public void saveUser(String key,User user) {
         redisTemplate.opsForSet().add(key, user);
    }

在我们有多个Set,并对这些Set集合进行差、交、并的操作。

 Set<User> difference = redisTemplate.opsForSet().difference("users1", "users2");
          Set<User> union = redisTemplate.opsForSet().union("users1", "users2");
          Set<User> intersect = redisTemplate.opsForSet().intersect("users1", "users2");
          //我还可以移除Set中的元素
          Long remove = redisTemplate.opsForSet().remove("user1", user);
3.2.4 RedisTemplete绑定到某个key上

我们可以将Value、List、Set等可以绑定到指定的key上。这些用个的不太多,但是也简单。这里就不具体写了。

3.2.5 构造AbstractBaseRedisTemplete
package com.lidong.util;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.data.redis.core.RedisTemplate;
/**
 * 基础的RedisTemplete
 * @author lidong
 * @param <T>
 * @date 2017-1-5
 */
public abstract class AbstractBaseRedisTemplete<T> implements
        ApplicationContextAware {


    protected RedisTemplate<String,T>  redisTemplate;

     /** 
     * @Description RedisTemplate 
     * @param redisTemplate 
     */  
    public void setRedisTemplate(RedisTemplate<String,T> redisTemplate) {  
        this.redisTemplate = redisTemplate;  
    }  

    @Override
    public void setApplicationContext(ApplicationContext applicationContext)
            throws BeansException {
        @SuppressWarnings("unchecked")
        RedisTemplate<String,T> redisTemplate = applicationContext.getBean(  
                "redisTemplate", RedisTemplate.class);  
        setRedisTemplate(redisTemplate); 
    }

}

Spring-Data-Redis的使用基本最常用 的就是这三种类型value类型、List类型、Set类型。

代码地址

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
19天前
|
存储 NoSQL Java
使用lock4j-redis-template-spring-boot-starter实现redis分布式锁
通过使用 `lock4j-redis-template-spring-boot-starter`,我们可以轻松实现 Redis 分布式锁,从而解决分布式系统中多个实例并发访问共享资源的问题。合理配置和使用分布式锁,可以有效提高系统的稳定性和数据的一致性。希望本文对你在实际项目中使用 Redis 分布式锁有所帮助。
50 5
|
1月前
|
消息中间件 NoSQL Java
Spring Boot整合Redis
通过Spring Boot整合Redis,可以显著提升应用的性能和响应速度。在本文中,我们详细介绍了如何配置和使用Redis,包括基本的CRUD操作和具有过期时间的值设置方法。希望本文能帮助你在实际项目中高效地整合和使用Redis。
57 2
|
2月前
|
NoSQL Java Redis
redis的基本命令,并用netty操作redis(不使用springboot或者spring框架)就单纯的用netty搞。
这篇文章介绍了Redis的基本命令,并展示了如何使用Netty框架直接与Redis服务器进行通信,包括设置Netty客户端、编写处理程序以及初始化Channel的完整示例代码。
69 1
redis的基本命令,并用netty操作redis(不使用springboot或者spring框架)就单纯的用netty搞。
|
2月前
|
缓存 NoSQL Java
Spring Boot与Redis:整合与实战
【10月更文挑战第15天】本文介绍了如何在Spring Boot项目中整合Redis,通过一个电商商品推荐系统的案例,详细展示了从添加依赖、配置连接信息到创建配置类的具体步骤。实战部分演示了如何利用Redis缓存提高系统响应速度,减少数据库访问压力,从而提升用户体验。
126 2
|
1月前
|
JavaScript NoSQL Java
CC-ADMIN后台简介一个基于 Spring Boot 2.1.3 、SpringBootMybatis plus、JWT、Shiro、Redis、Vue quasar 的前后端分离的后台管理系统
CC-ADMIN后台简介一个基于 Spring Boot 2.1.3 、SpringBootMybatis plus、JWT、Shiro、Redis、Vue quasar 的前后端分离的后台管理系统
46 0
|
2月前
|
前端开发 Java 应用服务中间件
【Spring】Spring MVC的项目准备和连接建立
【Spring】Spring MVC的项目准备和连接建立
64 2
|
2月前
|
NoSQL Java Redis
在 Spring 中操作 Redis
本文详细介绍了在Spring框架中如何通过引入依赖、配置文件、使用StringRedisTemplate类以及执行原生命令等方式来操作Redis数据库,并提供了对String、List、Set、Hash和ZSet数据类型的操作示例。
98 0
在 Spring 中操作 Redis
|
2月前
|
XML 前端开发 Java
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
本文阐述了Spring、Spring Boot和Spring MVC的关系与区别,指出Spring是一个轻量级、一站式、模块化的应用程序开发框架,Spring MVC是Spring的一个子框架,专注于Web应用和网络接口开发,而Spring Boot则是对Spring的封装,用于简化Spring应用的开发。
180 0
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
|
3月前
|
NoSQL 网络协议 Java
[Redis] 渐进式遍历+使用jedis操作Redis+使用Spring操作Redis
[Redis] 渐进式遍历+使用jedis操作Redis+使用Spring操作Redis
53 7
|
3月前
|
NoSQL Java 网络安全
[Redis] 渐进式遍历+使用jedis操作Redis+使用Spring操作Redis
[Redis] 渐进式遍历+使用jedis操作Redis+使用Spring操作Redis