# springboot-advanced-redis **Repository Path**: springboot_advancement/springboot-advanced-redis ## Basic Information - **Project Name**: springboot-advanced-redis - **Description**: springboot集成redis ,及redis常用方法使用说明 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2019-05-28 - **Last Updated**: 2021-04-01 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ### [redis教程(redis安装及使用请点击这里)](http://www.runoob.com/redis/redis-intro.html) ### [springboot官方文档](http://spring.io/projects/spring-boot) ### [项目地址](https://gitee.com/springboot_advancement/springboot-advanced-redis) ### Redis 优势 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。 原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。 ### springboot 提供了 redis操作工具包 ``` org.springframework.boot spring-boot-starter-data-redis ``` application.yml 配置如下 ``` spring: application: # 服务名 name: advanced #redis配置数据 redis: hostName: 123.206.19.217 port: 6379 database: 10 password: pool: maxActive: 10 maxWait: -1 maxIdle: 100 minIdle: 0 timeout: 5000 server: # 服务端口 port: 9001 ``` 第一步:@Bean创建redis工具的实例 ``` package com.advanced.config.redis; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; 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.GenericJackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; import redis.clients.jedis.JedisPoolConfig; @Configuration public class RedisConfig { @Bean(name = "jedisPoolConfig") @ConfigurationProperties(prefix = "spring.redis.pool") public JedisPoolConfig jedisPoolConfig() { JedisPoolConfig config = new JedisPoolConfig(); return config; } @Bean(name = "jedisConnectionFactory") @ConfigurationProperties(prefix = "spring.redis") public JedisConnectionFactory jedisConnectionFactory(JedisPoolConfig jedisPoolConfig) { JedisConnectionFactory factory = new JedisConnectionFactory(); JedisPoolConfig config = jedisPoolConfig; factory.setPoolConfig(config); return factory; } @Bean(name = "redisTemplate" ) public RedisTemplate getRedisTemplate(JedisConnectionFactory jedisConnectionFactory) { RedisTemplate redisTemplate = new StringRedisTemplate(jedisConnectionFactory); redisTemplate.setKeySerializer(new StringRedisSerializer()); // key的序列化类型 redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer()); // value的序列化类型 // 设置启用事务支持 redisTemplate.setEnableTransactionSupport(true); return redisTemplate; } } ``` 这样在程序中就可以使用此实例来操作redis @Autowired public RedisTemplate redisTemplate; ### redis 方法介绍 同redis set命令对应方法 ``` // 将字符串值 value 关联到 key 存储至redis.如果redis库中有相同的key,key将被覆盖 redisTemplate.opsForValue().set("userName","Liuzhiqiang"); 等价于: set userName Liuzhiqiang // 将值 value 关联到 key ,并设置 key 的生存时间。 redisTemplate.opsForValue().set("userId",12, 10, TimeUnit.SECONDS); 等价于: SET userId 12 EX 10 ``` 同redis get命令对应方法 ``` // 根据key从redis中取出value redisTemplate.opsForValue().get("userName") 等价于 get userName // 根据key从redis中取出截取后value,value只能是字符串 // -1 为最后一位, -2为倒数第二位,以此类推 redisTemplate.opsForValue().get("userName",3, -1) 等价于 GETRANGE userName 3 -1 // 给key重新分配一个value并返回旧值 String str = (String) redisTemplate.opsForValue().getAndSet("userName", "wangyan") 等价于 GETSET userName wangyan ``` 同redis del对应方法 ``` // 根据key从redis库中删除 redisTemplate.delete("userName"); 等价于 del userName /** * 批量删除 */ List list = new ArrayList<>(); list.add("userName"); list.add("userId"); redisTemplate.delete(list); 等价于 DEL userName userId ``` ### redis事务在Java里应用 ``` // 设置启用事务支持 redisTemplate.setEnableTransactionSupport(true); ``` 声明事务 ``` redisTemplate.multi(); 等价于 MULTI ``` 执行所有事务块内的命令 ``` List list = redisTemplate.exec(); 等价于 exec ``` 取消事务 ``` redisTemplate.discard(); 等价于 discard ``` 监视一个(或多个) key ``` 如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断 redisTemplate.discard(); redisTemplate.watch("userName"); 等价于 WATCH userName List list = new ArrayList<>(); list.add("userName"); list.add("userId"); redisTemplate.watch(list); 等价于 WATCH userName userId ``` 取消 WATCH 命令对所有 key 的监视。 ``` redisTemplate.unwatch(); 等价于 UNWATCH ``` ### 示例代码 ``` package com.advanced.controller; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ResponseBody; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; /** * 开发公司:个人 * 版权:个人 *

