目录
一、为什么要使用Redis
简介
redis是Nosql数据库中使用较为广泛的非关系型内存数据库,redis内部是一个key-value存储系统。它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set –有序集合)和hash(哈希类型,类似于Java中的map)。Redis基于内存运行并支持持久化的NoSQL数据库,是当前最热门的NoSql数据库之一,也被人们称为数据结构服务器。
-
二、安装和配置Redis
三、SpringBoot简单应用Redis
添加maven依赖
<!-- redis --> <dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-redis</artifactId> </dependency> <!-- jedis --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version> </dependency>
application.properties配置redis信息
#redis spring.redis.hostName: localhost spring.redis.port: 6379 spring.redis.password:
springboot应用主入口开启缓存
package com.zk.kfcloud; import com.alibaba.fastjson.JSONObject; import com.zk.kfcloud.Exception.MenuCreateException; import com.zk.kfcloud.Utils.wechat.CustomerMenu; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCaching; import org.springframework.transaction.annotation.EnableTransactionManagement; @EnableCaching //开启缓存 @EnableTransactionManagement // 开启事务管理 @SpringBootApplication @MapperScan("com.zk.kfcloud.Dao") public class KfcloudApplication { public static void main(String[] args) { SpringApplication.run(KfcloudApplication.class, args); KfcloudApplication.creatMenu(); } }
这样其实就已经简单配置好redis了
测试一下
contoller层
@RestController public class testRedis { @GetMapping("/testRedis") public String uid(HttpSession session) { UUID uid = (UUID) session.getAttribute("uid"); if (uid == null) { uid = UUID.randomUUID(); } session.setAttribute("uid", uid); return session.getId(); } }
启动redis
四、SpringBoot高级应用Redis
其实也就是,结合redisTemplate来使用redis
项目目录结构
增加集成redistemplate配置
@Slf4j @Configuration @EnableAutoConfiguration public class RedisConfig { //获取springboot配置文件的值 (get的时候获取) @Value("${spring.redis.hostName}") private String host; @Value("${spring.redis.password}") private String password; /** * @Bean 和 @ConfigurationProperties * 该功能在官方文档是没有提到的,我们可以把@ConfigurationProperties和@Bean和在一起使用。 * 举个例子,我们需要用@Bean配置一个Config对象,Config对象有a,b,c成员变量需要配置, * 那么我们只要在yml或properties中定义了a=1,b=2,c=3, * 然后通过@ConfigurationProperties就能把值注入进Config对象中 * @return */ @Bean @ConfigurationProperties(prefix = "spring.redis.pool") public JedisPoolConfig getRedisConfig() { JedisPoolConfig config = new JedisPoolConfig(); return config; } @Bean @ConfigurationProperties(prefix = "spring.redis") public JedisConnectionFactory getConnectionFactory() { JedisConnectionFactory factory = new JedisConnectionFactory(); factory.setUsePool(true); JedisPoolConfig config = getRedisConfig(); factory.setPoolConfig(config); log.info("JedisConnectionFactory bean init success."); return factory; } @Bean public RedisTemplate<?, ?> getRedisTemplate() { JedisConnectionFactory factory = getConnectionFactory(); log.info(this.host+","+factory.getHostName()+","+factory.getDatabase()); log.info(this.password+","+factory.getPassword()); log.info(String.valueOf(factory.getPoolConfig().getMaxIdle())); RedisTemplate<?, ?> template = new StringRedisTemplate(getConnectionFactory()); return template; } }
RedisService
public interface RedisService { public boolean set(final String key, final String value); public String get(final String key); public <T> boolean setList(String key, List<T> list); public <T> List<T> getList(String key, Class<T> clz); public long lpush(final String key, Object obj); public long rpush(final String key, Object obj); public String lpop(final String key); public boolean expire(final String key, long expire); }
RedisServiceImpl(即redistemplate的工具类)
@Service public class RedisServiceImpl implements RedisService { @Resource private RedisTemplate<String, ?> redisTemplate; @Override public boolean set(final String key, final String value) { boolean result = redisTemplate.execute(new RedisCallback<Boolean>() { @Override public Boolean doInRedis(RedisConnection connection) throws DataAccessException { RedisSerializer<String> serializer = redisTemplate.getStringSerializer(); connection.set(serializer.serialize(key), serializer.serialize(value)); return true; } }); return result; } @Override public String get(final String key){ String result = redisTemplate.execute(new RedisCallback<String>() { @Override public String doInRedis(RedisConnection connection) throws DataAccessException { RedisSerializer<String> serializer = redisTemplate.getStringSerializer(); byte[] value = connection.get(serializer.serialize(key)); return serializer.deserialize(value); } }); return result; } @Override public boolean expire(final String key, long expire) { return redisTemplate.expire(key, expire, TimeUnit.SECONDS); } @Override public <T> boolean setList(String key, List<T> list) { String value = JSON.toJSONString(list); return set(key,value); } @Override public <T> List<T> getList(String key, Class<T> clz) { String json = get(key); if(json!=null){ List<T> list = JSON.parseArray(json, clz); return list; } return null; } @Override public long lpush(final String key, Object obj) { final String value = JSON.toJSONString(obj); long result = redisTemplate.execute(new RedisCallback<Long>() { @Override public Long doInRedis(RedisConnection connection) throws DataAccessException { RedisSerializer<String> serializer = redisTemplate.getStringSerializer(); long count = connection.lPush(serializer.serialize(key), serializer.serialize(value)); return count; } }); return result; } @Override public long rpush(final String key, Object obj) { final String value = JSON.toJSONString(obj); long result = redisTemplate.execute(new RedisCallback<Long>() { @Override public Long doInRedis(RedisConnection connection) throws DataAccessException { RedisSerializer<String> serializer = redisTemplate.getStringSerializer(); long count = connection.rPush(serializer.serialize(key), serializer.serialize(value)); return count; } }); return result; } @Override public String lpop(final String key) { String result = redisTemplate.execute(new RedisCallback<String>() { @Override public String doInRedis(RedisConnection connection) throws DataAccessException { RedisSerializer<String> serializer = redisTemplate.getStringSerializer(); byte[] res = connection.lPop(serializer.serialize(key)); return serializer.deserialize(res); } }); return result; } }
测试controller
@RestController public class testRedis { @Autowired private RedisService redisService; @GetMapping("/testRedis") public String uid(HttpSession session) { UUID uid = (UUID) session.getAttribute("uid"); if (uid == null) { uid = UUID.randomUUID(); } redisService.set("sessionid",String.valueOf(uid)); redisService.set("word", "正在使用Redis高级功能。。。"); return session.getId(); } }
启动redis,查看效果