Jedis和springboot整合

本文介绍了使用Java的Jedis库操作Redis的基本步骤,包括连接、命令执行、事务处理以及SpringBoot中整合SpringData Redis的配置和使用。还展示了如何解决中文乱码问题并自定义RedisTemplate进行对象序列化。最后讨论了Jedis与Lettuce在多线程安全性和性能上的差异。
摘要由CSDN通过智能技术生成

jedis

使用java来操作redis
jedis是redis官方推荐的Java连接开发工具。

1.导入依赖

 <dependencies>
    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
        <version>3.6.0</version>
    </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.76</version>
        </dependency>
    </dependencies>

2.编码测试

  • 链接数据库
  • 操作命令
  • 断开链接
  public static void main(String[] args) {
        //1.new 一个Jedis对象
        Jedis jedis = new Jedis("127.0.0.1",6379);
        //jedis 所有命令就是我们之前学得
        System.out.println(jedis.ping());
    }

输出
在这里插入图片描述

public class TestKey {
    public static void main(String[] args) {
        Jedis jedis = new Jedis("127.0.0.1",6379);
        System.out.println("清空数据:"+jedis.flushDB());
        System.out.println("判断某个数据是否存在:"+jedis.exists("uname"));
        System.out.println("新增uname:beibei:"+jedis.set("uname","beibei"));
        System.out.println("新增upass:beibeimima:"+jedis.set("upass","beibeimima"));
        System.out.println("随机返回key控件的一个:"+jedis.randomKey());
        System.out.println("系统中所有建:"+jedis.keys("*"));
        Set<String> keys = jedis.keys("*");
        System.out.println(keys);
        System.out.println("删除key,upass:"+jedis.del("upass"));
        System.out.println("判断某个key,upass是否存在:"+jedis.exists("upass"));
        System.out.println("查看key,uname的类型:"+jedis.type("uname"));
        System.out.println("重命名key:"+jedis.rename("uname","uname1"));
        System.out.println("取出更改后的name:"+jedis.get("uname1"));
        System.out.println("切换库1:"+jedis.select(1));
        System.out.println("取出更改后的name:"+jedis.get("uname1"));
        System.out.println("新增uname:beibei:"+jedis.set("uname","beibei"));
        System.out.println("取出uname:"+jedis.get("uname"));
        System.out.println("删除当前数据库:"+jedis.flushDB());
        System.out.println("当前库大小:"+jedis.dbSize());
        System.out.println("切换库0:"+jedis.select(0));
        System.out.println("当前库0大小:"+jedis.dbSize());
        System.out.println("切换库1:"+jedis.select(1));
        System.out.println("删除所有数据库:"+jedis.flushAll());
        System.out.println("切换库0:"+jedis.select(0));
        System.out.println("当前库0大小:"+jedis.dbSize());
    }
}

输出:
在这里插入图片描述
事务

public class TestTX {
    public static void main(String[] args) {
        Jedis jedis = new Jedis("127.0.0.1",6379);
        jedis.flushDB();
        JSONObject jsonObject = new JSONObject();
        jedis.set("uname","beiebi");
        jsonObject.put("money",100);
        jsonObject.put("out",0);
        Transaction multi= jedis.multi();//开启事务
        String result = jsonObject.toJSONString();
       try{
           multi.set("bank1",result);
           multi.set("bank2",result);
          //int i = 1/0;//代码抛出异常,执行失败,输出为null

           multi.exec();//执行事务
       } catch (Exception e){
           multi.discard();
       }finally {
           System.out.println(jedis.get("bank1"));
           System.out.println(jedis.get("bank2"));
           jedis.close();//关闭连接
       }
    }
}

正常输出:
在这里插入图片描述
抛错输出
在这里插入图片描述

Springboot整合

springBoot操作数据:spring data, jpa, jdbc,monggodb,redis
SpringData也是和springboot齐名的项目
说明:在springboot2.x之后,原来使用的jedis被替换为lettuce
jedis:采用的直连,多个线程操作的话,是不安全的,如果想要避免不安全的,使用jedis pool连接池!(类似于BIO)
lettuce:采用用netty(可以看lettuce引用的netty),实例可以在多个线程中进行共享,不存在线程不安全的情况!可以减少线程数据了,更像NIO模式

源码分析:
在这里插入图片描述
找到redis
在这里插入图片描述

@Configuration(
    proxyBeanMethods = false
)
@ConditionalOnClass({RedisOperations.class})
@EnableConfigurationProperties({RedisProperties.class})
@Import({LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class})
public class RedisAutoConfiguration {
    public RedisAutoConfiguration() {
    }

