使用StringRedisTemplate操作Redis方法详解

 更新时间:2023年08月01日 09:51:24   作者:wotrd  
这篇文章主要为大家介绍了使用StringRedisTemplate操作Redis方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

Redis简介

Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。支持事务5.0版本新增stream数据类型。

Spring boot单数据源配置

Springboot的redis单数据源配置特别简单

(1)配置appliation.properties文件

spring.redis.host=x.x.x.x
spring.redis.port=6379
#redis的数据库号
spring.redis.database=4
spring.redis.timeout = 30000ms
spring.redis.jedis.pool.max-active=200
spring.redis.jedis.pool.max-idle=0
spring.redis.lettuce.pool.max-idle=5
spring.redis.jedis.pool.max-wait=20000ms

(2)StringRedisTemplate的基本操作

StringRedisTemplate自动关闭redis连接
//注入对象     
@Autowired
private StringRedisTemplate stringRedisTemplate;
#获取ValueOperations操作String数据
ValueOperations<String, String> valueOperations = stringRedisTemplate.opsForValue();
valueOperations.set("strRedis","StringRedisTemplate");
valueOperations.get("strRedis"); 
#设置过期时间     
set("timeStep", new Date().getTime()+"", 2 ,TimeUnit.MINUTES);
#获取SetOperations操作Set数据
 SetOperations<String, String> set = stringRedisTemplate.opsForSet();
 set.add("set1","22");
 set.add("set1","33");
 set.add("set1","44");
 Set<String> resultSet =stringRedisTemplate.opsForSet().members("set1");
 stringRedisTemplate.opsForSet().add("set2", "1","2","3");//向指定key中存放set集合
 Set<String> resultSet1 =stringRedisTemplate.opsForSet().members("set2");
 log.info("resultSet:"+resultSet);
 log.info("resultSet1:"+resultSet1);
#获取ListOperations操作List数据,list可以用来实现队列。
 //将数据添加到key对应的现有数据的左边
 Long redisList = stringRedisTemplate.opsForList().leftPush("redisList", "3");
 stringRedisTemplate.opsForList().leftPush("redisList", "4");
 //将数据添加到key对应的现有数据的右边
 Long size = stringRedisTemplate.opsForList().size("redisList");
 //从左往右遍历
 String leftPop = stringRedisTemplate.opsForList().leftPop("redisList");
 //从右往左遍历
 String rightPop = stringRedisTemplate.opsForList().rightPop("redisList");
 //查询全部元素
 List<String> range = stringRedisTemplate.opsForList().range("redisList", 0, -1);
 //查询前三个元素
 List<String> range1 = stringRedisTemplate.opsForList().range("redisList", 0, 3);
 //从左往右删除list中元素A  (1:从左往右 -1:从右往左 0:删除全部)
 Long remove = stringRedisTemplate.opsForList().remove("key", 1, "A");
 log.info("redisList----"+redisList);
 log.info("size----"+size);
 log.info("leftPop----"+leftPop);
 log.info("rightPop----"+rightPop);
 log.info("range----"+range);
 log.info("range1----"+range1);
 log.info("remove----"+remove);  
//判断key对应的map中是否存在hash
Boolean aBoolean = stringRedisTemplate.opsForHash().hasKey("hash", "hash1");
//往key对应的map中新增(key1,value1)
stringRedisTemplate.opsForHash().put("hash", "hash1", "value1");
//获取key对应的map中hash1的值
Object o = stringRedisTemplate.opsForHash().get("hash", "hash1");
//删除key对应的map中多个子hash(可变参数)
Long delete = stringRedisTemplate.opsForHash().delete("hash", "key1", "key2", "key3");
//获取hash对应的map
Map<Object, Object> hash = stringRedisTemplate.opsForHash().entries("hash");
//获取hash对应的map中全部子hash集合
Set<Object> hash1 = stringRedisTemplate.opsForHash().keys("hash");
//获取hash对应的map中全部value集合
List<Object> hash2 = stringRedisTemplate.opsForHash().values("hash");
#删除键
Boolean key = stringRedisTemplate.delete("key");  
#数字加x
Long count = stringRedisTemplate.boundValueOps("count").increment(1);//val +1 
#获取过期时间,不设的话为-1
Long time = stringRedisTemplate.getExpire("count")

Spring boot多数据源配置

