Redis(二)

发布于:2022-12-02 ⋅ 阅读:(235) ⋅ 点赞:(0)

   

八:value是Hash类型

Hash类型,也叫做散列。其value是一个无序字典,类似于java中的HashMap结构

Hash结构相比于String结构更加有益于进行对每个字段进行独立存储,针对于单个字段进行CRUD。

1.

2.

3.

九:value是List类型

1.

2.阻塞式获取

但是我们知道 我们是没有这个key为user2的

所以我们为了进行检验,新创建一个会话 :

老师举了形象的例子:我记录了一下,笑死我了 !!! !

十:value是Set类型

练习:

十一:value是SortedSet类型

Redis的SortedSet是一个可排序的set集合,与Java中的TreeSet有些类似。但是底层数据结构却差别很大。SortedSet中的每一个元素都

带有一个score属性,可以基于score属性对元素排序,底层的实现是基于一个跳表加上hash表

SortedSet具备下列特性:

可排序

元素不重复

查询速度快

案例练习:

十二:value是Redis的Java客户端

十三:Jedis

搭建步骤:

步骤:

1.引入依赖

<dependencies>
    <!--jedis-->
    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
        <version>4.2.3</version>
    </dependency>
    <!--单元测试-->
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter</artifactId>
        <version>5.7.1</version>
        <scope>test</scope>
    </dependency>
</dependencies>

2.建立连接 使用redis 最后释放资源

public class JedisTest {
​
    private Jedis jedis ;
​
    //1.配置redis
    @BeforeEach//@BeforeEach这一类的注解表示的意思为:在测试方法Test之前执行
    void setUp() {
        //1.建立连接
        jedis = new Jedis(" 192.168.204.134",6379) ;
        //2.设置密码
        jedis.auth("123321") ;
        //3.进行选择库 就算不进行选择,默认也是选择第0号库
        jedis.select(0) ;
    }
    //2.进行操作redis
    @Test
    void testString() {
        //存入数据
        String result = jedis.set("name","虎哥") ;
        System.out.println("输出结果result= "+result) ;
        //获取对应的数据
        String name = jedis.get("name") ;
        System.out.println(name);
    }
    @Test
    void testHash() {
        //1.插入hash数据
        jedis.hset("user:1","name","jack") ;
        jedis.hset("user:1","age","21") ;
        //2.进行获取
        Map<String,String> map = jedis.hgetAll("user:1") ;
        System.out.println(map);
    }
    //3.释放连接
    @AfterEach//@AfterEach这一类的注解表示的意思为:在测试方法Test之后执行
    void tearDown() {
        if (jedis != null) {
            jedis.close() ;
        }
    }
}

总结:

Jedis连接池:

代码:

public class JedisConnectionFactory {
​
    private static final JedisPool jedispool ;
​
    static {
        //配置连接池
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig() ;
        //1.最大连接数,这个jedis连接池
        jedisPoolConfig.setMaxTotal(8) ;
        //2.最大空闲连接数,即使没有被使用 我们也保存一些空闲的连接
        //当需要的时候 我们直接拿来用即可
        jedisPoolConfig.setMaxIdle(8) ;
        //3.最小空闲连接数
        jedisPoolConfig.setMinIdle(0) ;
        //4.设置最长等待时间
        //最多等待200秒 200秒之后连接就会失效 直到缩减到最小空闲连接数
        jedisPoolConfig.setMaxWaitMillis(200) ;
        //创建连接池对象
        jedispool = new JedisPool(jedisPoolConfig,"192.168.204.134",
                6379,1000,"123321") ;
    }
    public static Jedis getJedis() {
        return jedispool.getResource() ;
    }
}

测试:

十四:SpringDataRedis

<!--配置Redis相关的依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--连接池依赖-->
<dependency>
    <groupId>org.apache.commons</groupId>
    <!--无论是Jedis 还是letuce,我们底层都是基于commons-pool2这个连接池的
    所以我们要进行引入这个相关依赖-->
    <artifactId>commons-pool2</artifactId>
