千家信息网

SpringBoot集成redis的示例分析

发表于:2024-12-13 作者:千家信息网编辑
千家信息网最后更新 2024年12月13日,这篇文章给大家分享的是有关SpringBoot集成redis的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。如何使用springBoot集成redis定义REmot
千家信息网最后更新 2024年12月13日SpringBoot集成redis的示例分析

这篇文章给大家分享的是有关SpringBoot集成redis的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

如何使用springBoot集成redis
定义

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

以下是Redis的一些优点。

异常快 - Redis非常快,每秒可执行大约110000次的设置(SET)操作,每秒大约可执行81000次的读取/获取(GET)操作。
支持丰富的数据类型 - Redis支持开发人员常用的大多数数据类型,例如列表,集合,排序集和散列等等。这使得Redis很容易被用来解决各种问题,因为我们知道哪些问题可以更好使用地哪些数据类型来处理解决。
操作具有原子性 - 所有Redis操作都是原子操作,这确保如果两个客户端并发访问,Redis服务器能接收更新的值。
多实用工具 - Redis是一个多实用工具,可用于多种用例,如:缓存,消息队列(Redis本地支持发布/订阅),应用程序中的任何短期数据,例如,web应用程序中的会话,网页命中计数等。

Redis 安装

Window 下安装
下载地址:https://github.com/MSOpenTech/redis/releases。
Redis 支持 32 位和 64 位。这个需要根据你系统平台的实际情况选择,这里我们下载 Redis-x64-xxx.zip压缩包到 C 盘,解压后,将文件夹重新命名为 redis。

打开一个 cmd 窗口 使用cd命令切换目录到 C:\redis
运行 redis-server.exe redis.windows.conf
如果想方便的话,可以把 redis 的路径加到系统的环境变量里,这样就省得再输路径了,后面的那个 redis.windows.conf 可以省略,如果省略,会启用默认的。输入之后,会显示如下界面:

集成redis

我们还是延用上一章的项目:Springboot集成springcloud-config实现dataSource热部署

1、添加依赖

    org.springframework.boot    spring-boot-starter-redis    1.4.1.RELEASE    com.alibaba    fastjson    1.2.3    com.fasterxml.jackson.core    jackson-databind

2、在配置中心里添加redis配置

spring.redis.host=127.0.0.1#Redis服务器连接端口spring.redis.port=6379#Redis服务器连接密码(默认为空)spring.redis.password=#连接池最大连接数(使用负值表示没有限制)spring.redis.pool.max-active=8#连接池最大阻塞等待时间(使用负值表示没有限制)spring.redis.pool.max-wait=-1#连接池中的最大空闲连接spring.redis.pool.max-idle=8#连接池中的最小空闲连接spring.redis.pool.min-idle=0#连接超时时间(毫秒)spring.redis.timeout=30000

3、配置类RedisConfig

