服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - spring使用RedisTemplate操作Redis数据库

spring使用RedisTemplate操作Redis数据库

2021-08-29 12:45striveb Java教程

这篇文章主要介绍了spring使用RedisTemplate操作Redis数据库,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一.什么是redis

redis是一个非关系型数据库,具有很高的存取性能,一般用作缓存数据库,减少正常存储数据库的压力。

redis可以存储键与5种不同数据结构类型之间的映射,这5种数据结构类型分别为string(字符串)、list(列表)、set(集合)、hash(散列)和 zset(有序集合)。

下面来对这5种数据结构类型作简单的介绍:

spring使用RedisTemplate操作Redis数据库

二.redistemplate及其相关方法

1.redistemplate

spring封装了redistemplate对象来进行对redis的各种操作,它支持所有的redis原生的api。redistemplate位于spring-data-redis包下。redistemplate提供了redis各种操作、异常处理及序列化,支持发布订阅,并对spring 3.1 cache进行了实现。redistemplate提供了redis各种操作、异常处理及序列化,支持发布订阅,并对spring 3.1 cache进行了实现。redistemplate提供了redis各种操作、异常处理及序列化,支持发布订阅,并对spring 3.1 cache进行了实现。redistemplate提供了redis各种操作、异常处理及序列化,支持发布订阅,并对spring 3.1 cache进行了实现。

spring使用RedisTemplate操作Redis数据库

注意 redistemplate是一个key和value都是泛型的模板类,一般情况下key为string类型,如:redistemplate<string,object>。

此外,如果没特殊情况,切勿定义成redistemplate<object, object>,否则根据里氏替换原则,使用的时候会造成类型错误 。

spring-data-redis针对jedis提供了如下功能:
           1.连接池自动管理,提供了一个高度封装的“redistemplate”类
           2.针对jedis客户端中大量api进行了归类封装,将同一类型操作封装为operation接口
           valueoperations:简单k-v操作
           setoperations:set类型数据操作
           zsetoperations:zset类型数据操作
           hashoperations:针对map类型的数据操作
           listoperations:针对list类型的数据操作

2.redistemplate中定义了对5种数据结构操作

?
1
2
3
4
5
redistemplate.opsforvalue();//操作字符串
redistemplate.opsforhash();//操作hash
redistemplate.opsforlist();//操作list
redistemplate.opsforset();//操作set
redistemplate.opsforzset();//操作有序set

其实这里的ops相当于options, 是redistemplate对各种不同的redis数据类型进行操作。其实还有另外的方法:

?
1
2
3
4
5
redistempalate.boundvalueops
redistempalate.boundsetops
redistempalate.boundlistops
redistempalate.boundhashops
redistempalate.boundzsetops

opsforxxx和boundxxxops的区别?

xxx为value的类型,前者获取一个operator,但是没有指定操作的对象(key),可以在一个连接(事务)内操作多个key以及对应的value;后者获取了一个指定操作对象(key)的operator,在一个连接(事务)内只能操作这个key对应的value。

关于计数的api(increment)有一个bug,需要各位使用中注意,通过increment计数以后,通过get方式获取计数值的时候可能会抛出eof异常(和本地的jdk以及redis的编译版本有关),可以考虑使用boundvalueops(key).get(0,-1)获取计数值。

三.redistemplate操作redis数据库的具体例子

1.值类型操作:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@runwith(springjunit4classrunner.class)
@contextconfiguration(locations="classpath:spring/applicationcontext-redis.xml")
public class testvalue {
    @autowired
    private redistemplate redistemplate;   
    @test
    public void setvalue(){
//存值,针对值类型,ops相当于options
        redistemplate.boundvalueops("name").set("itcast");     
    }  
    @test
    public void getvalue(){
        string str = (string) redistemplate.boundvalueops("name").get();
        system.out.println(str);
    }  
    @test
    public void deletevalue(){
        redistemplate.delete("name");
    }  
}

