赞
踩
- <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>
- # Redis服务器地址
- spring.redis.host=10.1.30.222
- # Redis数据库索引(默认为0)
- spring.redis.database=0
- # Redis服务器连接端口
- spring.redis.port=6379
- # Redis服务器连接密码(默认为空)
- #spring.redis.password=
- ## 连接超时时间(毫秒)
- spring.redis.timeout=30000
-
- # 连接池最大连接数(使用负值表示没有限制) 默认 8
- spring.redis.lettuce.pool.max-active=8
-
- # 连接池中的最大空闲连接 默认 8
- spring.redis.lettuce.pool.max-idle=8
- # 连接池中的最小空闲连接 默认 0
- spring.redis.lettuce.pool.min-idle=1
-
- #连接池中最大空闲等待时间,3s没有活干的时候直接驱逐该链接
- spring.redis.lettuce.pool.min-evictable-idle-time-millis = 3000
-
-
- # 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1
- spring.redis.lettuce.pool.max-wait=-1

- public class StringDemo {
-
- @Autowired
- private StringRedisTemplate stringRedisTemplate;
-
- private final String key = "zhengzhou";
-
- public void test() {
-
- stringRedisTemplate.opsForValue().set(key, "我的家乡", 30, TimeUnit.SECONDS);
- String value = stringRedisTemplate.opsForValue().get(key);
- System.out.println(value);
- }
- }
-
Java
- @Component
- public class HashDemo {
-
- @Autowired
- private StringRedisTemplate stringRedisTemplate;
- private final String key ="zhouxingxing";
- public void test(){
- stringRedisTemplate.opsForHash().put(key,"20220325","郑州");
- stringRedisTemplate.opsForHash().put(key,"20220326","洛阳");
-
- List<Object> values = stringRedisTemplate.opsForHash().values(key);
-
- for (Object value:values){
- System.out.println(value);
- }
-
- }
- }
-

Java
- @Component
- public class ListDemo {
- @Autowired
- private StringRedisTemplate stringRedisTemplate;
- private final String key ="onewayroad";
- void test(){
-
- stringRedisTemplate.opsForList().leftPush(key,"周星星");
- stringRedisTemplate.opsForList().leftPush(key,"张敏");
- stringRedisTemplate.opsForList().leftPush(key,"李大锤");
- String value = stringRedisTemplate.opsForList().rightPop(key);
- System.out.println(value);
-
-
- }
- }
- @Test
- void test6() {
- // 如果一些原生命令,spring 没有给我们封装,redisTemplate.execute(new RedisCallback)
- while (true){
- System.out.println("开始一轮监听");
- List<byte[]> rawResults = redisTemplateProduct.execute(new RedisCallback<List<byte[]>>() {
- @Override
- public List<byte[]> doInRedis(RedisConnection connection) throws DataAccessException {
- return connection.bRPop(5,"product.hot".getBytes());
- }
- });
- if(ObjUtil.isNotEmpty(rawResults)){
- byte[] rawKey = rawResults.get(0);
- byte[] rawValue = rawResults.get(1);
- Product product = (Product)redisTemplateProduct.getValueSerializer().deserialize(rawValue);
- System.out.println(product);
- }
- }
-
-

Java
- @Component
- public class SetDemo {
- @Autowired
- private StringRedisTemplate stringRedisTemplate;
-
- private final String zhouxingxing ="zhouxingxing";
- private final String zhangmin = "zhangming";
-
- public void test(){
- //添加周星星同学感兴趣的科目
- stringRedisTemplate.opsForSet().add(zhouxingxing,"语文");
- stringRedisTemplate.opsForSet().add(zhouxingxing,"数学");
- stringRedisTemplate.opsForSet().add(zhouxingxing,"数学");
- //添加张敏同学感兴趣的科目
- stringRedisTemplate.opsForSet().add(zhangmin,"数学");
- stringRedisTemplate.opsForSet().add(zhangmin,"英语");
-
- //获取两位同学共同感兴趣的科目
- Set<String> values = stringRedisTemplate.opsForSet().intersect(zhouxingxing, zhangmin);
-
- System.out.println("周星星和张敏共同感兴趣的科目为:");
-
- for(String value : values){
- System.out.println(value);
- }
-
- }
- }
-

Java
- @Component
- public class ZSetDemo {
- @Autowired
- private StringRedisTemplate stringRedisTemplate;
- private final String key ="zhouxingxing";
- public void test(){
- //添加周星星同学成绩
- stringRedisTemplate.opsForZSet().add(key,"语文",98);
- stringRedisTemplate.opsForZSet().add(key,"数学",87);
- stringRedisTemplate.opsForZSet().add(key,"英语",75);
- //获取分数最高的成绩
- ZSetOperations.TypedTuple<String> values = stringRedisTemplate.opsForZSet().popMax(key);
- //打印值
- System.out.println("周星星最好成绩科目是:"+values.getValue());
- System.out.println("周星星最好成绩:"+values.getScore());
-
- }
- }
-

Java
- @Component
- public class BitMapDemo {
- @Autowired
- private StringRedisTemplate stringRedisTemplate;
- private final String key ="sign#2022#zhouxingxing";
- public void test(){
- //设置签到
- stringRedisTemplate.opsForValue().setBit(key,2,true);
- stringRedisTemplate.opsForValue().setBit(key,85,true);
- //获取周星星同学的签到天数
- RedisCallback<Long> callback = connection -> { return connection.bitCount(key.getBytes(),0,365);};
- Long count = stringRedisTemplate.execute(callback);
- //打印周星星2022年签到天数
- System.out.println("周星星2022年一共签到天数:"+count);
- }
- }

Java
- @Component
- public class RedisTemplateDemo {
-
- @Autowired
- private StringRedisTemplate stringRedisTemplate;
-
- @Autowired
- private RedisTemplate<String, String> redisTemplate_string_string;
-
- @Resource
- private RedisTemplate<String, User> redisTemplate;
-
- @Resource(name="redisTemplate")
- private ValueOperations<String,User> valueOperations;
-
- private final String key = "useris#01";
-
- public void test() {
- User user = User.builder().id(1).name("李四").build();
- redisTemplate.opsForValue().set(key,user );
- User value = redisTemplate.opsForValue().get(key);
- valueOperations.set(key,user );
- User value2 = valueOperations.get(key);
- System.out.println(value);
-
- }
- }
-

4,乱码的问题
- JdkSerializationRedisSerializer serializer = new JdkSerializationRedisSerializer();
- byte[] serialize = serializer.serialize("user#01");
- System.out.println(new String(serialize));
自定义序列化工具
- @Configuration
- public class RedisConfig {
-
-
- @Bean //主动注册了一个名字叫redisTemplate 的bean
- public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory)
- {
- RedisTemplate<Object, Object> template = new RedisTemplate<>();
- template.setConnectionFactory(redisConnectionFactory);
-
- Jackson2JsonRedisSerializer jackson = new Jackson2JsonRedisSerializer(Object.class);
-
- ObjectMapper mapper = new ObjectMapper();
-
- // 启用默认类型推理,将类型信息作为属性写入JSON
- // 就是把对象的全类名写入json
- mapper.activateDefaultTyping( mapper.getPolymorphicTypeValidator(), ObjectMapper.DefaultTyping.NON_FINAL);
-
- jackson.setObjectMapper(mapper);
- template.setKeySerializer(StringRedisSerializer.UTF_8);
- template.setValueSerializer(jackson);
- template.setHashKeySerializer(StringRedisSerializer.UTF_8);
- template.setHashValueSerializer(jackson);
- return template;
- }
-
-
- }

