SortedSet类型
特性
1.可排序
2.元素不重复性
3.查询速度快
与普通的集合类型相比,SortedSet 主要有以下两个特点:
- 有序性:根据分数对元素进行排序,便于范围查找等操作。
- 不重复性:即使添加了相同的元素,也只会保留一个。
SortedSet 提供了许多常用的操作方法,包括添加元素、删除元素、查找元素、范围查找(支持按分数范围、按排名范围)等。具体的方法和使用方式可以参考 Redis 文档或教程。
在实际应用中,SortedSet 可以用于排行榜、计数器、带权重的任务队列等场景。以排行榜为例,可以将玩家与对应的分数作为 SortedSet 的元素,进行插入、删除、更新操作,同时可以方便地进行排名查找、前几名的统计等操作。
redis的java客服端
jedis: 以Redis命令作为方法名称,学习成本低,简单实用。但是Jedis实例是线程不安全的,多线程环境下需要基于连接池来使用
lettuce:Lettuce是基于Netty实现的,支持同步、异步和响应式编程方式,并且是线程安全的。支持Redis的哨兵模式、集群模式和管道模式。
redisson:Redisson是一个基于Redis实现的分布式、可伸缩的Java数据结构集合。包含了诸如Map.Queue. Lock.Semaphore. AtomicLong等强大功能
java-redis-client
vertx-redis-client
jedis
<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>5.0.0-alpha2</version> </dependency>
jedis连接池
Jedis本身是线程不安全的,并且频繁的创建和销毁连接会有性能损耗,因此使用Jedis连接池代替Jedis
SpringDateRedis
Spring Redis的优点:
-
简化的 API:Spring Data Redis提供了简单易用的API,使得与Redis进行交互变得更加方便和高效。
-
集成Spring生态系统:Spring Data Redis与其他Spring生态系统无缝集成,如Spring Boot、Spring MVC等,可以方便地与其他组件和框架进行协作开发。
-
缓存支持:Spring Data Redis提供了缓存注解,可以方便地将方法结果缓存到Redis中,提高系统性能和响应速度。
-
声明式事务管理:Spring Data Redis支持声明式事务管理,可以通过注解的方式来管理Redis操作的事务,保证数据的一致性和隔离性。
-
多种序列化支持:Spring Data Redis支持多种数据序列化方式,如JSON、XML、Protobuf等,使得存储和读取数据更加灵活可扩展。
-
强大的功能支持:Spring Data Redis提供了丰富的功能支持,如分布式锁、发布订阅、Lua脚本执行等,可以满足复杂应用场景下的需求。
主要缺点:
-
性能考虑:虽然Redis本身是一个高性能的内存数据库,但使用Spring Data Redis进行数据访问时,需要考虑性能问题,避免不必要的网络开销和序列化开销。
<!-- redis 依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <!-- 连接池依赖--> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> </dependency>
yml中的配置
spring:
#redis的所有配置方式
redis:
host: localhost
port: 6379
# password: 123456 # 如果有密码,请填写密码
timeout: 2000ms
lettuce:
pool:
max-active: 8 #最大连接
max-idle: 8 #最大空闲连接
min-idle: 0 #最小空闲连接
max-wait: -1ms #连接等待时间
RedisTemplate的两种序列化实践方案
方案一:
1.自定义RedisTemplate
2.修改RedisTemplate的序列化器为GenericJackson2JsonRedisSerializer
方案二:
1.使用StringRedisTemplate
2.写入Redis时,手动把对象序列化为JSON
读取Redis时,手动把读取到的JSON反序列化为对象
RedisTemplate的序列化方式
config
@Configuration public class RedisConfig { @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException { // 创建Template对象 RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>(); // 设置连接工厂 redisTemplate.setConnectionFactory(redisConnectionFactory); //设置序列化工具 GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer(); // key和 hashKey采用 string序列化 redisTemplate.setKeySerializer(RedisSerializer.string()); redisTemplate.setHashKeySerializer(RedisSerializer.string()); // value和 hashValue采用 JSON序列化 redisTemplate.setValueSerializer(jsonRedisSerializer); redisTemplate.setHashValueSerializer(jsonRedisSerializer); return redisTemplate; } }
测试代码:
@Autowired
RedisTemplate<String,Object> redisTemplate;
@Test void BookTypeName(){ List<BookTypeNameEntity> list = bookTypeNameService.list(); BookTypeNameEntity bookTypeNameEntity = list.get(0); System.out.println(bookTypeNameEntity); redisTemplate.opsForValue().set("bookType1",bookTypeNameEntity); Object name = redisTemplate.opsForValue().get("bookType1"); System.out.println(name); }
StringRedisTemplate的序列化方式
@Autowired StringRedisTemplate stringRedisTemplate; private static final ObjectMapper mapper = new ObjectMapper(); @Test void StringBookTypeName() throws JsonProcessingException { List<BookTypeNameEntity> list = bookTypeNameService.list(); //获取对象 BookTypeNameEntity bookTypeNameEntity = list.get(0); System.out.println(bookTypeNameEntity); //手动序列化 String s = mapper.writeValueAsString(bookTypeNameEntity); // 写入数据 stringRedisTemplate.opsForValue().set("bookType3", s); String name = stringRedisTemplate.opsForValue().get("bookType3"); // 手动反序列化 BookTypeNameEntity book = mapper.readValue(name,BookTypeNameEntity.class); System.out.println(name); }
Hash 的 StringRedisTemplate 方式
@Test void toHashBookTypeName() { stringRedisTemplate.opsForHash() .put( "user:400", "name","虎哥"); stringRedisTemplate.opsForHash().put( "user:400", "age" , "121") ; Map<Object, Object> entries = stringRedisTemplate.opsForHash().entries( "user:400"); System.out.println("entries-----------"+entries); }