访问数据Redis中数据——RedisTemplate类
2019-08-07 18:09
1231 查看
Redis 数据结构简介
Redis 可以存储键与5种不同数据结构类型之间的映射,这5种数据结构类型分别为String(字符串)、List(列表)、Set(集合)、Hash(散列)和 Zset(有序集合)。
RedisTemplate介绍
模板中的Redis key的类型(通常为String)如:RedisTemplate<String, Object>
注意:
如果没特殊情况,切勿定义成RedisTemplate<Object, Object>
RedisTemplate中定义了对5种数据结构操作
redisTemplate.opsForValue(); //操作字符串 redisTemplate.opsForHash(); //操作hash redisTemplate.opsForList(); //操作list redisTemplate.opsForSet(); //操作set redisTemplate.opsForZSet(); //操作有序set
StringRedisTemplate与RedisTemplate
- 两者的关系是StringRedisTemplate继承RedisTemplate。
- 两者的数据是不共通的;也就是说StringRedisTemplate只能管理StringRedisTemplate里面的数据,RedisTemplate只能管理RedisTemplate中的数据。
- SDR默认采用的序列化策略有两种,一种是String的序列化策略,一种是JDK的序列化策略。
- StringRedisTemplate默认采用的是String的序列化策略,保存的key和value都是采用此策略序列化保存的。
- RedisTemplate默认采用的是JDK的序列化策略,保存的key和value都是采用此策略序列化保存的。
RedisTemplate配置如下:
@Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) { RedisTemplate<String, Object> template = new RedisTemplate<String, Object>(); // 配置连接工厂 template.setConnectionFactory(factory); //使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式) Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper om = new ObjectMapper(); // 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(om); // 值采用json序列化 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; }
Redis的String数据结构 (推荐使用StringRedisTemplate)
注意:如果使用RedisTemplate需要更改序列化方式
RedisSerializer<String> stringSerializer = new StringRedisSerializer(); template.setKeySerializer(stringSerializer ); template.setValueSerializer(stringSerializer ); template.setHashKeySerializer(stringSerializer ); template.setHashValueSerializer(stringSerializer );
ValueOperations可以对String数据结构进行操作:
- set void set(K key, V value);
使用:redisTemplate.opsForValue().set("name","tom"); 结果:redisTemplate.opsForValue().get("name") 输出结果为tom
- set void set(K key, V value, long timeout, TimeUnit unit);
使用:redisTemplate.opsForValue().set("name","tom",10, TimeUnit.SECONDS); 结果:redisTemplate.opsForValue().get("name")由于设置的是10秒失效,十秒之内查询有结果,十秒之后返回为null
- set void set(K key, V value, long offset);
该方法是用 value 参数覆写(overwrite)给定 key 所储存的字符串值,从偏移量 offset 开始
使用:template.opsForValue().set("key","hello world"); template.opsForValue().set("key","redis", 6); System.out.println("***************"+template.opsForValue().get("key")); 结果:***************hello redis
- setIfAbsent Boolean setIfAbsent(K key, V value);
判断key是否之前存在
使用:System.out.println(template.opsForValue().setIfAbsent("multi1","multi1"));//false multi1之前已经存在 System.out.println(template.opsForValue().setIfAbsent("multi111","multi111"));//true multi111之前不存在 结果:false true
- multiSet void multiSet(Map<? extends K, ? extends V> m);
为多个键分别设置它们的值
使用:Map<String,String> maps = new HashMap<String, String>(); maps.put("multi1","multi1"); maps.put("multi2","multi2"); maps.put("multi3","multi3"); template.opsForValue().multiSet(maps); List<String> keys = new ArrayList<String>(); keys.add("multi1"); keys.add("multi2"); keys.add("multi3"); System.out.println(template.opsForValue().multiGet(keys)); 结果:[multi1, multi2, multi3]
- Boolean multiSetIfAbsent(Map<? extends K, ? extends V> m);
为多个键分别设置它们的值,如果存在则返回false,不存在返回true
使用:Map<String,String> maps = new HashMap<String, String>(); maps.put("multi11","multi11"); maps.put("multi22","multi22"); maps.put("multi33","multi33"); Map<String,String> maps2 = new HashMap<String, String>(); maps2.put("multi1","multi1"); maps2.put("multi2","multi2"); maps2.put("multi3","multi3"); System.out.println(template.opsForValue().multiSetIfAbsent(maps)); System.out.println(template.opsForValue().multiSetIfAbsent(maps2)); 结果:true false
- get V get(Object key);
使用:template.opsForValue().set("key","hello world"); System.out.println("***************"+template.opsForValue().get("key")); 结果:***************hello world
- getAndSet V getAndSet(K key, V value);
设置键的字符串值并返回其旧值
使用:template.opsForValue().set("getSetTest","test"); System.out.println(template.opsForValue().getAndSet("getSetTest","test2")); 结果:test
- multiGet List multiGet(Collection keys);
为多个键分别取出它们的值
使用:Map<String,String> maps = new HashMap<String, String>(); maps.put("multi1","multi1"); maps.put("multi2","multi2"); maps.put("multi3","multi3"); template.opsForValue().multiSet(maps); List<String> keys = new ArrayList<String>(); keys.add("multi1"); keys.add("multi2"); keys.add("multi3"); System.out.println(template.opsForValue().multiGet(keys)); 结果:[multi1, multi2, multi3]
- append Integer append(K key, String value);
如果key已经存在并且是一个字符串,则该命令将该值追加到字符串的末尾。如果键不存在,则它被创建并设置为空字符串,因此APPEND在这种特殊情况下将类似于SET。
使用:template.opsForValue().append("appendTest","Hello"); System.out.println(template.opsForValue().get("appendTest")); template.opsForValue().append("appendTest","world"); System.out.println(template.opsForValue().get("appendTest")); 结果:Hello Helloworld
- get String get(K key, long start, long end);
截取key所对应的value字符串
使用:appendTest对应的value为Helloworld System.out.println("*********"+template.opsForValue().get("appendTest",0,5)); 结果:*********Hellow 使用:System.out.println("*********"+template.opsForValue().get("appendTest",0,-1)); 结果:*********Helloworld 使用:System.out.println("*********"+template.opsForValue().get("appendTest",-3,-1)); 结果:*********rld
- size Long size(K key);
返回key所对应的value值得长度
使用:template.opsForValue().set("key","hello world"); System.out.println("***************"+template.opsForValue().size("key")); 结果:***************11
- setBit Boolean setBit(K key, long offset, boolean value);
对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)
key键对应的值value对应的ascii码,在offset的位置(从左向右数)变为value
使用:template.opsForValue().set("bitTest","a"); // 'a' 的ASCII码是 97。转换为二进制是:01100001 // 'b' 的ASCII码是 98 转换为二进制是:01100010 // 'c' 的ASCII码是 99 转换为二进制是:01100011 //因为二进制只有0和1,在setbit中true为1,false为0,因此我要变为'b'的话第六位设置为1,第七位设置为0 template.opsForValue().setBit("bitTest",6, true); template.opsForValue().setBit("bitTest",7, false); System.out.println(template.opsForValue().get("bitTest")); 结果:b
- getBit Boolean getBit(K key, long offset);
获取键对应值的ascii码的在offset处位值
使用:System.out.println(template.opsForValue().getBit("bitTest",7)); 结果:false
相关文章推荐
- 使用Rest访问Redis中的数据
- Redis学习9之在discuz的文件里加入redis数据库计访问数
- 巧用redis位图存储亿级数据与访问
- C++访问Redis的mset 二进制数据接口封装方案
- springboot【11】数据访问之NoSQL数据库redis
- Java使用jedis对redis数据进行访问操作
- SpringBoot (十一) :数据访问springboot整合redis高性能缓存_一点课堂(多岸学院)
- SpringBoot27-spingboot数据访问-NoSQL(Redis)
- 既然redis是单线程模型,,怎么会出现并发访问操作同一份数据呢?
- 如何使用RedisTemplate访问Redis数据结构
- 同步访问共享数据【Effective java第10章】
- [置顶] redis开启远程访问
- thinkphp笔记-访问数据
- redis数据类型详解
- 大数据架构开发 挖掘分析 Hadoop HBase Hive Storm Spark Java Flume ZooKeeper Kafka Redis MongoDB 机器学习 云计算 视频教程
- Redis和DB数据不一致解决方案
- Redis_01_初识Redis(五种数据结构浅解析)
- 利用指针访问私有数据成员
- SharePoint服务器端对象模型 之 访问网站和列表数据(Part 2)
- JQuery Ajax通过Handler访问外部XML数据的代码