为什么要自定话应该序列化工具,因为他自己提供的不是很好,所以我们要自己定义一个,这样的话可以把java对象转化成json和字节码存入Redis 里,反序列化就是把json和字节码转化为java对象,泛型指定为
Object.class
表示可以处理任何类型的对象。最后返回配置好的
RedisTemplate
实例,这样在整个Spring Boot应用中,当需要使用RedisTemplate进行操作时,将自动使用这个经过JSON序列化配置的模板。
详细的介绍:
@Configuration
注解表明这是一个配置类,Spring IoC容器将会读取该类中的bean定义。
@Bean
注解的方法表示该方法会返回一个对象,该对象会被注册为Spring容器中的bean。在这个例子中,方法名为 redisTemplate
,所以生成的bean的名字也是 "redisTemplate"。
方法体中首先创建了一个 RedisTemplate<Object, Object>
实例,并将其连接工厂设置为传入的 RedisConnectionFactory
,这是连接Redis的基础配置。
创建了 Jackson2JsonRedisSerializer
实例,用于将Java对象序列化为JSON字符串,反序列化时则将JSON字符串转回为Java对象。泛型指定为 Object.class
表示可以处理任何类型的对象。
初始化 ObjectMapper
,它是Jackson库中用于处理JSON的核心类。这里启用了默认类型推理(activateDefaultTyping
),这样在序列化时,即使目标类没有显式地声明类型信息,也能根据实际运行时类型推断并在JSON中包含类型信息,这对于处理多态类型的场景非常有用。
将初始化好的 ObjectMapper
设置给 Jackson2JsonRedisSerializer
。
配置RedisTemplate的序列化策略:
template.setKeySerializer(StringRedisSerializer.UTF_8);
设置键(key)的序列化器为 StringRedisSerializer
,以UTF-8格式进行字符串序列化。template.setValueSerializer(jackson);
设置值(value)的序列化器为刚才创建的 Jackson2JsonRedisSerializer
,即所有值都将转化为JSON字符串存储。template.setHashKeySerializer(StringRedisSerializer.UTF_8);
设置哈希表键(hash key)的序列化器也为 StringRedisSerializer
,同样以UTF-8格式进行字符串序列化。template.setHashValueSerializer(jackson);
设置哈希表值(hash value)的序列化器为 Jackson2JsonRedisSerializer
,意味着哈希表中的每个值也将被转化为JSON字符串存储。最后,返回配置好的 RedisTemplate
实例,这样在整个Spring Boot应用中,当需要使用RedisTemplate进行操作时,将自动使用这个经过JSON序列化配置的模板。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。