spring使用RedisTemplate操作Redis数据库的案例
小编给大家分享一下spring使用RedisTemplate操作Redis数据库的案例,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!
一.什么是Redis
Redis是一个非关系型数据库,具有很高的存取性能,一般用作缓存数据库,减少正常存储数据库的压力。
Redis可以存储键与5种不同数据结构类型之间的映射,这5种数据结构类型分别为String(字符串)、List(列表)、Set(集合)、Hash(散列)和 Zset(有序集合)。
下面来对这5种数据结构类型作简单的介绍:
二.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进行了实现。
注意 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类型的数据操作
RedisTemplate中定义了对5种数据结构操作
redisTemplate.opsForValue();//操作字符串redisTemplate.opsForHash();//操作hashredisTemplate.opsForList();//操作listredisTemplate.opsForSet();//操作setredisTemplate.opsForZSet();//操作有序set
其实这里的ops相当于options, 是RedisTemplate对各种不同的Redis数据类型进行操作。其实还有另外的方法:
redistempalate.boundValueOpsredistempalate.boundSetOpsredistempalate.boundListOpsredistempalate.boundHashOpsredistempalate.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数据库的具体例子
值类型操作:
@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(locations="classpath:spring/applicationContext-redis.xml")public class TestValue {@Autowiredprivate RedisTemplate redisTemplate;@Testpublic void setValue(){//存值,针对值类型,ops相当于optionsredisTemplate.boundValueOps("name").set("itcast");}@Testpublic void getValue(){String str = (String) redisTemplate.boundValueOps("name").get();System.out.println(str);}@Testpublic void deleteValue(){redisTemplate.delete("name");}}
集合类型操作之Set类型,无序,即存取顺序不一定相同
@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(locations="classpath:spring/applicationContext-redis.xml")public class TestSet {@Autowiredprivate RedisTemplate redisTemplate;@Testpublic void setValue(){redisTemplate.boundSetOps("nameset").add("曹操");redisTemplate.boundSetOps("nameset").add("刘备");redisTemplate.boundSetOps("nameset").add("孙权");}@Testpublic void getValue(){Set members = redisTemplate.boundSetOps("nameset").members();System.out.println(members);}@Testpublic void deleteValue(){redisTemplate.boundSetOps("nameset").remove("孙权");}@Testpublic void deleteAllValue(){redisTemplate.delete("nameset");}}
输出结果:[孙权, 刘备, 曹操],此外,set类型的元素也不可重复。当set没有值的时候,会返回一个[]
List类型操作
list类型分为两种,一种是左压栈,一种是右压栈
右压栈:
@Testpublic void testSetValue1(){redisTemplate.boundListOps("namelist1").rightPush("刘备");redisTemplate.boundListOps("namelist1").rightPush("关羽");redisTemplate.boundListOps("namelist1").rightPush("张飞");}@Testpublic void testGetValue1(){List list = redisTemplate.boundListOps("namelist1").range(0, 10);System.out.println(list);}
运行结果:[刘备, 关羽, 张飞],元素可以重复
左压栈:
@Testpublic void testSetValue2(){redisTemplate.boundListOps("namelist2").leftPush("刘备");redisTemplate.boundListOps("namelist2").leftPush("关羽");redisTemplate.boundListOps("namelist2").leftPush("张飞");}@Testpublic void testGetValue2(){List list = redisTemplate.boundListOps("namelist2").range(0, 10);System.out.println(list);}
运行结果:[张飞, 关羽, 刘备]
根据索引查询元素
@Testpublic void testSearchByIndex(){String s = (String) redisTemplate.boundListOps("namelist1").index(1);System.out.println(s);}
运行结果:返回索引为1的元素移除某个元素的值
@Testpublic void testRemoveByIndex(){redisTemplate.boundListOps("namelist1").remove(1, "关羽");}
这里表示移除一个“关羽”。
Hash类型操作
@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的区别
两者的关系是StringRedisTemplate继承RedisTemplate。
两者的数据是不共通的;也就是说StringRedisTemplate只能管理StringRedisTemplate里面的数据,RedisTemplate只能管理RedisTemplate中的数据。
SDR默认采用的序列化策略有两种,一种是String的序列化策略,一种是JDK的序列化策略。
StringRedisTemplate默认采用的是String的序列化策略,保存的key和value都是采用此策略序列化保存的。
RedisTemplate默认采用的是JDK的序列化策略,保存的key和value都是采用此策略序列化保存的。
RedisTemplate使用的序列类在在操作数据的时候,比如说存入数据会将数据先序列化成字节数组然后在存入Redis数据库,这个时候打开Redis查看的时候,你会看到你的数据不是以可读的形式展现的,而是以字节数组显示,类似下面
当然从Redis获取数据的时候也会默认将数据当做字节数组转化,这样就会导致一个问题,当需要获取的数据不是以字节数组存在redis当中而是正常的可读的字符串的时候,比如说下面这种形式的数据
看完了这篇文章,相信你对“spring使用RedisTemplate操作Redis数据库的案例”有了一定的了解,如果想了解更多相关知识,欢迎关注编程网行业资讯频道,感谢各位的阅读!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341