    @Bean
    //如果不存在才启用这个,可以自己写一个去替换
    @ConditionalOnMissingBean(
        name = {"redisTemplate"}
    )
    @ConditionalOnSingleCandidate(RedisConnectionFactory.class)
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
       //默认的RedisTemplate没有过多的设置,redis对象都是需要序列化的
       //两个泛型都是object,object的类型,我们使用string,Object需要强制转换
        RedisTemplate<Object, Object> template = new RedisTemplate();
        template.setConnectionFactory(redisConnectionFactory);
        return template;
    }

    @Bean
    @ConditionalOnMissingBean
    @ConditionalOnSingleCandidate(RedisConnectionFactory.class)
    //由于string是最常使用的,单独提出来一个bean
    public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
        StringRedisTemplate template = new StringRedisTemplate();
        template.setConnectionFactory(redisConnectionFactory);
        return template;
    }
}

整合测试

  • 导入依赖
  • 配置连接
spring.redis.host=127.0.0.1
spring.redis.port=6379
  • 测试
@SpringBootTest
class Redis02SpringbootApplicationTests {

	@Autowired
	private RedisTemplate redisTemplate;
	@Test
	void contextLoads() {
		/**
		 * opsForValue 操作string
		 * opsForHash 操作hash
		 * opsForList 操作list
		 * opsForSet 操作set
		 * opsForZSet
		 * opsForHyperLogLog
		 * opsForGeo
		 */
		//除了基本的操作,我们常用的方法都可以直接通过redisTemplate操作,比如事务和基本的CRUD
		//获取redis的连接对象,
		/*RedisConnection redisConnection = redisTemplate.getConnectionFactory().getConnection();
		redisConnection.flushDb();
		redisConnection.flushAll();*/

		redisTemplate.opsForValue().set("mykey","beibei贝贝");
		System.out.println(redisTemplate.opsForValue().get("mykey"));
	}
}

输出:
在这里插入图片描述

中文乱码问题:
在这里插入图片描述
java代码中设置了mykey beibei贝贝
用窗口查看时mykey前有一堆乱码,需要将其序列化来解决

在这里插入图片描述

 public void afterPropertiesSet() {
        super.afterPropertiesSet();
        boolean defaultUsed = false;
        if (this.defaultSerializer == null) {
        //默认的序列化方式是jdk序列化,我们可能会使用Json来序列化
            this.defaultSerializer = new JdkSerializationRedisSerializer(this.classLoader != null ? this.classLoader : this.getClass().getClassLoader());
        }

        if (this.enableDefaultSerializer) {
            if (this.keySerializer == null) {
                this.keySerializer = this.defaultSerializer;
                defaultUsed = true;
            }

            if (this.valueSerializer == null) {
                this.valueSerializer = this.defaultSerializer;
                defaultUsed = true;
            }

            if (this.hashKeySerializer == null) {
                this.hashKeySerializer = this.defaultSerializer;
                defaultUsed = true;
            }

            if (this.hashValueSerializer == null) {
                this.hashValueSerializer = this.defaultSerializer;
                defaultUsed = true;
            }
        }

        if (this.enableDefaultSerializer && defaultUsed) {
            Assert.notNull(this.defaultSerializer, "default serializer null and not all serializers initialized");
        }

        if (this.scriptExecutor == null) {
            this.scriptExecutor = new DefaultScriptExecutor(this);
        }

        this.initialized = true;
    }

关于对象的保存:
在这里插入图片描述

在这里插入图片描述
将对象序列化:
在这里插入图片描述
序列化后输出
在这里插入图片描述
编写一个自己的redisTemplate

@Configuration
public class RedisConfig {
    /*
    *
    *  public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
        RedisTemplate<Object, Object> template = new RedisTemplate();
        template.setConnectionFactory(redisConnectionFactory);
        return template;
    }
    */
    //编写我们自己的redisTemplate
    @Bean
    @SuppressWarnings("all")
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
        //写成<String, Object>为了方便我们日常使用
        RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
        //建立连接
        template.setConnectionFactory(redisConnectionFactory);
        //序列化配置
        //json的序列化配置
        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);
        //String的序列化配置
        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;
    }
}

使用自己学的redisTemplate之后,flushdb,再次执行测试代码窗口中的key不再乱码
在这里插入图片描述
不知道为啥我写了redisTemplate,但是我窗口get key还是乱码???但是我看狂神的视屏他取出来没有乱码,暂时还没找到方案解决
在这里插入图片描述

redisUtil工具类
可以参照这个:https://www.cnblogs.com/zeng1994/p/03303c805731afc9aa9c60dbbd32a323.html

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值