配置一个1号库,一个4号库

添加依赖

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

修改application.properties配置文件

#1号库
spring.redis.redis-onedb.database=0
spring.redis.redis-onedb.hostName=192.168.90.42
spring.redis.redis-onedb.port=9110
spring.redis.redis-onedb.timeout=5000
#4号库
spring.redis.redis-fourdb.database=4
spring.redis.redis-fourdb.hostName=192.168.90.42
spring.redis.redis-fourdb.port=9110
spring.redis.redis-fourdb.timeout=5000

创建RedisConfig.java文件

@Configuration
public class RedisConfig {
@Bean
@ConfigurationProperties(prefix = "spring.redis.lettuce.pool")
@Scope(value = "prototype")
public GenericObjectPoolConfig redisPool(){
    return new GenericObjectPoolConfig();
}

@Bean
@ConfigurationProperties(prefix = "spring.redis.redis-fourdb")
public RedisStandaloneConfiguration redisConfigA(){
    return new RedisStandaloneConfiguration();
}

@Bean
@ConfigurationProperties(prefix = "spring.redis.redis-onedb")
public RedisStandaloneConfiguration redisConfigB(){
    return new RedisStandaloneConfiguration();
}

@Primary
@Bean
public LettuceConnectionFactory factoryA(GenericObjectPoolConfig config, RedisStandaloneConfiguration redisConfigA){
    LettuceClientConfiguration clientConfiguration = LettucePoolingClientConfiguration.builder()
            .poolConfig(config).commandTimeout(Duration.ofMillis(config.getMaxWaitMillis())).build();
    return new LettuceConnectionFactory(redisConfigA, clientConfiguration);
}

@Bean
public LettuceConnectionFactory factoryB(GenericObjectPoolConfig config, RedisStandaloneConfiguration redisConfigB){
    LettuceClientConfiguration clientConfiguration = LettucePoolingClientConfiguration.builder()
            .poolConfig(config).commandTimeout(Duration.ofMillis(config.getMaxWaitMillis())).build();
    return new LettuceConnectionFactory(redisConfigB, clientConfiguration);
}


@Bean(name = "fourRedis")
public StringRedisTemplate redisBusTemplate(@Qualifier("factoryA") LettuceConnectionFactory factoryA){
    StringRedisTemplate template = getRedisTemplate();
    template.setConnectionFactory(factoryA);
    return template;
}

@Bean(name = "oneRedis")
public StringRedisTemplate redisLoginTemplate(@Qualifier("factoryB")LettuceConnectionFactory factoryB){
    StringRedisTemplate template = getRedisTemplate();
    template.setConnectionFactory(factoryB);
    return template;
}

private StringRedisTemplate getRedisTemplate(){
    StringRedisTemplate template = new StringRedisTemplate();
    template.setValueSerializer(new GenericFastJsonRedisSerializer());
    template.setValueSerializer(new StringRedisSerializer());
    return template;
}
}

在需要使用的类,注入就可以使用

@Resource(name = "oneRedis")
private StringRedisTemplate oneRedis;

@Resource(name = "fourRedis")
private StringRedisTemplate fourRedis;

StringRedisTemplate实现事务

stringRedisTemplate.setEnableTransactionSupport(true);
    try {
        stringRedisTemplate.multi();//开启事务
        stringRedisTemplate.opsForValue().increment("count", 1);
        stringRedisTemplate.opsForValue().increment("count1", 2);
        //提交
        stringRedisTemplate.exec();
    }catch (Exception e){
        log.error(e.getMessage(), e);
        //开启回滚
        stringRedisTemplate.discard();
    }

注意:StringRedisTemplate开启事务之后,不释放连接。如果我们使用Spring事务管理不存在这个问题

StringRedisTemplate实现乐观锁

redisTemplate.watch("key"); // 1
redisTemplate.multi();
redisTemplate.boundValueOps("key").set(""+id);
List<Object> list= redisTemplate.exec();
System.out.println(list);
if(list != null ){
    //操作成功
    System.out.println(id+"操作成功");
}else{
    //操作失败
    System.out.println(id+"操作失败");
}

StringRedisTemplate实现pipe管道

StringRedisTemplate实现分布式锁