2.集合类型操作之set类型,无序,即存取顺序不一定相同

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
@runwith(springjunit4classrunner.class)
@contextconfiguration(locations="classpath:spring/applicationcontext-redis.xml")
public class testset {
    
    @autowired
    private redistemplate redistemplate;
    
    /**
     * 存入值
     */
    @test
    public void setvalue(){
        redistemplate.boundsetops("nameset").add("曹操");    
        redistemplate.boundsetops("nameset").add("刘备");
        redistemplate.boundsetops("nameset").add("孙权");
    }
    
    /**
     * 提取值
     */
    @test
    public void getvalue(){
        set members = redistemplate.boundsetops("nameset").members();
        system.out.println(members);
    }
    
    /**
     * 删除集合中的某一个值
     */
    @test
    public void deletevalue(){
        redistemplate.boundsetops("nameset").remove("孙权");
    }
    
    /**
     * 删除整个集合
     */
    @test
    public void deleteallvalue(){
        redistemplate.delete("nameset");
    }
}

输出结果:[孙权, 刘备, 曹操],此外,set类型的元素也不可重复。当set没有值的时候,会返回一个[]

3.list类型操作

list类型分为两种,一种是左压栈,一种是右压栈

右压栈:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
 * 右压栈:后添加的对象排在后边,相当于队列,相当于先进先出
 */
@test
public void testsetvalue1(){       
    redistemplate.boundlistops("namelist1").rightpush("刘备");
    redistemplate.boundlistops("namelist1").rightpush("关羽");
    redistemplate.boundlistops("namelist1").rightpush("张飞");       
}
 
/**
 * 显示右压栈集合,range 表示查询的索引,从第几个查到第几个,如果想查询所有的数的话只能将第二个数写得大一点。
 */
@test
public void testgetvalue1(){
    list list = redistemplate.boundlistops("namelist1").range(0, 10);
    system.out.println(list);
}

运行结果:[刘备, 关羽, 张飞],元素可以重复

左压栈:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
 * 左压栈:后添加的对象排在前边,相当于栈,先进后出
 */
@test
public void testsetvalue2(){       
    redistemplate.boundlistops("namelist2").leftpush("刘备");
    redistemplate.boundlistops("namelist2").leftpush("关羽");
    redistemplate.boundlistops("namelist2").leftpush("张飞");    
}
 
/**
 * 显示左压栈集合
 */
@test
public void testgetvalue2(){
    list list = redistemplate.boundlistops("namelist2").range(0, 10);
    system.out.println(list);
}

运行结果:[张飞, 关羽, 刘备]

根据索引查询元素

?
1
2
3
4
5
6
7
8
/**
 * 查询集合某个元素
 */
@test
public void testsearchbyindex(){
    string s = (string) redistemplate.boundlistops("namelist1").index(1);
    system.out.println(s);
}

运行结果:返回索引为1的元素移除某个元素的值

?
1
2
3
4
5
6
7
/**
 * 移除集合某个元素,其中remove中第一个参数是移除的个数
 */
@test
public void testremovebyindex(){
    redistemplate.boundlistops("namelist1").remove(1, "关羽");
}

这里表示移除一个“关羽”。 

4.hash类型操作

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
@runwith(springjunit4classrunner.class)
@contextconfiguration(locations = "classpath:spring/applicationcontext-redis.xml")
public class testhash {
  @autowired
  private redistemplate redistemplate;
 
  //  存值
  @test
  public void testsetvalue() {
    redistemplate.boundhashops("namehash").put("a", "唐僧");
    redistemplate.boundhashops("namehash").put("b", "悟空");
    redistemplate.boundhashops("namehash").put("c", "八戒");
    redistemplate.boundhashops("namehash").put("d", "沙僧");
  }
 
  //获取所有的key
  @test
  public void testgetkeys() {
    set s = redistemplate.boundhashops("namehash").keys();
    system.out.println(s);
  }
 
