赞
踩
每次springboot整合redis的时候总时要到处找资料,所以整理一下springboot整合redis的相关重要的配置进行记录
省的下次还要到处找百度
由于对redis的学习并不是很深入,所以只是配置单击版的redis
以后有时间整理redis集群和持久化相关的操作
# 服务器端口 server: port: 8888 # Spring Boot 的数据源配置 spring: redis: database: 0 host: localhost # Redis服务器地址 port: 6379 # Redis服务器连接端口 password: # Redis服务器连接密码(默认为空) pool: max-active: 200 # 连接池最大连接数(使用负值表示没有限制) max-idle: 10 # 连接池中的最大空闲连接 max-wait: -1 # 连接池最大阻塞等待时间(使用负值表示没有限制) min-idle: 0 # 连接池中的最小空闲连接 timeout: 1000 # 连接超时时间(毫秒) datasource: url: jdbc:mysql://localhost:3306/use_redis?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 username: root password: root driver-class-name: com.mysql.jdbc.Driver # 使用druid数据源 type: com.alibaba.druid.pool.DruidDataSource filters: stat maxActive: 20 initialSize: 1 maxWait: 60000 minIdle: 1 timeBetweenEvictionRunsMillis: 60000 minEvictableIdleTimeMillis: 300000 validationQuery: select 'x' testWhileIdle: true testOnBorrow: false testOnReturn: false poolPreparedStatements: true maxPoolPreparedStatementPerConnectionSize: 20 maxOpenPreparedStatements: 20 mybatis-plus: # xml扫描,多个目录用逗号或者分号分隔(告诉 Mapper 所对应的 XML 文件位置) mapper-locations: classpath:mapper/*.xml global-config: #字段策略 0:"忽略判断",1:"非 NULL 判断"),2:"非空判断" field-strategy: 1 configuration: # 是否将sql打印到控制面板(该配置会将sql语句和查询的结果都打印到控制台) log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # PageHelper分页插件 pagehelper: helperDialect: mysql reasonable: true supportMethodsArguments: true params: count=countSql
需要配置的也就是
spring:
redis:
database: 0
host: localhost # Redis服务器地址
port: 6379 # Redis服务器连接端口
password: # Redis服务器连接密码(默认为空)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
//用来获取springboot创建好的工厂 @Component // 此类必须交给springboot管理 public class ApplicationContextUtils implements ApplicationContextAware { // 保留下来工厂 private static ApplicationContext applicationContext; // 将创建好工厂以参数形式传递给这个类 @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { ApplicationContextUtils.applicationContext = applicationContext; } // 根据类在工厂的唯一id从spring容器中获取javabean public static Object getBeanById(String beanName) { return applicationContext.getBean(beanName); } // 根据class的名字从spring容器中获取javabean public static <T> T getBeanByName(Class<T> targetClass) { return applicationContext.getBean(targetClass); } }
说明:
根据value和hashvleus的序列化方式不同
我遇到收集了两种配置类
还有JdkSerializationRedisSerializer是jdk序列化方式,实体类要实现序列化接口
序列化方式使用的是StringRedisSerializer
redis的配置类 有两种配置类 @Configuration //当前类为配置类 public class RedisConfig { @Bean //redisTemplate注入到Spring容器 public RedisTemplate<String,String> redisTemplate(RedisConnectionFactory factory){ RedisTemplate<String,String> redisTemplate=new RedisTemplate<>(); RedisSerializer<String> redisSerializer = new StringRedisSerializer(); redisTemplate.setConnectionFactory(factory); //key序列化 redisTemplate.setKeySerializer(redisSerializer); //value序列化 redisTemplate.setValueSerializer(redisSerializer); //value hashmap序列化 redisTemplate.setHashKeySerializer(redisSerializer); //key hashmap序列化 redisTemplate.setHashValueSerializer(redisSerializer); return redisTemplate; } }
@Slf4j @Configuration public class RedisConfig { @Bean @SuppressWarnings("all") public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) { RedisTemplate<String, Object> template = new RedisTemplate<String, Object>(); template.setConnectionFactory(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); StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); // key采用String的序列化方式 template.setKeySerializer(stringRedisSerializer); // hash的key也采用String的序列化方式 template.setHashKeySerializer(stringRedisSerializer); // value序列化方式采用jackson template.setValueSerializer(jackson2JsonRedisSerializer); // hash的value序列化方式采用jackson template.setHashValueSerializer(jackson2JsonRedisSerializer); template.afterPropertiesSet(); return template; } }
@Slf4j public class RedisCache implements Cache { private String id; public RedisCache(String id) { log.info("当前的缓存id: [{}]",id); this.id = id; } @Override public String getId() { return this.id; } @Override//放入redis缓存 public void putObject(Object key, Object value) { log.info("放入缓存key:[{}] 放入缓存的value:[{}]",key,value); getRedisTemplate().opsForHash().put(id,key.toString(),value); } @Override//从redis缓存获取 public Object getObject(Object key) { log.info("获取缓存的key:[{}]",key.toString()); return getRedisTemplate().opsForHash().get(id,key.toString()); } @Override//删除指定缓存信息 public Object removeObject(Object o) { return null; } @Override//清除缓存 public void clear() { log.info("清除所有缓存信息..."); getRedisTemplate().delete(id); } @Override public int getSize() { return getRedisTemplate().opsForHash().size(id).intValue(); } //封装获取redistemplate的方法 public RedisTemplate getRedisTemplate(){ RedisTemplate redisTemplate = (RedisTemplate) ApplicationContextUtils.getBean("redisTemplate"); redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setHashKeySerializer(new StringRedisSerializer()); return redisTemplate; } }
@Component public class RedisUtil { @Autowired private RedisTemplate<String, Object> redisTemplate; /** * 判断 key 是否存在 * * @param key 键 * @return 如果存在 key 则返回 true,否则返回 false */ public Boolean exists(String key) { return redisTemplate.hasKey(key); } /** * 获取 Key 的类型 * * @param key 键 */ public String type(String key) { DataType dataType = redisTemplate.type(key); assert dataType != null; return dataType.code(); } /** * 指定缓存失效时间 * * @param key 键 * @param time 时间(秒) * @return 30 */ public boolean expire(String key, long time) { try { if (time > 0) { redisTemplate.expire(key, time, TimeUnit.SECONDS); } return true; } catch (Exception e) { e.printStackTrace(); return false; } } /** * 根据key 获取过期时间 * * @param key 键 不能为null * @return 时间(秒) 返回0代表为永久有效 */ public long getExpire(String key) { return redisTemplate.getExpire(key, TimeUnit.SECONDS); } /** * 判断key是否存在 * * @param key 键 * @return true 存在 false不存在 */ public boolean hasKey(String key) { try { return redisTemplate.hasKey(key); } catch (Exception e) { e.printStackTrace(); return false; } } /** * 删除 key * * @param key 键 */ public Long delete(String... key) { if (key == null || key.length < 1) { return 0L; } return redisTemplate.delete(Arrays.asList(key)); } /** * 获取所有的keys * * @return */ public Set<String> keys() { Set<String> keys1 = redisTemplate.keys("*"); return keys1; } /** * 获取所有的keys得所有的值 * * @param keys * @return */ public HashMap<Object, Object> getKeysValue(String keys) { Set<String> keys1 = redisTemplate.keys("*"); HashMap<Object, Object> hashMap = new HashMap<Object, Object>(); for (String s : keys1) { Object o = redisTemplate.opsForValue().get(keys + s); System.out.println("o=" + o); hashMap.put(keys1, o); } return hashMap; } /** * 删除缓存 * * @param key 可以传一个值 或多个 */ public void del(String... key) { if (key != null && key.length > 0) { if (key.length == 1) { redisTemplate.delete(key[0]); } else { redisTemplate.delete(CollectionUtils.arrayToList(key)); } } } // ============================String============================= /** * 普通缓存获取 * * @param key 键 * @return 值 */ public Object get(String key) { return key == null ? null : redisTemplate.opsForValue().get(key); } /** * 普通缓存放入 * * @param key 键 * @param value 值 * @return true成功 false失败 */ public boolean set(String key, Object value) { try { redisTemplate.opsForValue().set(key, value); return true; } catch (Exception e) { e.printStackTrace(); return false; } } /** * 普通缓存放入并设置时间 * * @param key 键 * @param value 值 * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 * @return true成功 false 失败 */ public boolean set(String key, Object value, long time) { try { if (time > 0) { redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); } else { set(key, value); } return true; } catch (Exception e) { e.printStackTrace(); return false; } } /** * 递增 * * @param key 键 * @param delta 要增加几(大于0) * @return */ public long incr(String key, long delta) { if (delta < 0) { throw new RuntimeException("递增因子必须大于0"); } return redisTemplate.opsForValue().increment(key, delta); } /** * 递减 * * @param key 键 * @param delta 要减少几(小于0) * @return */ public long decr(String key, long delta) { if (delta < 0) { throw new RuntimeException("递减因子必须大于0"); } return redisTemplate.opsForValue().increment(key, -delta); } // ================================Map================================= /** * HashGet * * @param key 键 不能为null * @param item 项 不能为null * @return 值 */ public Object hget(String key, String item) { return redisTemplate.opsForHash().get(key, item); } /** * 获取hashKey对应的所有键值 * * @param key 键 * @return 对应的多个键值 */ public Map<Object, Object> hmget(String key) { return redisTemplate.opsForHash().entries(key); } /** * HashSet * * @param key 键 * @param map 对应多个键值 * @return true 成功 false 失败 */ public boolean hmset(String key, Map<String, Object> map) { try { redisTemplate.opsForHash().putAll(key, map); return true; } catch (Exception e) { e.printStackTrace(); return false; } } /** * HashSet 并设置时间 * * @param key 键 * @param map 对应多个键值 * @param time 时间(秒) * @return true成功 false失败 */ public boolean hmset(String key, Map<String, Object> map, long time) { try { redisTemplate.opsForHash().putAll(key, map); if (time > 0) { expire(key, time); } return true; } catch (Exception e) { e.printStackTrace(); return false; } } /** * 向一张hash表中放入数据,如果不存在将创建 * * @param key 键 * @param item 项 * @param value 值 * @return true 成功 false失败 */ public boolean hset(String key, String item, Object value) { try { redisTemplate.opsForHash().put(key, item, value); return true; } catch (Exception e) { e.printStackTrace(); return false; } } /** * 向一张hash表中放入数据,如果不存在将创建 * * @param key 键 * @param item 项 * @param value 值 * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 * @return true 成功 false失败 */ public boolean hset(String key, String item, Object value, long time) { try { redisTemplate.opsForHash().put(key, item, value); if (time > 0) { expire(key, time); } return true; } catch (Exception e) { e.printStackTrace(); return false; } } /** * 删除hash表中的值 * * @param key 键 不能为null * @param item 项 可以使多个 不能为null */ public void hdel(String key, Object... item) { redisTemplate.opsForHash().delete(key, item); } /** * 判断hash表中是否有该项的值 * * @param key 键 不能为null * @param item 项 不能为null * @return true 存在 false不存在 */ public boolean hHasKey(String key, String item) { return redisTemplate.opsForHash().hasKey(key, item); } /** * hash递增 如果不存在,就会创建一个 并把新增后的值返回 * * @param key 键 * @param item 项 * @param by 要增加几(大于0) * @return 274 */ public double hincr(String key, String item, double by) { return redisTemplate.opsForHash().increment(key, item, by); } /** * hash递减 * * @param key 键 * @param item 项 * @param by 要减少记(小于0) * @return 285 */ public double hdecr(String key, String item, double by) { return redisTemplate.opsForHash().increment(key, item, -by); } // ============================set============================= /** * 根据key获取Set中的所有值 * * @param key 键 * @return 295 */ public Set<Object> sGet(String key) { try { return redisTemplate.opsForSet().members(key); } catch (Exception e) { e.printStackTrace(); return null; } } /** * 根据value从一个set中查询,是否存在 * * @param key 键 * @param value 值 * @return true 存在 false不存在 */ public boolean sHasKey(String key, Object value) { try { return redisTemplate.opsForSet().isMember(key, value); } catch (Exception e) { e.printStackTrace(); return false; } } /** * 将数据放入set缓存 * * @param key 键 * @param values 值 可以是多个 * @return 成功个数 */ public long sSet(String key, Object... values) { try { return redisTemplate.opsForSet().add(key, values); } catch (Exception e) { e.printStackTrace(); return 0; } } /** * 将set数据放入缓存 * * @param key 键 * @param time 时间(秒) * @param values 值 可以是多个 * @return 成功个数 */ public long sSetAndTime(String key, long time, Object... values) { try { Long count = redisTemplate.opsForSet().add(key, values); if (time > 0) expire(key, time); return count; } catch (Exception e) { e.printStackTrace(); return 0; } } /** * 获取set缓存的长度 * * @param key 键 * @return */ public long sGetSetSize(String key) { try { return redisTemplate.opsForSet().size(key); } catch (Exception e) { e.printStackTrace(); return 0; } } /** * 移除值为value的 * * @param key 键 * @param values 值 可以是多个 * @return 移除的个数 */ public long setRemove(String key, Object... values) { try { Long count = redisTemplate.opsForSet().remove(key, values); return count; } catch (Exception e) { e.printStackTrace(); return 0; } } // ===============================list================================= /** * 获取list缓存的内容 * * @param key 键 * @param start 开始 * @param end 结束 0 到 -1代表所有值 * @return */ public List<Object> lGet(String key, long start, long end) { try { return redisTemplate.opsForList().range(key, start, end); } catch (Exception e) { e.printStackTrace(); return null; } } /** * 获取list缓存的内容 * * @param key 键 * @param start 开始 * @param end 结束 0 到 -1代表所有值 * @return */ public List<Object> getList(String key, long start, long end) { try { return redisTemplate.opsForList().range(key, start, end); } catch (Exception e) { e.printStackTrace(); return null; } } /** * 获取list缓存的长度 * * @param key 键 * @return */ public long lGetListSize(String key) { try { return redisTemplate.opsForList().size(key); } catch (Exception e) { e.printStackTrace(); return 0; } } /** * 通过索引 获取list中的值 * * @param key 键 * @param index 索引 index>=0时, 0 表头,1 第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推 * @return */ public Object lGetIndex(String key, long index) { try { return redisTemplate.opsForList().index(key, index); } catch (Exception e) { e.printStackTrace(); return null; } } /** * 将list放入缓存 * * @param key 键 * @param value 值 * @return */ public boolean lSet(String key, Object value) { try { redisTemplate.opsForList().rightPush(key, value); return true; } catch (Exception e) { e.printStackTrace(); return false; } } /** * 将list放入缓存 * * @param key 键 * @param value 值 * @param time 时间(秒) * @return */ public boolean lSet(String key, Object value, long time) { try { redisTemplate.opsForList().rightPush(key, value); if (time > 0) expire(key, time); return true; } catch (Exception e) { e.printStackTrace(); return false; } } /** * 将list放入缓存 * * @param key 键 * @param value 值 * @return */ public boolean lSet(String key, List<Object> value) { try { redisTemplate.opsForList().rightPushAll(key, value); return true; } catch (Exception e) { e.printStackTrace(); return false; } } /** * 将list放入缓存 * * @param key 键 * @param value 值 * @param time 时间(秒) * @return */ public boolean lSet(String key, List<Object> value, long time) { try { redisTemplate.opsForList().rightPushAll(key, value); if (time > 0) expire(key, time); return true; } catch (Exception e) { e.printStackTrace(); return false; } } /** * 根据索引修改list中的某条数据 * * @param key 键 * @param index 索引 * @param value 值 * @return */ public boolean lUpdateIndex(String key, long index, Object value) { try { redisTemplate.opsForList().set(key, index, value); return true; } catch (Exception e) { e.printStackTrace(); return false; } } /** * 移除N个值为value * * @param key 键 * @param count 移除多少个 * @param value 值 * @return 移除的个数 */ public long lRemove(String key, long count, Object value) { try { Long remove = redisTemplate.opsForList().remove(key, count, value); return remove; } catch (Exception e) { e.printStackTrace(); return 0; } } }
第一步:准备安装环境,安装c相关的依赖 yum install gcc-c++ 第二步:下载解压安装包 # 我这里装的是4.0版本 # 下载地址https://redis.io 第三步:解压文件夹,到/usr/local tar -zxvf redis-4.0.10.tar.gz mv redis-4.0.10/ /usr/local/ 第四步:安装编译redis # 到redis安装目录 cd /usr/local/redis-4.0.10 make MALLOC=libc make install 第五步:配置redis.config,可以远程访问redis # 修改redis.config文件,修改bin为bind 0.0.0.0 cd /usr/local/redis-4.0.10 vim redis.conf # 将 bind 配置成0.0.0.0,允许任意服务器来访问 redis 第六步:启动redis cd /usr/local/redis-4.0.10 redis-server ./redis.conf 第七步:远程访问redis #两种方式 #第一种 # 我用window的redis-cli进行访问 redis-cli -h host -p port -a password --raw # -a password 是指明密码,如果不设置密码可以省略 # --raw是防止中文乱码的配置,最好带上 #第二种 # 使用redis图形化界面工具Redis Desktop进行连接 # 关闭防火墙 systemctl stop firewalld 第八步:简单命令进行测试 # 登录redis客户端 #(1)用ping命令看是否回应pong 127.0.0.1:6379> ping PONG #(2)set a aaa get a aaa #(3)set b 测试中文乱码 get b 测试中文乱码 #(4)操作数据库 - 清空当前的库 FLUSHDB - 清空全部的库 FLUSHALL ##到此redis安装成功,可以进行下一步学习以及集群的配置
import java.util.ArrayList; import java.util.List; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.JdkSerializationRedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; import com.shaoming.entity.User; import com.shaoming.util.ApplicationContextUtils; import com.shaoming.util.JacksonUtil; import com.shaoming.util.RedisUtil; import cn.hutool.core.collection.CollectionUtil; import redis.clients.jedis.Jedis; @SpringBootTest // springboot的单元测试类的注解 public class TestRedis { @Autowired private Jedis jedis; @Autowired private StringRedisTemplate stringRedisTemplate; @Autowired private RedisTemplate redisTemplate; @Autowired private RedisUtil redisUtil; /** * jedis的测试 */ // 把数据存入redis @Test public void testSaveDataByRedis() { jedis.set("a", "aaa"); } //从redis中取出数据 @Test public void testGetDataByRedis() { String string = jedis.get("a"); System.out.println(string); } // 把json数据存入redis @Test public void testSaveJsonDataToRedis() { User user = new User(); user.setAge(18); user.setName("测试的name的值"); ArrayList<User> userList = CollectionUtil.newArrayList(user, user, user); String userListJson = JacksonUtil.obj2String(userList); jedis.set("userList", userListJson); } // 从redis数据库获取json数据 @Test public void testGetJsonDataFromRedis() { String json = jedis.get("userList"); System.out.println(json); List<User> userList = JacksonUtil.string2Obj(json, ArrayList.class, User.class); System.out.println(userList); } @Test public void testReisPing() { String ping = jedis.ping(); System.out.println(ping); } /** * 操作StringRedisTemplate */ // 操作string @Test public void testStringRedisTemplateSetString() { User user = new User(); user.setAge(18); user.setName("测试的name的值"); ArrayList<User> userList = CollectionUtil.newArrayList(user, user, user); String userListJson = JacksonUtil.obj2String(userList); stringRedisTemplate.opsForValue().set("userList", userListJson); } @Test public void testStringRedisTemplateGetString() { String json = stringRedisTemplate.opsForValue().get("userList"); System.out.println(json); List<User> userList = JacksonUtil.string2Obj(json, ArrayList.class, User.class); System.out.println(userList); } // 操作hash @Test public void testStringRedisTemplateSetHash() { User user = new User(); user.setAge(18); user.setName("测试的name的值"); ArrayList<User> userList = CollectionUtil.newArrayList(user, user, user); String userListJson = JacksonUtil.obj2String(userList); stringRedisTemplate.opsForHash().put("userListKey", "userList", userListJson); } @Test public void testStringRedisTemplateGetHash() { String json = (String) stringRedisTemplate.opsForHash().get("userListKey", "userList"); System.out.println(json); List<User> userList = JacksonUtil.string2Obj(json, ArrayList.class, User.class); System.out.println(userList); } /** * 操作RedisTemplate */ // 使用的是Jackson2JsonredisSerializer @Test public void testRedisTemplateStringSet() { User user = new User(); user.setAge(18); user.setName("测试的name的值"); ArrayList<User> userList = CollectionUtil.newArrayList(user, user, user); // String userListJson = JacksonUtil.obj2String(userList); /** * RedisTemplate的k-v都是存放的对象 */ StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); redisTemplate.setKeySerializer(stringRedisSerializer); Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); redisTemplate.setValueSerializer(jackson2JsonRedisSerializer); redisTemplate.opsForValue().set("userList", userList); } @Test public void testRedisTemplateStringGet() { StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); redisTemplate.setKeySerializer(stringRedisSerializer); Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); redisTemplate.setValueSerializer(jackson2JsonRedisSerializer); Object userList = redisTemplate.opsForValue().get("userList"); System.out.println(userList); } // 使用JdkSerializationRedisSerializer @Test public void testRedisTemplateStringSetByJdkSerializationRedisSerializer() { User user = new User(); user.setAge(18); user.setName("测试的name的值"); ArrayList<User> userList = CollectionUtil.newArrayList(user, user, user); StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); JdkSerializationRedisSerializer jdkSerializationRedisSerializer = new JdkSerializationRedisSerializer(); redisTemplate.setKeySerializer(stringRedisSerializer); redisTemplate.setValueSerializer(jdkSerializationRedisSerializer); redisTemplate.opsForValue().set("userList", userList); } @Test public void testRedisTemplateStringGetByJdkSerializationRedisSerializer() { StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); JdkSerializationRedisSerializer jdkSerializationRedisSerializer = new JdkSerializationRedisSerializer(); redisTemplate.setKeySerializer(stringRedisSerializer); redisTemplate.setValueSerializer(jdkSerializationRedisSerializer); Object userList = redisTemplate.opsForValue().get("userList"); System.out.println(userList); } /** * 测试redis的工具类RedisUtil */ @Test public void testRedisUtilSet() { User user = new User(); user.setAge(18); user.setName("测试的name的值"); ArrayList<User> userList = CollectionUtil.newArrayList(user, user, user); redisUtil.set("userList", userList,10); } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。