首页 > 数据库 > springboot redis工具类之StringRedisTemplate 使用

springboot redis工具类之StringRedisTemplate 使用

时间:2023-07-14 09:45:59浏览次数:40  
标签:String redis value stringRedisTemplate key 序列化 StringRedisTemplate springboot

1、StringRedisTemplate是什么?

StringRedisTemplate继承自RedisTemplate类,实现了BeanClassLoaderAware,Aware,InitializingBean,RedisOperations<K, V>接口。StringRedisTemplate是RedisTemplate以字符串为中心的扩展,由于针对 Redis 的大多数操作都是基于字符串的,因此此类提供了一个专用类。StringRedisTemplate是默认采用的是String的序列化策略,保存的key和value都是采用此策略序列化保存的。
2、使用方法

 2.1、构造方法

 StringRedisTemplate提供了两个构造方法:

方法  描述
StringRedisTemplate() 构造一个新StringRedisTemplate实例
StringRedisTemplate(RedisConnectionFactory connectionFactory) 构造一个StringRedisTemplate可以使用的新实例

  2.2、常用操作方法 

   2.2.1、从RedisTemplate继承的方法:afterPropertiesSet, boundGeoOps, boundHashOps, boundListOps, boundSetOps, boundStreamOps, boundValueOps, boundZSetOps, convertAndSend, copy, countExistingKeys, createRedisConnectionProxy 等

    详见: https://docs.spring.io/spring-data/redis/docs/current/api/org/springframework/data/redis/core/RedisTemplate.html#boundStreamOps-K-

  2.2.2、 从RedisAccessor继承的方法

方法  描述
getConnectionFactory()   返回连接工厂
getRequiredConnectionFactory() 如果未设置连接工厂,则返回必需的RedisConnectionFactory或抛出IllegalStateException
setConnectionFactory(RedisConnectionFactory connectionFactory)   设置连接工厂

  2.2.3、从Object继承的方法: cloneequalsfinalizegetClasshashCodenotifynotifyAlltoStringwaitwaitwait

    详见: https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait-long-int-

  2.2.4、从RedisOperations继承的方法

返回类型  方法  描述
default Boolean expire(K key, Duration timeout) 设定时间key
Boolean  expire(K key, long timeout, TimeUnit unit) 设定时间key
Boolean  expireAt(K key, Date date) 将给定的到期时间设置key为日期时间戳
default Boolean expireAt(K key, Instant expireAt)  将给定的到期时间设置key为日期时间戳
default void restore(K key, byte[] value, long timeToLive, TimeUnit unit)  创建key使用serializedValue,之前获得使用dump(Object)
void restore(K key, byte[] value, long timeToLive, TimeUnit unit, boolean replace) 创建key使用serializedValue,之前获得使用dump(Object)

3、常见使用方法

(1)检查key是否存在,返回boolean值

  stringRedisTemplate.hasKey(String key)

(2)根据key获取缓存中value

  stringRedisTemplate.opsForValue().get(Object key)

(3) 截取key键对应缓存中的字符串,从开始下标位置开始到结束下标的位置(包含结束下标)

  stringRedisTemplate.opsForValue().get(String key,long start,long end)

(4) 向缓存中存入key值对应的value数据

  stringRedisTemplate.opsForValue().set(String key,String value)

(5) 覆盖从指定位置开始的值

  stringRedisTemplate.opsForValue().set(String key,String value,long offset)

(6) 向缓存中存入数据,并指定过期时间,默认毫秒

  stringRedisTemplate.opsForValue().set(String key,String value,Duration timeout)

(7) 向缓存中存入数据,并指定过期时间,可指定过期时间的单位,如TimeUnit.MINUTES,表示过期时间单位是分钟

  stringRedisTemplate.opsForValue().set(String key,String value,long timeout,TimeUnit unit)

(8) 向缓存中存入数据,以map形式存储

  stringRedisTemplate.opsForHash().putAll(String key,Map<?,?> m)

(9) 向缓存中存入数据

  stringRedisTemplate.opsForHash().put(String key,Object hashkey,Object value)

(10) 删除缓存

  stringRedisTemplate.delete(String key,Object ...hashkeys)

(11) 以增量形式存储

  stringRedisTemplate.opsForValue().increment(String key)

(12) 以增量的方式将long值存储在变量中,相当于一个计数器(计算 +)

  stringRedisTemplate.opsForValue().increment(String key,long delta)

(13) 以增量的方式将double值存储在变量中,相当于一个计数器(计算 +)

  stringRedisTemplate.opsForValue().increment(String key,double delta)

(14) 获取key对应的map

  stringRedisTemplate.opsForHash().entries(String key)

(15) 设置过期时间

  stringRedisTemplate.expire(String key,Duration timeout)

  stringRedisTemplate.expire(String key,long timeout,TimeUnit unit)

