博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Redis在Spring Boot中的应用
阅读量:6092 次
发布时间:2019-06-20

本文共 6912 字,大约阅读时间需要 23 分钟。

最近项目中用到Redis,上网查了很多示例,发现或多或少都有问题。踩过很多坑,终于在Spring Boot中成功实现了Redis存储。记录如下,方便别人,也方便自己。

Redis(REmote DIctionary Server) 是一个由Salvatore Sanfilippo写的key-value存储系统。Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。

Redis安装

至于在服务器上如何搭建Redis存储系统,本文就不在赘述,网上相关教程很多,请自行Google。如果要实现Redis可远程连接,需要注意一下几点:

  1. 配置文件redis.conf设置Redis可远程访问
  2. 设置登录密码
  3. 设置Redis可在后台运行
  4. 开启防火墙端口,Redis默认端口为6379
  5. 建议设置为开机自启动

Spring Boot中Redis应用

1. 引入依赖

pom.xml文件中依赖如下

org.springframework.boot
spring-boot-starter-data-redis

2. 配置文件

可以利用配置文件进行设置,也可以直接通过注释配置。配置文件application.yml如下:

spring:  # REDIS (RedisProperties)  redis:    # Redis服务器地址    host: 192.168.1.197    # Redis服务器连接端口    port: 6379    pool:      # 连接池中的最大空闲连接      max-idle: 8      # 连接池中的最小空闲连接      min-idle: 0      # 连接池最大连接数(使用负值表示没有限制)      max-active: 8      # 连接池最大阻塞等待时间(使用负值表示没有限制)      max-wait: -1    # 连接超时时间(毫秒)    timeout: 0    # Redis数据库索引(默认为0)    database: 0    # Redis服务器连接密码(默认为空)    password: your-password

3. 定义RedisTemplate

package com.ygingko.utest.config;import com.ygingko.utest.config.redis.RedisObjectSerializer;import com.ygingko.utest.entity.dto.UserDTO;import org.springframework.beans.factory.annotation.Value;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.PropertySource;import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.data.redis.serializer.StringRedisSerializer;import redis.clients.jedis.JedisPoolConfig;@Configuration@PropertySource("classpath:application.yml")public class RedisConfig {    @Value("${spring.redis.host}")    private String host;    @Value("${spring.redis.port}")    private int port;    @Value("${spring.redis.password}")    private String password;    @Value("${spring.redis.database}")    private int database;    @Value("${spring.redis.timeout}")    private int timeout;    @Value("${spring.redis.pool.max-active}")    private int maxActive;    @Value("${spring.redis.pool.max-idle}")    private int maxIdle;    @Value("${spring.redis.pool.min-idle}")    private int minIdle;    @Value("${spring.redis.pool.max-wait}")    private long maxWait;    @Bean    JedisConnectionFactory jedisConnectionFactory() {        JedisConnectionFactory factory = new JedisConnectionFactory();        factory.setHostName(host);        factory.setPort(port);        factory.setPassword(password);        factory.setDatabase(database);        factory.setTimeout(timeout);        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();        jedisPoolConfig.setMaxTotal(maxActive);        jedisPoolConfig.setMaxIdle(maxIdle);        jedisPoolConfig.setMinIdle(minIdle);        jedisPoolConfig.setMaxWaitMillis(maxWait);        factory.setPoolConfig(jedisPoolConfig);        return factory;    }    @Bean    public RedisTemplate
redisTemplate() { RedisTemplate
template = new RedisTemplate<>(); template.setConnectionFactory(jedisConnectionFactory()); template.setKeySerializer(new StringRedisSerializer()); template.setValueSerializer(new RedisObjectSerializer()); return template; }}

4. 实现RedisSerializer接口

package com.ygingko.utest.config.redis;import org.springframework.core.convert.converter.Converter;import org.springframework.core.serializer.support.DeserializingConverter;import org.springframework.core.serializer.support.SerializingConverter;import org.springframework.data.redis.serializer.RedisSerializer;import org.springframework.data.redis.serializer.SerializationException;public class RedisObjectSerializer implements RedisSerializer {    private Converter
serializer = new SerializingConverter(); private Converter
deserializer = new DeserializingConverter(); private static final byte[] EMPTY_ARRAY = new byte[0]; @Override public byte[] serialize(Object o) throws SerializationException { if (o == null) { return EMPTY_ARRAY; } try { return serializer.convert(o); } catch (Exception e) { return EMPTY_ARRAY; } } @Override public Object deserialize(byte[] bytes) throws SerializationException { if (isEmpty(bytes)) { return null; } try { return deserializer.convert(bytes); } catch (Exception e) { throw new SerializationException("Cannot deserialize ", e); } } private boolean isEmpty(byte[] data) { return (data == null || data.length == 0); }}

5. 存数对象

存储对象必须实现Serializable接口,有固定的serialVersionUID。如下:

package com.ygingko.utest.entity.dto;import com.alibaba.fastjson.JSON;import java.io.Serializable;public class UserDTO implements Serializable {    private static final long serialVersionUID = 4044555734385804034L;    private Integer uid;    private String name;    private String password;    private Integer level;    public Integer getUid() {        return uid;    }    public void setUid(Integer uid) {        this.uid = uid;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String getPassword() {        return password;    }    public void setPassword(String password) {        this.password = password;    }    public Integer getLevel() {        return level;    }    public void setLevel(Integer level) {        this.level = level;    }    @Override    public String toString() {        return JSON.toJSONString(this);    }}

6. 应用示例

package com.ygingko.utest;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.BeanUtils;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.test.context.junit4.SpringRunner;import redis.clients.jedis.Jedis;import java.util.ArrayList;import java.util.List;@RunWith(SpringRunner.class)@SpringBootTestpublic class UtestApplicationTests {    @Autowired    private RedisTemplate
redisTemplate; @Test public void testRedis() throws Exception { UserDTO userBean = new UserDTO(); userBean.setUid(1001); userBean.setName("huang"); userBean.setLevel(1); redisTemplate.opsForValue().set("token", userBean); System.out.println(redisTemplate.opsForValue().get("token")); } @Test public void contextLoads() { Jedis jedis = new Jedis("192.168.1.197", 6379); System.out.println("****************" + jedis.ping()); }}

转载于:https://www.cnblogs.com/hthuang/p/7930551.html

你可能感兴趣的文章
SQL中的连接可以分为内连接,外连接,以及交叉连接 。
查看>>
请把我风干成你的回忆
查看>>
Python&HDF5目录
查看>>
Vue -- 双向过滤器去除html标签
查看>>
H5禁止底部横向滚动条,使一个元素居中
查看>>
android 的安全问题
查看>>
skatebroads
查看>>
一些常用的命令和cheat sheet
查看>>
转----------数据库常见笔试面试题 - Hectorhua的专栏 - CSDN博客
查看>>
Android 界面设计 java.lang.NullPointerException 异常的解决方法
查看>>
解决ctrl+shift+F快捷键eclipse格式化与输入法简繁转换冲突问题
查看>>
kali在vbox上运行设置共享文件夹
查看>>
【观点】程序员的七大坏毛病
查看>>
一起谈.NET技术,Mono向Mac OS应用程序开发示好
查看>>
一起谈.NET技术,C#调试心经(续)
查看>>
是否该让开发人员跟客户直接交流
查看>>
艾伟_转载:ASP.NET实现类似Excel的数据透视表
查看>>
计算机组成原理-第3章-3.4
查看>>
Spring学习(16)--- 基于Java类的配置Bean 之 基于泛型的自动装配(spring4新增)...
查看>>
实验八 sqlite数据库操作
查看>>