SpringBoot中StringRedisTemplate与RedisTemplate区别,以及StringRedisTemplate操作String List Hash Set 详解 模糊查询

目录

一、SpringBoot操作Redis主要有两种常用操作,如下:

二、StringRedisTemplate与RedisTemplate区别:

三、本文以StringRedisTemplate为例:

1、POM依赖:

2、Redis连接池配置:

3、注入对象:

4、Redis 过期时间,模糊查询和通用操作:

5、Redis String:

6、Redis List:

7、Redis Hash:

扫描二维码关注公众号,回复: 15398747 查看本文章

8、Redis Set:

Redis客户端工具下载:


一、SpringBoot操作Redis主要有两种常用操作,如下:

StringRedisTemplateRedisTemplate

二、StringRedisTemplate与RedisTemplate区别:

•  两者的关系是StringRedisTemplate继承RedisTemplate。
•  两者的数据是不共通的;也就是说:
        StringRedisTemplate只能管理StringRedisTemplate里面的数据;
        RedisTemplate只能管理RedisTemplate中的数据。
•  其实他们两者之间的区别主要在于他们使用的序列化类:
        RedisTemplate使用的是JdkSerializationRedisSerializer  存入数据会将数据先序列化成字节数组然后在存入Redis数据库;
        StringRedisTemplate使用的是StringRedisSerializer。
•  使用时注意事项:
        当你的redis数据库里面本来存的是字符串数据或者你要存取的数据就是字符串类型数据的时候,那么你就使用StringRedisTemplate即可;
        但是如果你的数据是复杂的对象类型,而取出的时候又不想做任何的数据转换,直接从Redis里面取出一个对象,那么使用RedisTemplate是更好的选择。
•    RedisTemplate使用时常见问题:
        redisTemplate 中存取数据都是字节数组。当redis中存入的数据是可读形式而非字节数组时,使用redisTemplate取值的时候会无法获取导出数据,获得的值为null。可以使用 StringRedisTemplate 试试。


•    RedisTemplate中定义了5种数据结构操作:
        redisTemplate.opsForValue();  //操作字符串
        redisTemplate.opsForHash();  //操作hash
        redisTemplate.opsForList();     //操作list
        redisTemplate.opsForSet();     //操作set
        redisTemplate.opsForZSet();   //操作有序set        
 


三、本文以StringRedisTemplate为例:

1、POM依赖:

<!-- Radis -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2、Redis连接池配置:

(也可以不写以下配置项,将下载的redis设置在windows服务中,开机自启动)

# Redis
[email protected]@
[email protected]@
spring.redis.port=${port:6379}
# 连接池最大连接数(使用负值表示没有限制)
spring.redis.pool.max-active=8
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.pool.max-wait=-1
# 连接池中的最大空闲连接
spring.redis.pool.max-idle=8
# 连接池中的最小空闲连接
spring.redis.pool.min-idle=1
# 连接超时时间(毫秒)
spring.redis.timeout=300

3、注入对象:

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

4、Redis 过期时间,模糊查询和通用操作:

	//向redis里存入数据和设置缓存时间(按指定时间单位)
	stringRedisTemplate.opsForValue().set("count","20",60*10,TimeUnit.SECONDS);

	//设置过期时间,//如果这个方法与上个方法同时使用,会刷新过期时间
	stringRedisTemplate.expire("count",1000,TimeUnit.SECONDS);
	
	//根据key获取过期时间,//返回的值是剩余的过期时间
	Long stringRedisTemplate.getExpire("count");

	//根据key获取过期时间(按指定时间单位返回),//返回的值是剩余的过期时间
	Long stringRedisTemplate.getExpire("count",TimeUnit.SECONDS);

	//根据key删除缓存
	stringRedisTemplate.delete("count");   // 返回boolean 
	
	//检查key是否存在
	stringRedisTemplate.hasKey("count");   // 返回boolean 

    //Redis模糊查找(不推荐使用,会全表扫描,影响性能)
    //Redis中keys命令进行获取key值,具体命令格式:keys pattern 
    //Redis中允许模糊查询的有3个通配符,分别是:*,?,[]
    // 其中:
    // *:通配任意多个字符
    stringRedisTemplate.keys("*" + pattern + "*");
    // ?:通配单个字符
    stringRedisTemplate.keys("?" + pattern);
    // []:通配括号内的某一个字符
    stringRedisTemplate.keys("[" + pattern + "]");
    