* IndexController * * @author 刘志强 * @created Create Time: 2019/5/23 */ @Controller public class IndexController { @Autowired public RedisTemplate redisTemplate; private Logger logger = LoggerFactory.getLogger(getClass()); // 重定向至首页 @GetMapping("/") public void root(HttpServletResponse httpServletResponse) throws IOException { httpServletResponse.sendRedirect("/index"); } /** * * @param type 0 开启事务 1 放弃事务 * @return */ @GetMapping("/affair") @ResponseBody public Map affair(int type) { logger.info("=========================================事务 开始======================================"); /** * 开启一个事务 */ redisTemplate.multi(); redisTemplate.opsForValue().set ("11","11"); redisTemplate.opsForValue().set("22","22"); redisTemplate.opsForValue().set("33","33"); redisTemplate.opsForValue().get("11"); redisTemplate.opsForValue().get("22"); redisTemplate.opsForValue().get("33"); if (type == 0) { /** * 执行所有事务块内的命令。 */ List list = redisTemplate.exec(); list.forEach(o -> logger.info(o)); } else { /** * 取消事务,放弃执行事务块内的所有命令。如果正在使用 WATCH 命令监视某个(或某些) key,那么取消所有监视,等同于执行命令 UNWATCH 。 */ } return null; } @GetMapping("/index") @ResponseBody public Map index() { logger.info("=========================================get,set,del 开始======================================"); /** * 将字符串值 value 关联到 key 存储至redis.如果redis库中有相同的key,key将被覆盖 * 第一个参数 key * 第二个参数 value * 等同 SET */ redisTemplate.opsForValue().set("userName","Liuzhiqiang"); /** * 将值 value 关联到 key ,并设置 key 的生存时间。 * 第一个参数 key * 第二个参数 value * 第三个参数 生存时间 * 第四个参数 生存时间类型 * 等同 SETEX */ redisTemplate.opsForValue().set("userId",12, 10, TimeUnit.SECONDS); logger.info(String.valueOf(redisTemplate.opsForValue().get("userId"))); /** * 根据key从redis中取出value * 第一个参数 key * 等同 GET */ logger.info((String) redisTemplate.opsForValue().get("userName")); /** * 根据key从redis中取出截取后value,value只能是字符串 * 第一个参数 key * 第二个参数开始位置 * 第三个参数结束位置 -1 为最后一位, -2为倒数第二位,以此类推 */ logger.info(redisTemplate.opsForValue().get("userName",3, -1)); /** *给key重新分配一个value并返回旧值 * 第一个参数key * 第二个参数新的value */ String str = (String) redisTemplate.opsForValue().getAndSet("userName", "wangyan"); logger.info(str); logger.info((String) redisTemplate.opsForValue().get("userName")); /** * 根据key从redis库中删除 * 第一个参数 key * 等同 DEL */ redisTemplate.delete("userName"); logger.info((String) redisTemplate.opsForValue().get("userName")); List list = new ArrayList<>(); list.add("userName"); list.add("userId"); /** * 批量删除 */ redisTemplate.delete(list); logger.info((String) redisTemplate.opsForValue().get("userName")); logger.info((String) redisTemplate.opsForValue().get("userId")); logger.info("=========================================get,set,del 结束======================================"); return null; } } ```