Spring boot中使用Redis

本文介绍了SpringBoot中Redis的集成与应用,包括配置步骤、典型应用场景如缓存管理和分布式session共享。

SpringBoot对常用的数据库支持外,对NoSQL 数据库也进行了封装自动化。

redis介绍

Redis是目前业界使用最广泛的内存数据存储。相比memcached,Redis支持更丰富的数据结构,例如hashes, lists, sets等,同时支持数据持久化。除此之外,Redis还提供一些类数据库的特性,比如事务,HA,主从库。可以说Redis兼具了缓存系统和数据库的一些特性,因此有着丰富的应用场景。本文介绍Redis在Spring Boot中两个典型的应用场景。

Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。

Redis 与其他 key - value 缓存产品有以下三个特点:

  • Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
  • Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
  • Redis支持数据的备份,即master-slave模式的数据备份。

Redis 优势

  • 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
  • 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
  • 原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
  • 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。

Redis与其他key-value存储有什么不同?

  • Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。

  • Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。


具体redis的入门学习 推荐菜鸟教程,很全面!http://www.runoob.com/redis/redis-tutorial.html 

 


那么,在Spring boot中如何使用redis呢

1.引入资源jar (maven形式) 

    <dependency>  

        <groupId>org.springframework.boot</groupId>  

        <artifactId>spring-boot-starter-redis</artifactId>  

    </dependency>

2.添加配置信息(radis相关属性配置)

    # REDIS (RedisProperties)

    # Redis数据库索引(默认为0)

    spring.redis.database=0 

    # Redis服务器地址

    spring.redis.host=192.168.0.58

    # 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=0

 

3、添加cache的配置类

    @Configuration

    @EnableCaching

    public class RedisConfig extends CachingConfigurerSupport{

         

        @Bean

        public KeyGenerator keyGenerator() {

            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();

                }

            };

        }

     

        @SuppressWarnings("rawtypes")

        @Bean

        public CacheManager cacheManager(RedisTemplate redisTemplate) {

            RedisCacheManager rcm = new RedisCacheManager(redisTemplate);

            //设置缓存过期时间

            //rcm.setDefaultExpiration(60);//秒

            return rcm;

        }

         

        @Bean

        public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {

            StringRedisTemplate template = new StringRedisTemplate(factory);

            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);

            template.afterPropertiesSet();

            return template;

        }

     

    }

至此,spring boot中 redis 配置相关和加载相关的操作已经完成

4.如何使用 redis

    @RunWith(SpringJUnit4ClassRunner.class)

    @SpringApplicationConfiguration(Application.class)

    public class TestRedis {

     

        @Autowired

        private StringRedisTemplate stringRedisTemplate;

         

        @Autowired

        private RedisTemplate redisTemplate;

     

        @Test

        public void test() throws Exception {

            stringRedisTemplate.opsForValue().set("aaa", "111");

            Assert.assertEquals("111", stringRedisTemplate.opsForValue().get("aaa"));

        }

         

        @Test

        public void testObj() throws Exception {

            User user=new User("aa@126.com", "aa", "aa123456", "aa","123");

            ValueOperations<String, User> operations=redisTemplate.opsForValue();

            operations.set("com.neox", user);

            operations.set("com.neo.f", user,1,TimeUnit.SECONDS);

            Thread.sleep(1000);

            //redisTemplate.delete("com.neo.f");

            boolean exists=redisTemplate.hasKey("com.neo.f");

            if(exists){

                System.out.println("exists is true");

            }else{

                System.out.println("exists is false");

            }

           // Assert.assertEquals("aa", operations.get("com.neo.f").getUserName());

        }

    }

5、自动根据方法生成缓存

    @RequestMapping("/getUser")

    @Cacheable(value="user-key")

    public User getUser() {

        User user=userRepository.findByUserName("aa");

        System.out.println("若下面没出现“无缓存的时候调用”字样且能打印出数据表示测试成功");  

        return user;

    }

其中value的值就是缓存到redis中的key。

 

2.共享Session-spring-session-data-redis

分布式系统中,sessiong共享有很多的解决方案,其中托管到缓存中应该是最常用的方案之一。

Spring Session官方说明

Spring Session provides an API and implementations for managing a user’s session information.

如何使用

1、引入依赖

    <dependency>

        <groupId>org.springframework.session</groupId>

        <artifactId>spring-session-data-redis</artifactId>

    </dependency>

2、Session配置:

    @Configuration

    @EnableRedisHttpSession(maxInactiveIntervalInSeconds = 86400*30)

    public class SessionConfig {

    }

maxInactiveIntervalInSeconds: 设置Session失效时间,使用Redis Session之后,原Boot的server.session.timeout属性不再生效

好了,这样就配置好了,我们来测试一下

    @RequestMapping("/uid")

        String uid(HttpSession session) {

            UUID uid = (UUID) session.getAttribute("uid");

            if (uid == null) {

                uid = UUID.randomUUID();

            }

            session.setAttribute("uid", uid);

            return session.getId();

        }

登录redis 输入 keys ‘*sessions*’

t<spring:session:sessions:db031986-8ecc-48d6-b471-b137a3ed6bc4

t(spring:session:expirations:1472976480000

 

其中 1472976480000为失效时间,意思是这个时间后session失效,db031986-8ecc-48d6-b471-b137a3ed6bc4 为sessionId,登录http://localhost:8080/uid 发现会一致,就说明session 已经在redis里面进行有效的管理了。

如何在两台或者多台中共享session

其实就是按照上面的步骤在另一个项目中再次配置一次,启动后自动就进行了session共享。

示例代码:

https://github.com/ityouknow/spring-boot-examples

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值