tags: [springboot,redis]
categories: [中间件]
前言
这两天做项目上也用到这块,自己在解决自己项目上问题时也用到,其中关于序列化和基本使用这块,重复犯了一些错误,耽误不少时间,所以记录下来
SpringBoot版本:2.2.6 Redis版本:5.0.8 已安装好了Redis于服务器上
基本配置使用
引入依赖
值得注意的是 springboot2.0使用依赖为spring-boot-starter-data-redis,后面依赖commons-pool2是使用lettuce需要的,使用之前的jedis来操作也是可以的,这里没有这么做
<!--redis--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!--redis lettuce--><dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId></dependency>
配置文件
建议为Redis配置密码,防止被清数据,另外可以设置Redis自启
redis:database: 0password: 密码host: IPport: 端口lettuce:pool:max-active: 100max-idle: 10max-wait: 3000timeout: 5000
配置类
在这里设置了默认的序列化方式
如不设置,Redis默认会使用JdkSerializationRedisSerializer来执行序列化,这种序列化方式的缺点在于被序列化的对象必须实现序列化接口,否则会报错
序列化
事实上它也支持序列化为xml格式,只是现如今基本不用该数据格式了,序列化为JSON格式,有使用FastJSON或者Jackson的,我本就是Jackson的忠实用户,自然是使用Jackson来序列化,所以使用GenericJackson2JsonRedisSerializer来序列化对象,但是听说Jackson不支持JAVA8的LocalDate,我还没验证过
到目前为止,我还是认为StringRedisSerializer这种序列化方式是最方便的,即使是对象存入,我们只需要在存入之前将对象序列化,取出来后再反序列化就行了,一般的对象序列化,若存入string字符串,会在外层继续加上一个””,我们存入”string”,后面会变为””string””,导致难以阅读
我目前只用到了string和HASH两种数据结构,这里只有这两种~
@Configurationpublic class RedisConfig {/*** TODO: 使用泛型接受** @param connectionFactory connectionFactory* @return RedisTemplate*/@Beanpublic RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory connectionFactory) {RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();redisTemplate.setKeySerializer(new StringRedisSerializer());redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());redisTemplate.setHashKeySerializer(new StringRedisSerializer());redisTemplate.setHashValueSerializer(new StringRedisSerializer());redisTemplate.setConnectionFactory(connectionFactory);return redisTemplate;}@Beanpublic StringRedisTemplate stringRedisTemplate(LettuceConnectionFactory connectionFactory) {StringRedisTemplate stringRedisTemplate = new StringRedisTemplate();stringRedisTemplate.setKeySerializer(new StringRedisSerializer());stringRedisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());stringRedisTemplate.setHashKeySerializer(new StringRedisSerializer());stringRedisTemplate.setHashValueSerializer(new StringRedisSerializer());stringRedisTemplate.setConnectionFactory(connectionFactory);return stringRedisTemplate;}}
到这里我们已经可以使用上面的StringRedisTemplate和RedisTemplate来存取数据了,但是为了简化操作,最好还是能对常用redis操作做一些封装,以下是我做项目中用到的一些基本操作
工具类
@Componentpublic class RedisUtil {@Resourceprivate RedisTemplate<String, Object> redisTemplate;@Resourceprivate RedisTemplate<String, String> stringStringRedisTemplate;/*** 删除key** @param key key*/public void delete(String key) {redisTemplate.delete(key);}/*** 批量删除key** @param keys keys*/public void delete(Collection<String> keys) {redisTemplate.delete(keys);}/*** 是否存在key** @param key key* @return Boolean*/public Boolean hasKey(String key) {return redisTemplate.hasKey(key);}/*** 取值** @param key key* @return value*/public String get(String key){return stringStringRedisTemplate.opsForValue().get(key);}/*** 存入KEY并设置过期时间** @param key key* @param value value* @param seconds 时间* @param timeUnit 单位*/public void setKeyWithExpired(String key, String value, int seconds, TimeUnit timeUnit){stringStringRedisTemplate.opsForValue().set(key, value, seconds, timeUnit);}/*** 存入HASH 并设置key value** @param hash hash* @param hKey hKey* @param hValue hValue*/public void hashPutKey(String hash, String hKey, String hValue){redisTemplate.opsForHash().put(hash, hKey, hValue);}/*** 获取指定hash下指定key的value* @param hash hash* @param hKey hKey* @return obj*/public Object hashGetKey(String hash, String hKey){return redisTemplate.opsForHash().get(hash, hKey);}/*** 存入HASH 并设置key value** @param hash hash* @return Map<Object, Object>*/public Map<Object, Object> hashEntries(String hash){return stringStringRedisTemplate.opsForHash().entries(hash);}}