  //  获取所有的value
  @test
  public void testgetvalues() {
    list values = redistemplate.boundhashops("namehash").values();
    system.out.println(values);
  }
 
  //  根据key获取值
  @test
  public void testgetvaluebykey() {
    object object = redistemplate.boundhashops("namehash").get("b");
    system.out.println(object);
  }
 
  //根据key移除值
  @test
  public void testremovevaluebykey() {
    redistemplate.boundhashops("namehash").delete("c");
  }
 
}

四.redistemplate和stringredistemplate的区别

1. 两者的关系是stringredistemplate继承redistemplate。

2. 两者的数据是不共通的;也就是说stringredistemplate只能管理stringredistemplate里面的数据,redistemplate只能管理redistemplate中的数据。

3. sdr默认采用的序列化策略有两种,一种是string的序列化策略,一种是jdk的序列化策略。

stringredistemplate默认采用的是string的序列化策略,保存的key和value都是采用此策略序列化保存的。

redistemplate默认采用的是jdk的序列化策略,保存的key和value都是采用此策略序列化保存的。

redistemplate使用的序列类在在操作数据的时候,比如说存入数据会将数据先序列化成字节数组然后在存入redis数据库,这个时候打开redis查看的时候,你会看到你的数据不是以可读的形式展现的,而是以字节数组显示,类似下面

spring使用RedisTemplate操作Redis数据库

当然从redis获取数据的时候也会默认将数据当做字节数组转化,这样就会导致一个问题,当需要获取的数据不是以字节数组存在redis当中而是正常的可读的字符串的时候,比如说下面这种形式的数据

spring使用RedisTemplate操作Redis数据库

相关连接:https://www.cnblogs.com/easonjim/p/7803067.html

到此这篇关于spring使用redistemplate操作redis数据库的文章就介绍到这了,更多相关spring使用redistemplate操作redis内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/striveb/article/details/83745680

延伸 · 阅读

精彩推荐
  • Java教程小米推送Java代码

    小米推送Java代码

    今天小编就为大家分享一篇关于小米推送Java代码,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧...

    富贵稳中求8032021-07-12
  • Java教程20个非常实用的Java程序代码片段

    20个非常实用的Java程序代码片段

    这篇文章主要为大家分享了20个非常实用的Java程序片段,对java开发项目有所帮助,感兴趣的小伙伴们可以参考一下 ...

    lijiao5352020-04-06
  • Java教程Java8中Stream使用的一个注意事项

    Java8中Stream使用的一个注意事项

    最近在工作中发现了对于集合操作转换的神器,java8新特性 stream,但在使用中遇到了一个非常重要的注意点,所以这篇文章主要给大家介绍了关于Java8中S...

    阿杜7472021-02-04
  • Java教程Java实现抢红包功能

    Java实现抢红包功能

    这篇文章主要为大家详细介绍了Java实现抢红包功能,采用多线程模拟多人同时抢红包,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙...

    littleschemer13532021-05-16
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    这篇文章主要介绍了Java使用SAX解析xml的示例,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程升级IDEA后Lombok不能使用的解决方法

    升级IDEA后Lombok不能使用的解决方法

    最近看到提示IDEA提示升级,寻思已经有好久没有升过级了。升级完毕重启之后,突然发现好多错误,本文就来介绍一下如何解决,感兴趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程Java BufferWriter写文件写不进去或缺失数据的解决

    Java BufferWriter写文件写不进去或缺失数据的解决

    这篇文章主要介绍了Java BufferWriter写文件写不进去或缺失数据的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望...

    spcoder14552021-10-18
  • Java教程xml与Java对象的转换详解

    xml与Java对象的转换详解

    这篇文章主要介绍了xml与Java对象的转换详解的相关资料,需要的朋友可以参考下...

    Java教程网2942020-09-17