• Redis(五)——Redis的Java客户端


    目录

    Jedis

    快速入门

    Jedis的连接池

    SpringDataRedis

    快速入门

    RedisTemplate的RedisSerializer

    StringRedisTemplate

    RedisTemplate操作Hash类型


    Jedis

    快速入门

    Jedis里的许多方法名就是命令名称

    • 1.引入依赖
    1. <dependency>
    2. <groupId>redis.clientsgroupId>
    3. <artifactId>jedisartifactId>
    4. <version>3.2.0version>
    5. dependency>
    • 2.建立连接
    1. private Jedis jedis ;
    2. //这个注释意思是每次@Test方法前都会执行的这段,下面每个@Test就不用重复写这段了,抽取出来
    3. //@BeforeEach表示执行测试方法之前会先执行该方法
    4. @BeforeEach
    5. void setUp() {
    6. //建立连接
    7. jedis = new Jedis ("192.168.150.101"6379) ;
    8. //设置密码
    9. jedis. auth("123321") ;
    10. //选择库
    11. jedis . select(0);
    12. }
    •  3.测试String和Hash(其他类型相似操作)
    1. @Test
    2. void testString() {
    3. //插入数据,方法名称就是redis命令名称,非常简单
    4. String result = jedis.set("name","张三");
    5. System.out.printlf("result =”+ result);
    6. //获取数据
    7. String name = jedis.get("name");
    8. System.out.println("name = " + name);
    9. }
    10. @Test
    11. void testHash() {
    12. //插入hash 数据
    13. jedis.hset("user:1","name","Jack") ;
    14. jedis.hset("user:1","age","21") ;
    15. //获取
    16. Map map = jedis.hgetAll("user:1");
    17. System.out.println(map) ;
    18. }
    • 4.释放资源
    1. @AfterEach
    2. void tearDown() {
    3. //释放资源
    4. if (jedis != null) {
    5. jedis. close();
    6. }
    7. }

    Jedis的连接池

            Jedis是线程不安全的,如果说在多线程的环境下并发的去访问,大家都来去使用,Jedis是有可能出现线程安全问题的,在并发的环境下,Jedis一定要给每一个线程创建独立的对象,那此时最好的方案是使用线程池,因为频繁的创建和销毁这类的对象是有很大的一个线程损耗的。

    JedisPool里是连接的一些参数,Config传的是池的一些参数。

    最大连接:这个连接池最多创建8个连接,再多就不行了。

    最大空闲连接:即使没有人来连接连接池,那么这个连接池最多也可以预备八个连接,这样如果有人来了,就可以直接拿来用,不用在创建连接了。
    最小空闲连接:这些空闲连接在一段时间后就会被清理,设置最小空闲连接用来保留n个连接不被清理。

    最长等待时间:当连接池里没有连接可用的时候,我们要不要等待?等待多长时间?默认值为-1,无限等待,直到有新的空闲连接为止。

    1. @BeforeEach
    2. void setUp() {
    3. // 1.建立连接
    4. // jedis = new Jedis("192.168.150.101",6379) ;
    5. jedis = JedisConnectionFactory.getJedis();
    6. // 2.设置密码
    7. jedis.auth( password:"123321");
    8. // 3.选择库
    9. jqdis.select(0) ;
    10. }

    SpringDataRedis

            Redis将命令根据类型进行了分组,而RedisTemplate也做了这件事,内部根据类型提供了各种API,返回不同的对象,对象里面封装的就是对于该类型的各种操作,利用对象封装的形式,把不同数据类型的方法封装到不同对象里去了。

    快速入门

    • 1.引入依赖
    1. <dependency>
    2. <groupId>org.springframework.bootgroupId>
    3. <artifactId>spring-boot-starter-data-redisartifactId>
    4. dependency>
    5. <dependency>
    6. <groupId>org.apache.commonsgroupId>
    7. <artifactId>commons-pool2artifactId>
    8. dependency>
    • 2.配置文件
    1. spring:
    2. redis:
    3. host: 192.168.150.101
    4. port: 6379
    5. password: 123321
    6. lettuce: #此时可以用lettuce也可以用jedis
    7. pool:
    8. max-active: 8 #最大连接
    9. max-idle: 8 #最大空闲连接
    10. min-idle: 0 #最小空闲连接
    11. max-wait: 100ms #连接等待时间

    • 3.注入RedisTemplate
    1. @Autowired
    2. private RedisTemplate redisTemplate;
    • 4.编写测试
    1. @SpringBootTest
    2. public class RedisTest {
    3. @Autowired
    4. private RedisTemplate redisTemplate;
    5. @Test
    6. void testString() {
    7. //插入一条string类型数据
    8. redisTemplate.opsForValue().set("name","李四") ;
    9. //读取一条string类型数据
    10. Object name = redisTemplate.opsForValue().get("name") ;
    11. System.out.println("name=”+name) ;
    12. }
    13. }

     SpringDataRedis的使用步骤: 
    1.引入spring-boot-starter-data-redis依赖
    2.在application.yml配置Redis信息
    3.注入RedisTemplate

    RedisTemplate的RedisSerializer

    上述测试出现的问题:

    剖析:

    默认的JDK序列化方式:

    解决:更改RedisTemplate的序列化方式

    一般key都为字符串,故key序列化用StringRedisSerializer

    一般value都是对象,建议使用GenericJackson2JsonRedisSerializer

     

            定义一个Bean叫做RedisTemplate,定义泛型key是string,value是object,先创建Template,然后连接工厂,连接工厂由springboot创建,我们只需要注入进来即可,然后设置序列化工具,一顿操作之后把redisTemplate返回。

    1. @Configuration
    2. public class RedisConfig extends CachingConfigurerSupport {
    3. @Bean
    4. public RedisTemplate redisTemplate(RedisConnectionFactory factory) {
    5. //创建RedisTemplate对象
    6. RedisTemplate template = new RedisTemplate<>();
    7. //创建字符串序列化工具
    8. RedisSerializer redisSerializer = new StringRedisSerializer();
    9. //创建并设置JSON序列化工具
    10. Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
    11. ObjectMapper om = new ObjectMapper();//Objectmapper是jackson的依赖,目的把对象写成json格式
    12. om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
    13. om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
    14. jackson2JsonRedisSerializer.setObjectMapper(om);
    15. //设置连接工厂
    16. template.setConnectionFactory(factory);
    17. //设置key序列化方式
    18. template.setKeySerializer(redisSerializer);
    19. template.setHashKeySerializer(redisSerializer);
    20. //设置value序列化方式
    21. template.setValueSerializer(jackson2JsonRedisSerializer);
    22. template.setHashValueSerializer(jackson2JsonRedisSerializer);
    23. return template;
    24. }
    25. }

    value(“虎哥”)作为 字符串可以正常传入了

    value作为对象也可以正常传入

            当获取结果的时候还能自动地反序列化成对象(存的时候将对象转化为JSON,取的时候将JSON转换为对象)。

    StringRedisTemplate

    将JSON反序列化为对象需要@class字节码来标识需要转化为哪个对象。

     存储结果:

    RedisTemplate的两种序列化实践方案
    方案一:
            1.自定义RedisTemplate
            2.修改RedisTemplate的序列化器 为Generi cJackson2JsonRedisSerializer
    方案二:
            1.使用StringRedisTemplate
            2.写 入Redis时,手动把对象序列化为JSON
            3.读取Redis时, 手动把读取到的JSON反序列化为对象

    RedisTemplate操作Hash类型

    在hash里面一个key可以对应多个值

    注意,Hash类型存数据不用hset

    而是用put(因为对应JAVA中的HashMap,干脆直接用put了,更接近Java的编程习惯) 

    1. @Test
    2. void testHash() {
    3. stringRedisTemplate.opsForHash().put("user:400","name","虎哥");
    4. stringRedisTemplate.opsForHash().put("user:400","age","21");
    5. Map entries = stringRedi sTemplate.opsForHash().entries("user:400") ;
    6. System.out.println("entries =”+ entries);
    7. }

  • 相关阅读:
    SSM之spring注解式缓存redis
    leetcode面试题之二叉树
    java泛型
    浅谈java中的String
    微信小程序-入门
    Spring IOC工作流程
    思维导图解读《思考,快与慢》
    ThreadLocal夺命11连问
    IPO解读丨高处不胜寒,澜沧古茶低头取暖?
    麒麟KYLINOS命令行设置系统静音
  • 原文地址:https://blog.csdn.net/m0_52601969/article/details/126255777