springboot中redis的简单使用
springboot中简单使用redis
技术概述
需要操作庞大的临时数据,且并发量高时可以用redis缓存技术,该技术访问数据时速度远大于直接访问数据库,提高非持久化的数据访问与操作的效率,本文简单介绍java对redis的简单操作。
环境与工具
redis-x64-3.2.* ,RedisDesktopManager(图形化管理工具),已配置好的springboot工程
技术详述
第一步:redis的安装与配置
1、官网下载redis后安装,在解压的文件夹中找到redis中的redis.conf文件开始编辑
2、找到bind 127.0.0.1并注释掉,修改protected-mode 为no,用于开启ip访问。 修改daemonize属性 将no 改为yes,用于开启后台运行。
2、启动redis,并用RedisDesktopManager连接,查看连接情况
第二步:依赖与redis配置
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
## Redis 配置
redis:
## Redis数据库索引(默认为0)
database: 0
name: MyRedis
## Redis服务器地址
host: 127.0.0.1
## Redis服务器连接端口
port: 6379
## Redis服务器连接密码(默认为空)
password:
jedis:
pool:
## 连接池最大连接数(使用负值表示没有限制)
#spring.redis.pool.max-active=8
max-active: 8
## 连接池最大阻塞等待时间(使用负值表示没有限制)
#spring.redis.pool.max-wait=-1
max-wait: -1
## 连接池中的最大空闲连接
#spring.redis.pool.max-idle=8
max-idle: 8
## 连接池中的最小空闲连接
#spring.redis.pool.min-idle=0
min-idle: 0
## 连接超时时间(毫秒)
timeout: 1200
第三步:新建RedisConfig配置类
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {@Bean public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) { RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig() .entryTtl(Duration.ofHours(1)); // 设置缓存有效期一小时 return RedisCacheManager .builder(RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory)) .cacheDefaults(redisCacheConfiguration).build(); } @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); // 配置连接工厂 template.setConnectionFactory(factory); //使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式) Jackson2JsonRedisSerializer jacksonSeial = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper om = new ObjectMapper(); // 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); // 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常 om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jacksonSeial.setObjectMapper(om); // 值采用json序列化 template.setValueSerializer(jacksonSeial); //使用StringRedisSerializer来序列化和反序列化redis的key值 template.setKeySerializer(new StringRedisSerializer()); // 设置hash key 和value序列化模式 template.setHashKeySerializer(new StringRedisSerializer()); template.setHashValueSerializer(jacksonSeial); template.afterPropertiesSet(); return template; } @Bean public HashOperations<String, String, Object> hashOperations(RedisTemplate<String, Object> redisTemplate) { return redisTemplate.opsForHash(); } @Bean public ValueOperations<String, Object> valueOperations(RedisTemplate<String, Object> redisTemplate) { return redisTemplate.opsForValue(); } @Bean public ListOperations<String, Object> listOperations(RedisTemplate<String, Object> redisTemplate) { return redisTemplate.opsForList(); } @Bean public SetOperations<String, Object> setOperations(RedisTemplate<String, Object> redisTemplate) { return redisTemplate.opsForSet(); } @Bean public ZSetOperations<String, Object> zSetOperations(RedisTemplate<String, Object> redisTemplate) { return redisTemplate.opsForZSet(); }
}
第四步:在service层中注入bean(以下为项目代码例子)
@Service
public class UserService implements UserMapper {
@Autowired
private RedisTemplate redisTemplate;
public void deleteWanderUserByAccountNum(String accountNum){ //根据key删除记录
if (redisTemplate.hasKey(RedisConfig.WANDER_USER_LIST + accountNum)) redisTemplate.delete(RedisConfig.WANDER_USER_LIST + accountNum);
}
public void insertWaitStartPlayer(Player player){
ValueOperations<String, JSONObject> operations = redisTemplate.opsForValue();
JSONObject playerJsonObject = new JSONObject();
playerJsonObject.put("accountNum",player.getAccountNum());
playerJsonObject.put("inRoomNum",player.getInRoomNum());
if (redisTemplate.hasKey(RedisConfig.WAIT_START_USER_LIST + player.getAccountNum())) redisTemplate.delete(RedisConfig.WAIT_START_USER_LIST + player.getAccountNum());
operations.set(RedisConfig.WAIT_START_USER_LIST + player.getAccountNum(),playerJsonObject,RedisConfig.PLAY_WAITING_TIME,TimeUnit.MINUTES);
}
public void insertWonderUser(User user){ //插入一条记录
ValueOperations<String, User> operations = redisTemplate.opsForValue();
if (redisTemplate.hasKey(RedisConfig.WANDER_USER_LIST + user.getAccountNum())) redisTemplate.delete(RedisConfig.WANDER_USER_LIST + user.getAccountNum());
operations.set(RedisConfig.WANDER_USER_LIST + user.getAccountNum(),user,6,TimeUnit.HOURS);
}
public JSONObject getWaitStartPlayerByAccountNum(String accountNum){ //根据value获取Key
ValueOperations<String, JSONObject> operations = redisTemplate.opsForValue();
JSONObject res = operations.get(RedisConfig.WAIT_START_USER_LIST + accountNum);
return res;
}
}
第五步:在controller层注入使用
总结:
redis的安装与配置 --> 导入依赖与配置redis --> 新建RedisConfig配置类 --> 在service层中注入bean ->在controller层注入使用