八: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 后查看