import java.lang.reflect.Method;import org.springframework.beans.factory.annotation.Value;import org.springframework.cache.CacheManager;import org.springframework.cache.annotation.CachingConfigurerSupport;import org.springframework.cache.annotation.EnableCaching;import org.springframework.cache.interceptor.KeyGenerator;import org.springframework.cloud.context.config.annotation.RefreshScope;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.data.redis.cache.RedisCacheManager;import org.springframework.data.redis.connection.RedisConnectionFactory;import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.data.redis.core.StringRedisTemplate;import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.annotation.JsonAutoDetect;import com.fasterxml.jackson.databind.ObjectMapper;@Configuration@EnableCaching@RefreshScopepublic class RedisConfig extends CachingConfigurerSupport{    @Value("${spring.redis.host}")    private String host;    @Value("${spring.redis.port}")    private int port;    @Value("${spring.redis.timeout}")    private int timeout;    @Value("${spring.redis.password}")    private String password;    @Value("${spring.redis.pool.max-active}")    private int maxActive;    @Value("${spring.redis.pool.max-wait}")    private int maxWait;    @Value("${spring.redis.pool.max-idle}")    private int maxIdle;    @Value("${spring.redis.pool.min-idle}")    private int minIdle;        @RefreshScope    @Bean    public KeyGenerator wiselyKeyGenerator(){        return new KeyGenerator() {            @Override            public Object generate(Object target, Method method, Object... params) {                StringBuilder sb = new StringBuilder();                sb.append(target.getClass().getName());                sb.append(method.getName());                for (Object obj : params) {                    sb.append(obj.toString());                }                return sb.toString();            }        };    }        @RefreshScope    @Bean    public JedisConnectionFactory redisConnectionFactory() {        JedisConnectionFactory factory = new JedisConnectionFactory();        factory.setHostName(host);        factory.setPort(port);        factory.setTimeout(timeout); //设置连接超时时间        factory.setPassword(password);        factory.getPoolConfig().setMaxIdle(maxIdle);        factory.getPoolConfig().setMinIdle(minIdle);        factory.getPoolConfig().setMaxTotal(maxActive);        factory.getPoolConfig().setMaxWaitMillis(maxWait);        return factory;    }        @RefreshScope    @Bean    public CacheManager cacheManager(RedisTemplate redisTemplate) {        RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate);        // Number of seconds before expiration. Defaults to unlimited (0)        cacheManager.setDefaultExpiration(10); //设置key-value超时时间        return cacheManager;    }        @RefreshScope    @Bean    public RedisTemplate redisTemplate(RedisConnectionFactory factory) {        StringRedisTemplate template = new StringRedisTemplate(factory);        setSerializer(template); //设置序列化工具,这样ReportBean不需要实现Serializable接口        template.afterPropertiesSet();        return template;    }        @RefreshScope    private void setSerializer(StringRedisTemplate template) {        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);        ObjectMapper om = new ObjectMapper();        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);        jackson2JsonRedisSerializer.setObjectMapper(om);        template.setValueSerializer(jackson2JsonRedisSerializer);    }}

4、RedisUtils类

import java.io.Serializable;import java.util.List;import java.util.Set;import java.util.concurrent.TimeUnit;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.redis.core.HashOperations;import org.springframework.data.redis.core.ListOperations;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.data.redis.core.SetOperations;import org.springframework.data.redis.core.ValueOperations;import org.springframework.data.redis.core.ZSetOperations;import org.springframework.stereotype.Service;@Servicepublic class RedisUtils {    @Autowired    private RedisTemplate redisTemplate;    /**     * 写入缓存     * @param key     * @param value     * @return     */    public boolean set(final String key, Object value) {        boolean result = false;        try {            ValueOperations operations = redisTemplate.opsForValue();            operations.set(key, value);            result = true;        } catch (Exception e) {            e.printStackTrace();        }        return result;    }    /**     * 写入缓存设置时效时间     * @param key     * @param value     * @return     */    public boolean set(final String key, Object value, Long expireTime ,TimeUnit timeUnit) {        boolean result = false;        try {            ValueOperations operations = redisTemplate.opsForValue();            operations.set(key, value);            redisTemplate.expire(key, expireTime, timeUnit);            result = true;        } catch (Exception e) {            e.printStackTrace();        }        return result;    }    /**     * 批量删除对应的value     * @param keys     */    public void remove(final String... keys) {        for (String key : keys) {            remove(key);        }    }    /**     * 批量删除key     * @param pattern     */    public void removePattern(final String pattern) {        Set keys = redisTemplate.keys(pattern);        if (keys.size() > 0){            redisTemplate.delete(keys);        }    }    /**     * 删除对应的value     * @param key     */    public void remove(final String key) {        if (exists(key)) {            redisTemplate.delete(key);        }    }    /**     * 判断缓存中是否有对应的value     * @param key     * @return     */    public boolean exists(final String key) {        return redisTemplate.hasKey(key);    }    /**     * 读取缓存     * @param key     * @return     */    public Object get(final String key) {        Object result = null;        ValueOperations operations = redisTemplate.opsForValue();        result = operations.get(key);        return result;    }    /**     * 哈希 添加     * @param key     * @param hashKey     * @param value     */    public void hmSet(String key, Object hashKey, Object value){        HashOperations hash = redisTemplate.opsForHash();        hash.put(key,hashKey,value);    }    /**     * 哈希获取数据     * @param key     * @param hashKey     * @return     */    public Object hmGet(String key, Object hashKey){        HashOperations  hash = redisTemplate.opsForHash();        return hash.get(key,hashKey);    }    /**     * 列表添加     * @param k     * @param v     */    public void lPush(String k,Object v){        ListOperations list = redisTemplate.opsForList();        list.rightPush(k,v);    }    /**     * 列表获取     * @param k     * @param l     * @param l1     * @return     */    public List lRange(String k, long l, long l1){        ListOperations list = redisTemplate.opsForList();        return list.range(k,l,l1);    }    /**     * 集合添加     * @param key     * @param value     */    public void add(String key,Object value){        SetOperations set = redisTemplate.opsForSet();        set.add(key,value);    }    /**     * 集合获取     * @param key     * @return     */    public Set setMembers(String key){        SetOperations set = redisTemplate.opsForSet();        return set.members(key);    }    /**     * 有序集合添加     * @param key     * @param value     * @param scoure     */    public void zAdd(String key,Object value,double scoure){        ZSetOperations zset = redisTemplate.opsForZSet();        zset.add(key,value,scoure);    }    /**     * 有序集合获取     * @param key     * @param scoure     * @param scoure1     * @return     */    public Set rangeByScore(String key,double scoure,double scoure1){        ZSetOperations zset = redisTemplate.opsForZSet();        return zset.rangeByScore(key, scoure, scoure1);    }

5、测试,修改controller

import java.util.concurrent.TimeUnit;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import com.chenqi.springboot.redis.RedisUtils;import com.chenqi.springboot.service.TestService;@RestControllerpublic class SpringBootController {        public static final Logger log = LoggerFactory.getLogger(SpringBootController.class);        @Autowired    TestService testService;        @Autowired    private RedisUtils redisUtils;    @RequestMapping(value = "/hello/{id}")    public String hello(@PathVariable(value = "id") String id){        //查询缓存中是否存在        boolean hasKey = redisUtils.exists(id);        String str = "";        if(hasKey){            //获取缓存            Object object =  redisUtils.get(id);            log.info("从缓存获取的数据"+ object);            str = object.toString();        }else{            //从数据库中获取信息            log.info("从数据库中获取数据");            str = testService.test();            //数据插入缓存(set中的参数含义:key值,user对象,缓存存在时间10(long类型),时间单位)            redisUtils.set(id,str,10L,TimeUnit.MINUTES);            log.info("数据插入缓存" + str);        }        return str;    }}

启动项目,第一次访问:http://localhost:8002/hello/111


通过控制台输出,我们可以看到是从数据库中获取的数据,并且存入了redis缓存中。

我们再次刷新浏览器

可以看到,第二次是从缓存中读取的,我们试试不断刷新浏览器


感谢各位的阅读!关于"SpringBoot集成redis的示例分析"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

0