4、RedisTemplate的两种序列化实践方案:

  当使用RedisTemplate往redis中存储java对象的时候,会将该java对象的字节码文件也同时存进了内存中,这是为了实现自动反序列化,会带来额外的内存开销。

  方案一:

    1.自定义RedisTemplate
    2.修改RedisTemplate的序列化器为GenericJackson2JsonRedisSerializer

  @Configuration
  public class MyRedisTemplate {
  /**
  * 将往redis中存放的【key(string)、value(object)】对象都添加可序列化的功能,从而实现了redis可存放对象的功能并提高了编程效率
  * @param factory
   * @return
  */
   @Bean
  @SuppressWarnings("all")
  public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
  // 为了开发方便,一般直接使用 <String, Object>
  RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
  // 注入连接工厂
  template.setConnectionFactory(factory);
  // Json序列化配置
  Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
  ObjectMapper om = new ObjectMapper();
  om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
  om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
  jackson2JsonRedisSerializer.setObjectMapper(om);
  // String 的序列化
  StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
  // key采用String的序列化方式
  template.setKeySerializer(stringRedisSerializer);
  // hash的key也采用String的序列化方式
  template.setHashKeySerializer(stringRedisSerializer);
  // value序列化方式采用jackson
  template.setValueSerializer(jackson2JsonRedisSerializer);
  // hash的value序列化方式采用jackson
  template.setHashValueSerializer(jackson2JsonRedisSerializer);
  // 让设置生效
  template.afterPropertiesSet();
  return template;
  }
  }
但是为了节省内存开销,并不会使用JSON序列化器来处理Value,而是统一使用String序列化器,要求只能存储String类型的key和value,当需要存储Java对象时,手动完成对象的序列化和反序列化;
Spring默认提供了一个StringRedisTemplate类,它的key和Value的序列化方式默认就是String类型,省去了我们自定义RedisTemplate的过程

  方案二:

    1.使用StringRedisTemplate
    2.写入Redis时,手动把对象序列化为json格式字符串
      读取Redis时,手动把读取到的JSON反序列化成对象

 

标签:String,redis,value,stringRedisTemplate,key,序列化,StringRedisTemplate,springboot
From: https://www.cnblogs.com/gapu/p/17552732.html

相关文章

  • springboot中使用redis
    1、引入依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>2、配置spring:redis:host:localhost#Redis服务器地址port:6379......
  • javaSpringboot
    目前最流行的框架,JavaSpring的子项目,由它开发 Springboot依赖管理      配置注解  什么是Javabean 有get和set才叫Javabean springboot自定义配置   由MYconfig这个类进行组件myservice配置将其纳入到Spring中  JavaSpr......
  • Redis底层数据结构
    Redis是什么?Redis是一个键值数据库,以“快”著称Redis是为什么这么快?我们都知道Redis很快,它在接收到一个键值对数据后,能以微妙级别的速度找到数据并快速完成操作。数据库这么多,为啥Redis能有这么突出的表现呢?一方面,这是因为它是内存数据库,所有操作都在内存上完成,内存的访问速......
  • Redis学习指南
    基础资料官方下载、安装、运行redis中文站thelittleredisbook(中文版)Redis几个认识误区 redis作者宣言建模Fast,easy,realtimemetricsusingRedisbitmaps监控、配置RedisCommander (在线运行命令。强烈不推荐,会把浏览器搞死!)RedisLive redmon(★推荐支持监控......
  • 31. Redis分布式锁
    我是javapub,一名Markdown程序员从......
  • Redis压测工具(redis-benchmark)
    redis性能测试工具可选参数如下所示:redis性能测试工具可选参数如下所示:序号选项描述默认值1-h指定服务器主机名127.0.0.12-p指定服务器端口63793-s指定服务器socket4-c指定并发连接数505-n指定请求数100006-d以字节的形式指定SE......
  • RedisTemplate 的简单使用
    redisTemplate.opsForValue() 方法可以获得一个RedisString的操作类,通过该类可以执行一系列字符串类型数据的操作,例如获取、设置、删除数据等。//示例1:设置字符串类型的数据redisTemplate.opsForValue().set("key","value");//示例2:获取字符串类型的数据String......
  • Redis面试题
    1.什么是Redis,Redis的优缺点?Redis本质上是一个key-value类型的内存的数据库,很像memcached,整个数据库统统加载在内存当中就行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。优点:因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过10万次读写操作,是已知性能快......
  • 【Redis】字符串sds
    sds,即SimpleDynamicStrings,是Redis中存储绝大部分字符串所采用的数据结构。typedefchar*sds;一、类型sds的类型包括SDS_TYPE_5,SDS_TYPE_8,SDS_TYPE_16,SDS_TYPE_32,SDS_TYPE_64五种:#defineSDS_TYPE_50#defineSDS_TYPE_81#defineSDS_TYPE_162#defineSD......
  • Springboot实现注解判断权限
    Springboot实现注解判断权限今天记录一下使用springboot的注解来给方法加权限避免了每个方法都需要大量的权限判断超级好用√@目录Springboot实现注解判断权限1.创建权限注解2.定义一个权限的枚举类3.创建拦截器AOP校验权限poincut表达式介绍4.使用注解1.创建权限注解首先......