String lockKey = "key";
String lockValue = lockKey+System.currentTimeMillis();
// value需要记住用于解锁
while (true){
   Boolean ifPresent = stringRedisTemplate.opsForValue().
                setIfAbsent("redis-lock:" + lockKey, lockValue, 3, TimeUnit.SECONDS);
   if (ifPresent){
          log.info("get redis-lock success");
          break;
    }
 }
//解锁
  String lockKey = "key";
 String lockValue = lockKey + System.currentTimeMillis();
 boolean result = false;
 // value需要记住用于解锁
 stringRedisTemplate.watch("redis-lock:" + lockKey);
 String value = stringRedisTemplate.opsForValue().get("redis-lock:" + lockKey);
 if (null == value){
     result = true;
 }else if (value.equals(lockValue)) {
     stringRedisTemplate.delete("redis-lock:" + lockKey);
     result = true;
 }
 stringRedisTemplate.unwatch();

Redis缓存击穿、穿透和雪崩

  • 缓存击穿,是指一个key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个屏障上凿开了一个洞
  • 缓存穿透,是指查询一个数据库一定不存在的数据。正常的使用缓存流程大致是,数据查询先进行缓存查询,如果key不存在或者key已经过期,再对数据库进行查询,并把查询到的对象,放进缓存。如果数据库查询对象为空,则不放进缓存。解决办法是即使查出的对象为空,也放入缓存时间设短一点。
  • 缓存雪崩,是指在某一个时间段,缓存集中过期失效。

以上就是使用StringRedisTemplate操作Redis方法详解的详细内容,更多关于StringRedisTemplate操作Redis的资料请关注脚本之家其它相关文章!

相关文章

  • MyBatis 中 SqlMapConfig 配置文件详解

    MyBatis 中 SqlMapConfig 配置文件详解

    这篇文章主要介绍了MyBatis 中 SqlMapConfig 配置文件详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • IDEA2023版本创建Spring项目只能勾选17和21却无法使用Java8的完美解决方案

    IDEA2023版本创建Spring项目只能勾选17和21却无法使用Java8的完美解决方案

    想创建一个springboot的项目,本地安装的是1.8,但是在使用Spring Initializr创建项目时,发现版本只有17和21,这篇文章主要介绍了IDEA2023版本创建Sping项目只能勾选17和21,却无法使用Java8的解决方法,需要的朋友可以参考下
    2023-12-12
  • Spring Boot 和 Spring 到底有啥区别你知道吗

    Spring Boot 和 Spring 到底有啥区别你知道吗

    Spring Boot框架的核心就是自动配置,只要存在相应的jar包,Spring就帮我们自动配置。接下来通过本文给大家介绍Spring与Spring boot的区别介绍,非常不错,需要的朋友参考下吧
    2021-08-08
  • Java中难理解的四个概念

    Java中难理解的四个概念

    这篇文章主要介绍了匿名内部类、多线程、如何实现同步、序列化,这四个难理解的概念,同学们一定要仔细看看
    2021-04-04
  • idea如何关闭页面显示的浏览器图标

    idea如何关闭页面显示的浏览器图标

    这篇文章主要介绍了idea如何关闭页面显示的浏览器图标问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • Java数据结构及算法实例:冒泡排序 Bubble Sort

    Java数据结构及算法实例:冒泡排序 Bubble Sort

    这篇文章主要介绍了Java数据结构及算法实例:冒泡排序 Bubble Sort,本文直接给出实现代码,代码中包含详细注释,需要的朋友可以参考下
    2015-06-06
  • Java中输入单个char类型的字符方式

    Java中输入单个char类型的字符方式

    这篇文章主要介绍了Java中输入单个char类型的字符方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02
  • Spring Boot 2.7.6整合redis与低版本的区别

    Spring Boot 2.7.6整合redis与低版本的区别

    这篇文章主要介绍了Spring Boot 2.7.6整合redis与低版本的区别,文中补充介绍了SpringBoot各个版本使用Redis之间的区别实例讲解,需要的朋友可以参考下
    2023-02-02
  • rabbitmq五种模式详解(含实现代码)

    rabbitmq五种模式详解(含实现代码)

    这篇文章主要介绍了rabbitmq五种模式详解(含实现代码),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • Java枚举与.net枚举区别详解

    Java枚举与.net枚举区别详解

    这篇文章主要介绍了Java枚举与.net枚举区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02

最新评论