备注:使用RedisTemplate模糊查询,遇到问题key存在,而redisTemplate查找不到,如:“A_091_JPFX”,但是用 模糊key:“A_*_JPFX”匹配时,却匹配不到,是序列话编码问题导致(二中有描述),使用stringRedisTemplate即可。 

5、Redis String:

	//向redis存入数据
	stringRedisTemplate.opsForValue().set("key","50");
	
	//根据key获得缓存中的value(opsForValue().get("key"))
	stringRedisTemplate.opsForValue().get("key");//key:Object
	
	//value做-1操作
	stringRedisTemplate.boundValueOps("key").increment(-1);//-1:Long/Double
	
	//value做+1操作
	stringRedisTemplate.boundValueOps("key").increment(1);//1:Long/Double
		
	//根据key删除缓存
	stringRedisTemplate.delete("count");    // 返回boolean 
	
	//检查key是否存在
	stringRedisTemplate.hasKey("count");    // 返回boolean 

6、Redis List:

	// list数据类型适合于消息队列的场景:比如12306并发量太高,而同一时间段内只能处理指定数量的数据!
    // 必须满足先进先出的原则,其余数据处于等待
    // leftPush依次由右边添加
    Long stringRedisTemplate.opsForList().rightPush("redlist","1");
    Long stringRedisTemplate.opsForList().rightPush("redlist","2");
    Long stringRedisTemplate.opsForList().rightPush("redlist", "A");
    Long stringRedisTemplate.opsForList().rightPush("redlist", "B");
    
    // leftPush依次由左边添加
    Long stringRedisTemplate.opsForList().leftPush("redlist", "0");

	// 查询类别所有元素
    List<String> listAll = stringRedisTemplate.opsForList().range( "redlist", 0, -1);//["0","1","2","A","B"]
    
    // 查询前2个元素
    List<String> list = stringRedisTemplate.opsForList().range( "redlist", 0, 1);//["0","1"]
	
	// 删除先进入的B元素(如果含有多个B元素,删除最左边的)
    Long stringRedisTemplate.opsForList().remove("redlist",1, "B");//["0","1","2","A"]
    
   	// 删除所有A元素
    Long stringRedisTemplate.opsForList().remove("redlist",0, "A");//["0","1","2"]	 

7、Redis Hash:

	// map的key值相同,后添加的覆盖原有的(h,hk,hv)
    void stringRedisTemplate.opsForHash().put("redmap","a","b");
    void stringRedisTemplate.opsForHash().put("redmap","a","d");
    void stringRedisTemplate.opsForHash().put("redmap","b","d");
	 
    // 获取map对象
    Map<Object, Object> map = stringRedisTemplate.opsForHash().entries("redmap");//{"a":"d","b":"d"}
	
	// 根据map的key删除这个元素 
    //第二个参数是不定长的,可以写多个,例如:delete("redmap","c","d"),当删除完所有的key时,该map对象注销
    Long stringRedisTemplate.opsForHash().delete("redmap", "c"); 
	
	// 获得map的key集合
    Set<Object> objects =  stringRedisTemplate.opsForHash().keys("redmap");//["a","b"]
	 
	// 获得map的value列表
    List<Object> objects = stringRedisTemplate.opsForHash().values("redmap");//["d","d"]
	
	// 获取map对象大小
    Long size =  stringRedisTemplate.opsForHash().size("redmap"); //2

8、Redis Set:

	//向指定key中存放set集合(String k,String... vs)
	Long stringRedisTemplate.opsForSet().add("redset","1","2","3");//3
	
	//根据key获取set集合(String k)
	Set<String> stringRedisTemplate.opsForSet().members("redset");//["1","2","3"]

	//根据key查看set集合中是否存在指定数据
	boolean stringRedisTemplate.opsForSet().isMember("redset","1");//true
	
	//根据key删除指定的value(String k,Object... objects)
    //2,当所有的value均被删除,redset这个key注销
	Long stringRedisTemplate.opsForSet().remove("redset","1","2");

Redis客户端工具下载:

Redis Desktop Manager

Another Redis Desktop Manager   (集群环境推荐使用)


如果本篇文章对你有帮助的话,很高兴能够帮助上你。

当然,如果你觉得文章有什么让你觉得不合理、或者有更简单的实现方法又或者有理解不来的地方,希望你在看到之后能够在评论里指出来,我会在看到之后尽快的回复你。

猜你喜欢

转载自blog.csdn.net/chenthe1/article/details/131018318