</dependency>

细节:

搭建SpringBoot开发环境的过程中:

勾选:

# 应用名称
spring:
  redis:
    host: 192.168.204.134
    port: 6379
    password: 123321
    lettuce:
      pool:
        max-active: 8 #最大连接数量
        max-idle: 8 #最大空闲连接数量
        min-idle: 0 #最小空闲连接数量
        max-wait: 100 #连接等待时间 (
        #当空闲的连接等待时间超过100秒之后 就会消失死亡
        # 但是它最后剩余的连接数应该大于等于最小空闲的连接数)

@SpringBootTest
class SpringDataRedisDemoApplicationTests {
​
    @Autowired
    private RedisTemplate redisTemplate ;
    @Test
    void contextLoads() {
    }
​
    @Test
    void testString() {
        //写入一条String类型的数据
        redisTemplate.opsForValue().set("name","虎哥") ;
        //获取name对应的value数据
        Object name = redisTemplate.opsForValue().get("name") ;
        System.out.println("name = " + name ) ;
    }
}

总结:

4.最后一步就是进行使用了:我们把这五种API封装到五种不同的对象中了。如图所示:

SpringDataRedis的序列化方式:

如果不进行序列化操作的话,我们存入一个值 其实存入的不是这个值。而是一堆啥码值。。。

如图所示:我们把一个正常的"虎哥" set进行设置进去 得到的却是一堆这个二进制码值 !!

代码:

@Configuration
public class RedisConfig {
    
    @Bean
    public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory connectionFactory) {
        //1.创建RedisTemplate对象
        RedisTemplate<String,Object> template = new RedisTemplate<>() ;
        //2.设置连接工厂
        template.setConnectionFactory(connectionFactory) ;
        //3.创建出JSON序列化工具
        GenericJackson2JsonRedisSerializer jackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer() ;
        //4.设置Key的序列化 采用的是String序列化
        template.setKeySerializer(RedisSerializer.string()) ;
        template.setHashKeySerializer(RedisSerializer.string()) ;
        //5.设置Value的序列化 采用的是JSon序列化
        template.setValueSerializer(jackson2JsonRedisSerializer) ;
        template.setHashKeySerializer(jackson2JsonRedisSerializer) ;
        //6.返回 
        return template ;   } }

  加入相关依赖:

<!--由于没有引入SpringMVC相关的依赖 所以要手动引入这个依赖-->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
</dependency>

测试:

变式测试:

加入一个实体类:

测试变式2:

分析:

测试运行之后就会:

StringRedisTemplate

当数据量很大的时候,我们每一次进行class的读取 会占用很多的内存。

所以为了进行解决这个问题:

我们使用String序列化器,要求只能进行存储String类型的key和value

当需要进行存储Java对象时,我们需要手动的完成对象的序列化和反序列化

代码:

@SpringBootTest
class RedisStringTests {
​
    @Autowired
    private StringRedisTemplate stringRedisTemplate ;
    //JSON 工具
    private static final ObjectMapper mapper = new ObjectMapper() ;
    @Test
    void contextLoads() {
    }
​
    @Test
    void testSaveUser() throws JsonProcessingException {
        //1.准备一个User对象
        User user = new User("虎哥",18) ;
        //2.手动序列化
        String json = mapper.writeValueAsString(user) ;
        //3.写入一条数据到redis
        stringRedisTemplate.opsForValue().set("user:200",json) ;
        //4.读取数据
        String val = stringRedisTemplate.opsForValue().get("user:200") ;
        //5.手动反序列化
        User user1 = mapper.readValue(val,User.class) ;
        System.out.println("user1="+user1);
    }
    @Test
    void testHash() {
        stringRedisTemplate.opsForHash().put("user:400","name","虎哥") ;
        stringRedisTemplate.opsForHash().put("user:400","age","21") ;
        Map<Object,Object> entries = stringRedisTemplate.opsForHash().entries("user:400") ;
        System.out.println("entries ="+entries) ;
    }
}

总结:

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到