spring boot 整合redis

redis简介

redis是一个开源的、高性能的key-value非关系型数据库,是为了解决高并发、高扩展,大数据存储等系列问题而产生的数据库解决方案。

redis提供了五种数据类型:

  1. string(字符串)
  2. list(双向链表)
  3. dict(hash表)
  4. set(集合)
  5. zset(排序set)

redis优点

  1. 读写速度快,它把数据都读取到内存中操作。
  2. 支持数据持久化到硬盘当中。
  3. 提供了丰富的数据结构。
  4. 所有操作都是原子性,支持事务。要么全部执行,要么不执行。
  5. 支持主从复制,主句会自动将数据同步到从机,可以进行读写分离。

spring boot 整合redis

redis环境: vmware运行centos7。

  1. 导入依赖坐标
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
  1. 配置
    客户端配置选择lettuce,因为redis start中引用的是它
spring:
  redis:
    # Redis数据库索引(默认为0)
    database: 2
    # Redis服务器地址
    host: 192.162.163.3
    # Redis服务器连接端口
    port: 6379
    # Redis服务器连接密码(默认为空)
    password: 123456
    # 连接超时时间(毫秒)
    timeout: 5000
    lettuce:
      pool:
        # 连接池最大连接数(使用负值表示没有限制)
        max-active: 200
        # 连接池最大阻塞等待时间(使用负值表示没有限制)
        max-wait: 10000
        # 连接池中的最大空闲连接
        max-idle: 200
        # 连接池中的最小空闲连接
        min-idle: 0
  1. 测试是否配置成功
@Autowired
StringRedisTemplate redisTemplate;
@Test
void test1(){
redisTemplate.opsForValue().set("cc","二狗蛋");
}

此时会报错,Error creating bean with name 'redisConnectionFactory'
原因:因为lettuce,依赖commons-pool2,所以引入该包即可。

<dependency>
   <groupId>org.apache.commons</groupId>
   <artifactId>commons-pool2</artifactId>
</dependency>

结果如下,说明已经整合成功
image

  1. 重新装配RedisTemplate
    查看源码,可知spring容器中已经自动生成了一个RedisTemplate和StringRedisTemplate实例,我们可以通过源码上的@ConditionalOnMissingBean,自己写个配置类,覆盖源码中的bean.
    image

  2. 具体操作

    1. 写配置类
      @Configuration
      public class RedisConfig {
      	/**
      	 * 自定义redisTemplate,就不会使用默认的redisTemplate
      	 */
      	@Bean(name = "redisTemplate")
      	public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
      		RedisTemplate<String,Object> redisTemplate = new RedisTemplate<>();
      		StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
      //        FastJsonRedisSerializer<Object> fastJsonRedisSerializer = new FastJsonRedisSerializer(Object.class);
      		FastJson2JsonRedisSerializer<Object> fastJsonRedisSerializer = new FastJson2JsonRedisSerializer<>(Object.class);
      		redisTemplate.setConnectionFactory(redisConnectionFactory);
      
      		//redis开启事务
      		redisTemplate.setEnableTransactionSupport(true);
      		redisTemplate.setKeySerializer(stringRedisSerializer);
      		//使用Fastjson2JsonRedisSerializer来序列化和反序列化redis的value值
      		redisTemplate.setValueSerializer(fastJsonRedisSerializer);
      		redisTemplate.setHashKeySerializer(stringRedisSerializer);
      		redisTemplate.setHashValueSerializer(fastJsonRedisSerializer);
      		redisTemplate.setDefaultSerializer(stringRedisSerializer);
      		redisTemplate.afterPropertiesSet();
      		return redisTemplate;
      	}
      }
      
      
    2. 写序列化类
      public class FastJson2JsonRedisSerializer<T> implements RedisSerializer<T> {
      
      	private Class<T> clazz;
      
      	static {
      		ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
      		//如果遇到反序列化autoType is not support错误,请添加并修改一下包名到bean文件路径
      		//ParserConfig.getGlobalInstance().addAccept("com.example.redisdemo.domain");
      	}
      
      	public FastJson2JsonRedisSerializer(Class<T> clazz){
      		super();
      		this.clazz = clazz;
      	}
      
      	@Override
      	public byte[] serialize(T t) throws SerializationException {
      		if (t ==null) {
      			return new byte[0];
      		}
      		return JSON.toJSONString(t, SerializerFeature.WriteClassName).getBytes(StandardCharsets.UTF_8);
      }
      
      	@Override
      	public T deserialize(byte[] bytes) throws SerializationException {
      		if (bytes == null || bytes.length <= 0){
      			return null;
      		}
      		String str = new String(bytes,StandardCharsets.UTF_8);
      		return JSON.parseObject(str,clazz);
      	}
      }
      
    3. 封装redis工具类(简单实现,可以自己补充)
      @Component
      	public class RedisUtil {
      		@Autowired
      		private RedisTemplate<String, Object> redisTemplate;
      
      
      		/**
      		 * 判断是否存在
      		 * @param key
      		 * @return
      		 */
      		public Boolean hasKey(String key) {
      			Boolean flag = false;
      			if (StringUtils.hasText(key)){
      				flag = redisTemplate.hasKey(key);
      			}
      			return flag;
      		}
      
      		/**
      		 * 添加
      		 * @param key
      		 * @param value
      		 */
      		public void set(String key,Object value){
      			redisTemplate.opsForValue().set(key,value);
      
      		}
      
      		/**
      		 * 获取
      		 * @param key
      		 * @return
      		 */
      		public Object get(String key){
      			return redisTemplate.opsForValue().get(key);
      		}
      
      		/**
      		 * 删除
      		 * @param key
      		 * @return
      		 */
      		public Boolean del(String key){
      		  return redisTemplate.delete(key);
      		}
      
      	}
      
    4. 执行测试类
      @Test
      void test1(){
      	System.out.println(redisUtil.hasKey("cc"));
      	System.out.println(redisUtil.del("cc"));
      	redisUtil.set("bb",serverConfig);
      }
      
      image
posted @   她与代码皆失  阅读(75)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示